feat(inventory): 优化订单执行编辑功能及出库详情展示

- 将订单执行编辑页改为弹窗形式,提升用户体验
- 重命名组件属性 id 为 orderId,增强代码可读性
- 监听 orderId 属性变化以动态加载数据
- 调整操作列宽度避免按钮挤压
- 更新出库单详情接口并调整数据结构处理方式
- 优化订单详情抽屉和出库详情组件的显示尺寸
- 重构订单信息展示组件,使用表格布局替代表单项
- 统一弹窗和抽屉的样式与交互逻辑
- 添加编辑成功和取消事件回调处理
- 修复表单验证规则及相关字段绑定问题
dev_1.0.0
chenhao 2025-11-21 14:17:54 +08:00
parent 281fa1f4e5
commit f236c22d7f
8 changed files with 230 additions and 305 deletions

View File

@ -105,3 +105,10 @@ export function confirmOuterStatus(id, orderCode) {
data: { id, outerStatus: '2', orderCode }
})
}
// 确认出库
export function getOuter(id) {
return request({
url: '/inventory/outer/vue/view/'+id,
method: 'get'
})
}

View File

@ -1,260 +1,122 @@
<template>
<el-row class="order-info-display">
<el-col :span="16">
<div class="col-item-border">
<el-form-item label="项目名称" prop="projectName">
<span>{{ displayValue(localOrderData.projectName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="版本号" prop="versionCode">
<span>{{ displayValue(localOrderData.versionCode) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="项目编号" prop="projectCode">
<span>{{ displayValue(localOrderData.projectCode) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="16">
<div class="col-item-border">
<el-form-item label="最终客户" prop="customerName">
<span>{{ displayValue(localOrderData.customerName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="BG" prop="bgProperty">
<span>{{ displayValue(getDictLabel(bgOptions, localOrderData.bgProperty)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="行业" prop="industryType">
<span>{{ displayValue(getDictLabel(industryOptions, localOrderData.industryType)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="代表处" prop="agentName">
<span>{{ displayValue(localOrderData.agentName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="进货商接口人" prop="businessPerson">
<span>{{ displayValue(localOrderData.businessPerson) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="Email" prop="businessEmail">
<span>{{ displayValue(localOrderData.businessEmail) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="联系方式" prop="businessPhone">
<span>{{ displayValue(localOrderData.businessPhone) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="合同编号" prop="orderCode">
<span>{{ displayValue(localOrderData.orderCode) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="16">
<div class="col-item-border">
<el-form-item label="执行单截止时间" prop="orderEndTime">
<span>{{ displayValue(localOrderData.orderEndTime) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="币种" prop="currencyType">
<span>{{ displayValue(getDictLabel(currencyOptions, localOrderData.currencyType)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col
v-if="(localOrderData.processTemplate=='1' ||(localOrderData.processTemplate!='1' &&( localOrderData.orderStatus=='1'||localOrderData.orderStatus=='2')))"
:span="8">
<div class="col-item-border">
<el-form-item label="总代进货金额" prop="actualPurchaseAmount">
<span>{{ displayValue(localOrderData.actualPurchaseAmount) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="(localOrderData.processTemplate=='1' ||(localOrderData.processTemplate!='1' &&( localOrderData.orderStatus=='1'||localOrderData.orderStatus=='2')))?8:16">
<div class="col-item-border">
<el-form-item label="总代出货金额" prop="shipmentAmount">
<span>{{ displayValue(localOrderData.shipmentAmount) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="要求到货时间" prop="deliveryTime">
<span>{{ displayValue(localOrderData.deliveryTime) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="16">
<div class="col-item-border">
<el-form-item label="公司直发" prop="companyDelivery">
<span>{{ displayValue(getDictLabel(companyDeliveryOptions, localOrderData.companyDelivery)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="下单通路" prop="orderChannel">
<span>{{ displayValue(localOrderData.orderChannel === '1' ? '总代' : '直签') }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8" v-if="localOrderData.orderChannel == '1'">
<div class="col-item-border">
<el-form-item label="总代" prop="zd">
<span>广州佳都技术有限公司</span>
</el-form-item>
</div>
</el-col>
<el-col :span="localOrderData.orderChannel == '2' ? 16 : 8">
<div class="col-item-border">
<el-form-item label="供货商" prop="supplier">
<span>{{ displayValue(localOrderData.supplier) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="汇智责任人" prop="dutyName">
<span>{{ displayValue(localOrderData.dutyName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="Email" prop="dutyEmail">
<span>{{ displayValue(localOrderData.dutyEmail) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="联系方式" prop="dutyPhone">
<span>{{ displayValue(localOrderData.dutyPhone) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="16">
<div class="col-item-border">
<el-form-item label="进货商" prop="partnerName">
<span>{{ displayValue(localOrderData.partnerName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="进货商类型" prop="level">
<span>{{ displayValue(getDictLabel(partnerLevelOptions, localOrderData.level)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="进货商联系人" prop="partnerUserName">
<span>{{ displayValue(localOrderData.partnerUserName) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="Email" prop="partnerEmail">
<span>{{ displayValue(localOrderData.partnerEmail) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="联系方式" prop="partnerPhone">
<span>{{ displayValue(localOrderData.partnerPhone) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="24">
<div class="col-item-border">
<el-form-item label="收货地址" prop="notifierAddress">
<span>{{ displayValue(localOrderData.notifierAddress) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="收货人" prop="notifier">
<span>{{ displayValue(localOrderData.notifier) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="Email" prop="notifierEmail">
<span>{{ displayValue(localOrderData.notifierEmail) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="联系方式" prop="notifierPhone">
<span>{{ displayValue(localOrderData.notifierPhone) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="付款方式" prop="paymentMethod">
<span>{{ displayValue(getPaymentMethodLabel(localOrderData.paymentMethod)) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="8">
<div class="col-item-border">
<el-form-item label="付款比例" prop="paymentRatio">
<span>{{ displayValue(localOrderData.paymentRatio, true) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="24">
<div class="col-item-border">
<el-form-item label="付款条件" prop="paymentDescription">
<span style="white-space: pre-wrap;">{{ displayValue(localOrderData.paymentDescription) }}</span>
</el-form-item>
</div>
</el-col>
<el-col :span="24">
<div class="col-item-border">
<el-form-item label="其他特别说明" prop="remark">
<span>{{ displayValue(localOrderData.remark) }}</span>
</el-form-item>
</div>
</el-col>
</el-row>
<div class="order-info-display">
<table class="info-table">
<tbody>
<tr>
<td class="label-cell">项目名称</td>
<td class="value-cell" colspan="3">{{ displayValue(localOrderData.projectName) }}</td>
<td class="label-cell">版本号</td>
<td class="value-cell">{{ displayValue(localOrderData.versionCode) }}</td>
</tr>
<tr>
<td class="label-cell">项目编号</td>
<td class="value-cell">{{ displayValue(localOrderData.projectCode) }}</td>
<td class="label-cell">最终客户</td>
<td class="value-cell" colspan="3">{{ displayValue(localOrderData.customerName) }}</td>
</tr>
<tr>
<td class="label-cell">BG</td>
<td class="value-cell">{{ displayValue(getDictLabel(bgOptions, localOrderData.bgProperty)) }}</td>
<td class="label-cell">行业</td>
<td class="value-cell">{{ displayValue(getDictLabel(industryOptions, localOrderData.industryType)) }}</td>
<td class="label-cell">代表处</td>
<td class="value-cell">{{ displayValue(localOrderData.agentName) }}</td>
</tr>
<tr>
<td class="label-cell">进货商接口人</td>
<td class="value-cell">{{ displayValue(localOrderData.businessPerson) }}</td>
<td class="label-cell">Email</td>
<td class="value-cell">{{ displayValue(localOrderData.businessEmail) }}</td>
<td class="label-cell">联系方式</td>
<td class="value-cell">{{ displayValue(localOrderData.businessPhone) }}</td>
</tr>
<tr>
<td class="label-cell">合同编号</td>
<td class="value-cell">{{ displayValue(localOrderData.orderCode) }}</td>
<td class="label-cell">执行单截止时间</td>
<td class="value-cell">{{ displayValue(localOrderData.orderEndTime) }}</td>
<td class="label-cell">币种</td>
<td class="value-cell">{{ displayValue(getDictLabel(currencyOptions, localOrderData.currencyType)) }}</td>
</tr>
<tr>
<template v-if="(localOrderData.processTemplate=='1' ||(localOrderData.processTemplate!='1' &&( localOrderData.orderStatus=='1'||localOrderData.orderStatus=='2')))">
<td class="label-cell">总代进货金额</td>
<td class="value-cell">{{ displayValue(localOrderData.actualPurchaseAmount) }}</td>
</template>
<td class="label-cell">总代出货金额</td>
<td class="value-cell" :colspan="(localOrderData.processTemplate=='1' ||(localOrderData.processTemplate!='1' &&( localOrderData.orderStatus=='1'||localOrderData.orderStatus=='2')))?1:3">{{ displayValue(localOrderData.shipmentAmount) }}</td>
<td class="label-cell">要求到货时间</td>
<td class="value-cell">{{ displayValue(localOrderData.deliveryTime) }}</td>
</tr>
<tr>
<td class="label-cell">公司直发</td>
<td class="value-cell" colspan="3">{{ displayValue(getDictLabel(companyDeliveryOptions, localOrderData.companyDelivery)) }}</td>
<td class="label-cell">下单通路</td>
<td class="value-cell">{{ displayValue(localOrderData.orderChannel === '1' ? '总代' : '直签') }}</td>
</tr>
<tr>
<template v-if="localOrderData.orderChannel == '1'">
<td class="label-cell">总代</td>
<td class="value-cell">广州佳都技术有限公司</td>
</template>
<td class="label-cell">供货商</td>
<td class="value-cell" :colspan="localOrderData.orderChannel == '2' ? 3 : 1">{{ displayValue(localOrderData.supplier) }}</td>
<template v-if="localOrderData.orderChannel == '1'">
<td class="label-cell"></td>
<td class="value-cell"></td>
</template>
</tr>
<tr>
<td class="label-cell">汇智责任人</td>
<td class="value-cell">{{ displayValue(localOrderData.dutyName) }}</td>
<td class="label-cell">Email</td>
<td class="value-cell">{{ displayValue(localOrderData.dutyEmail) }}</td>
<td class="label-cell">联系方式</td>
<td class="value-cell">{{ displayValue(localOrderData.dutyPhone) }}</td>
</tr>
<tr>
<td class="label-cell">进货商</td>
<td class="value-cell" colspan="3">{{ displayValue(localOrderData.partnerName) }}</td>
<td class="label-cell">进货商类型</td>
<td class="value-cell">{{ displayValue(getDictLabel(partnerLevelOptions, localOrderData.level)) }}</td>
</tr>
<tr>
<td class="label-cell">进货商联系人</td>
<td class="value-cell">{{ displayValue(localOrderData.partnerUserName) }}</td>
<td class="label-cell">Email</td>
<td class="value-cell">{{ displayValue(localOrderData.partnerEmail) }}</td>
<td class="label-cell">联系方式</td>
<td class="value-cell">{{ displayValue(localOrderData.partnerPhone) }}</td>
</tr>
<tr>
<td class="label-cell">收货地址</td>
<td class="value-cell" colspan="5">{{ displayValue(localOrderData.notifierAddress) }}</td>
</tr>
<tr>
<td class="label-cell">收货人</td>
<td class="value-cell">{{ displayValue(localOrderData.notifier) }}</td>
<td class="label-cell">Email</td>
<td class="value-cell">{{ displayValue(localOrderData.notifierEmail) }}</td>
<td class="label-cell">联系方式</td>
<td class="value-cell">{{ displayValue(localOrderData.notifierPhone) }}</td>
</tr>
<tr>
<td class="label-cell">付款方式</td>
<td class="value-cell" colspan="3">{{ displayValue(getPaymentMethodLabel(localOrderData.paymentMethod)) }}</td>
<td class="label-cell">付款比例</td>
<td class="value-cell">{{ displayValue(localOrderData.paymentRatio, true) }}</td>
</tr>
<tr>
<td class="label-cell">付款条件</td>
<td class="value-cell" colspan="5" style="white-space: pre-wrap;">{{ displayValue(localOrderData.paymentDescription) }}</td>
</tr>
<tr>
<td class="label-cell">其他特别说明</td>
<td class="value-cell" colspan="5">{{ displayValue(localOrderData.remark) }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
@ -345,35 +207,34 @@ export default {
</script>
<style scoped>
/* Make form item labels bold to match table headers in other components */
.order-info-display ::v-deep .el-form-item__label {
.order-info-display {
width: 100%;
}
.info-table {
width: 100%;
border-collapse: collapse;
border: 1px solid #EBEEF5;
}
.info-table td {
padding: 8px 10px;
border: 1px solid #EBEEF5;
font-size: 13px;
line-height: 1.5;
}
.label-cell {
background-color: #f5f7fa;
font-weight: bold;
font-size: 13px; /* Ensure labels also have consistent font size */
color: #606266; /* Ensure labels also have consistent font color */
}
.order-info-display .el-form-item {
margin-bottom: 0; /* Reduced margin for a denser look */
display: flex;
align-items: center;
}
/* Adjust span line-height for better text appearance */
.order-info-display span {
color: #606266;
line-height: 1.5; /* Use a relative line-height instead of a fixed pixel value */
font-size: 13px; /* Apply consistent font size for values */
width: 12%;
text-align: left;
}
/* Adjust padding and borders for a cleaner, more table-like feel */
.col-item-border {
border: 1px solid #e0e0e0;
padding: 8px; /* Standardized padding */
margin-bottom: -1px; /* Collapse borders */
margin-right: -1px; /* Collapse borders */
}
.el-row {
margin-bottom: -1px;
.value-cell {
background-color: #fff;
color: #606266;
text-align: left;
}
</style>

View File

@ -1,6 +1,6 @@
<template>
<el-drawer :title="title" :visible.sync="open" size="1000px" append-to-body @close="cancel">
<el-form ref="form" :model="form" label-width="120px">
<el-drawer :title="title" :visible.sync="open" size="70%" append-to-body @close="cancel">
<el-form ref="form" :model="form" label-width="140px">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>出库单信息</span>
@ -96,8 +96,8 @@ export default {
this.open = true;
this.loading = true;
getOuter(id).then(response => {
this.form = response.data;
this.warehouseList = response.data.warehouseInfoList;
this.form = response.data.inventoryOuter;
this.warehouseList = this.form.detailList;
this.loading = false;
}).catch(() => {
this.loading = false;

View File

@ -60,7 +60,7 @@
<el-table-column label="联系人" prop="contactPerson" />
<el-table-column label="收货地址" prop="contactAddress" :show-overflow-tooltip="true" />
<el-table-column label="生成时间" prop="createTime" />
<el-table-column label="操作" align="center">
<el-table-column label="操作" align="center" min-width="150">
<template slot-scope="scope">
<div v-if="scope.row.outerStatus === '1' || scope.row.outerStatus === '4'">
<el-button size="mini" type="danger" @click="handleDeleteOuter(scope.row)"></el-button>
@ -98,10 +98,16 @@ export default {
name: "ExecutionEdit",
components: {OrderInfo, OrderDetailDrawer, CheckoutDialog, OuterDetailDialog },
dicts: ['bg_type', 'currency_type', 'company_delivery', 'identify_level', 'outer_outer_status'],
props: {
orderId: { // Renamed from id to orderId for clarity as it's an order ID
type: [String, Number],
required: true
}
},
data() {
return {
form: {},
currentOrderId:null,
currentOrderId: null,
rules: {
// Add validation rules based on the red asterisks in edit.html
businessPerson: [{ required: true, message: "进货商接口人不能为空", trigger: "blur" }],
@ -121,9 +127,23 @@ export default {
};
},
created() {
const id = this.$route.params && this.$route.params.id;
if (id) {
this.getExecutionDetails(id);
if (this.orderId) {
this.getExecutionDetails(this.orderId);
}
},
watch: {
orderId: { // Watch for changes in orderId prop
immediate: true,
handler(newVal) {
if (newVal) {
this.getExecutionDetails(newVal);
}
}
},
'form.bgProperty'(newVal) {
if(newVal) {
this.fetchIndustryOptions(newVal);
}
}
},
methods: {
@ -179,21 +199,14 @@ export default {
if (valid) {
updateExecution(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.cancel();
this.$emit('success');
});
}
});
},
cancel() {
this.$router.go(-1);
this.$emit('cancel');
}
},
watch: {
'form.bgProperty'(newVal) {
if(newVal) {
this.fetchIndustryOptions(newVal);
}
}
}
};
</script>

View File

@ -158,6 +158,16 @@
@pagination="getList"
/>
<!-- 编辑订单执行对话框 -->
<el-dialog title="编辑订单执行" :visible.sync="editDialogVisible" width="70vw" append-to-body destroy-on-close>
<edit
v-if="editDialogVisible"
:order-id="currentEditOrderId"
@success="handleEditSuccess"
@cancel="handleEditCancel"
/>
</el-dialog>
<!-- 签收文件上传对话框 -->
<el-dialog title="上传签收文件" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload
@ -196,12 +206,14 @@ import { listExecution, recallExecution, downloadSignFile } from "@/api/inventor
import { getToken } from "@/utils/auth";
import OrderDetailDrawer from '../../project/order/OrderDetailDrawer.vue';
import ProjectDetailDrawer from '../../project/info/ProjectDetailDrawer.vue';
import Edit from './edit.vue'; // Import the Edit component
export default {
name: "Execution",
components: {
ProjectDetailDrawer,
OrderDetailDrawer
OrderDetailDrawer,
Edit // Register the Edit component
},
dicts: ['execution_outer_status', 'execution_delivery_status', 'execution_sign_status'],
data() {
@ -216,6 +228,9 @@ export default {
executionList: [],
//
dateRange: [],
//
editDialogVisible: false,
currentEditOrderId: null,
// --- ---
projectDrawerVisible: false,
orderDrawerVisible: false,
@ -281,8 +296,17 @@ export default {
},
/** 编辑按钮操作 */
handleUpdate(row) {
//
this.$router.push("/inventory/execution/edit/" + row.id);
this.currentEditOrderId = row.id;
this.editDialogVisible = true;
},
/** 编辑成功后回调 */
handleEditSuccess() {
this.editDialogVisible = false;
this.getList(); // Refresh the list
},
/** 编辑取消后回调 */
handleEditCancel() {
this.editDialogVisible = false;
},
/** 签收按钮操作 */
handleSign(row) {
@ -334,3 +358,9 @@ export default {
}
};
</script>
<style>
.edit-dialog .el-dialog__body {
padding: 0px 20px 20px 20px !important;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<el-drawer :visible.sync="drawerVisible" title="出库单详情" direction="rtl" size="60%">
<el-drawer :visible.sync="drawerVisible" title="出库单详情" direction="rtl" size="70%">
<div style="padding: 20px;">
<el-descriptions :column="2" border>
<el-descriptions-item label="出库单号">{{ details.outerCode }}</el-descriptions-item>

View File

@ -1,7 +1,7 @@
<template>
<div>
<!-- 订单详情抽屉 -->
<el-drawer :title="title" :visible.sync="internalVisible" direction="rtl" size="1400px" @close="handleClose">
<el-drawer :title="title" :visible.sync="internalVisible" direction="rtl" size="70%" @close="handleClose">
<div style="padding: 20px;">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" :disabled="true">
<el-tabs v-model="activeTab">

View File

@ -11,8 +11,10 @@ import com.ruoyi.sip.dto.inventory.InventoryInfoExcelDto;
import com.ruoyi.sip.service.IInventoryAuthService;
import com.ruoyi.sip.service.IInventoryOuterService;
import com.ruoyi.sip.service.IOmsInventoryInnerService;
import com.ruoyi.sip.vo.OuterViewVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -85,6 +87,18 @@ public class VueInventoryOuterController extends BaseController
return toAjax(inventoryOuterService.updateInventoryOuter(inventoryOuter));
}
@GetMapping("/view/{id}")
@ResponseBody
public AjaxResult view(@PathVariable("id") Long id, ModelMap mmap)
{
OuterViewVo outerViewVo = inventoryOuterService.viewVo(id);
mmap.put("inventoryOuter", outerViewVo.getInventoryOuter());
mmap.put("allQuantity", outerViewVo.getAllQuantity());
mmap.put("commitQuantity", outerViewVo.getCommitQuantity());
return AjaxResult.success(mmap);
}
/**
*
*/