zhouhui.jiang

update 单据管理

...@@ -40,7 +40,7 @@ public class DeliveryAddReq { ...@@ -40,7 +40,7 @@ public class DeliveryAddReq {
40 @NotNull(message = "出库日期不能为空") 40 @NotNull(message = "出库日期不能为空")
41 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 41 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
42 @Schema(description = "出库日期", required = true) 42 @Schema(description = "出库日期", required = true)
43 - private LocalDateTime deliveryDate; 43 + private String deliveryDate;
44 44
45 @Schema(description = "出库状态(0-未出库/1-已出库)") 45 @Schema(description = "出库状态(0-未出库/1-已出库)")
46 private Integer deliveryStatus; 46 private Integer deliveryStatus;
......
...@@ -44,15 +44,9 @@ public class DeliveryMain { ...@@ -44,15 +44,9 @@ public class DeliveryMain {
44 @Schema(description = "出库状态(0-未出库/1-已出库)") 44 @Schema(description = "出库状态(0-未出库/1-已出库)")
45 private Integer deliveryStatus; 45 private Integer deliveryStatus;
46 46
47 - @Schema(description = "出库总金额")
48 - private BigDecimal totalAmount;
49 -
50 @Schema(description = "仓库编码") 47 @Schema(description = "仓库编码")
51 private String warehouseCode; 48 private String warehouseCode;
52 49
53 - @Schema(description = "仓库名称")
54 - private String warehouseName;
55 -
56 @Schema(description = "数据来源") 50 @Schema(description = "数据来源")
57 private String dataSource; 51 private String dataSource;
58 52
......
...@@ -111,6 +111,9 @@ public class DeliveryMainServiceImpl extends ServiceImpl<DeliveryMainMapper, Del ...@@ -111,6 +111,9 @@ public class DeliveryMainServiceImpl extends ServiceImpl<DeliveryMainMapper, Del
111 BeanUtils.copyProperties(addReq, deliveryMain); 111 BeanUtils.copyProperties(addReq, deliveryMain);
112 deliveryMain.setCreateTime(LocalDateTime.now()); 112 deliveryMain.setCreateTime(LocalDateTime.now());
113 deliveryMain.setUpdateTime(LocalDateTime.now()); 113 deliveryMain.setUpdateTime(LocalDateTime.now());
114 + if(StringUtils.hasText(addReq.getDeliveryDate())) {
115 + deliveryMain.setDeliveryDate(parseDateTime(addReq.getDeliveryDate()));
116 + }
114 deliveryMain.setDelFlag("0"); 117 deliveryMain.setDelFlag("0");
115 int insert = baseMapper.insert(deliveryMain); 118 int insert = baseMapper.insert(deliveryMain);
116 if (insert > 0) { 119 if (insert > 0) {
......
...@@ -35,12 +35,15 @@ VALUES ...@@ -35,12 +35,15 @@ VALUES
35 INSERT INTO t_sys_menu (menu_id, parent_id, menu_name, menu_type, path, icon, sort, status, perms, create_by, create_time, update_by, update_time, del_flag) 35 INSERT INTO t_sys_menu (menu_id, parent_id, menu_name, menu_type, path, icon, sort, status, perms, create_by, create_time, update_by, update_time, del_flag)
36 VALUES 36 VALUES
37 (301, 3, '出库查询', '2', '', '', 1, '1', 'delivery:list', 'admin', NOW(), 'admin', NOW(), '0'), 37 (301, 3, '出库查询', '2', '', '', 1, '1', 'delivery:list', 'admin', NOW(), 'admin', NOW(), '0'),
38 -(302, 3, '出库详情', '2', '', '', 2, '1', 'delivery:query', 'admin', NOW(), 'admin', NOW(), '0'), 38 +(302, 3, '出库新增', '2', '', '', 2, '1', 'delivery:add', 'admin', NOW(), 'admin', NOW(), '0'),
39 -(303, 3, '出库导出', '2', '', '', 3, '1', 'delivery:export', 'admin', NOW(), 'admin', NOW(), '0'), 39 +(303, 3, '出库修改', '2', '', '', 3, '1', 'delivery:edit', 'admin', NOW(), 'admin', NOW(), '0'),
40 -(304, 3, '出库统计', '2', '', '', 4, '1', 'delivery:statistics', 'admin', NOW(), 'admin', NOW(), '0'), 40 +(304, 3, '出库删除', '2', '', '', 4, '1', 'delivery:delete', 'admin', NOW(), 'admin', NOW(), '0'),
41 -(305, 3, '出库打印', '2', '', '', 5, '1', 'delivery:print', 'admin', NOW(), 'admin', NOW(), '0'), 41 +(305, 3, '出库详情', '2', '', '', 5, '1', 'delivery:detail', 'admin', NOW(), 'admin', NOW(), '0'),
42 -(306, 3, '出库确认', '2', '', '', 6, '1', 'delivery:confirm', 'admin', NOW(), 'admin', NOW(), '0'), 42 +(306, 3, '出库导出', '2', '', '', 6, '1', 'delivery:export', 'admin', NOW(), 'admin', NOW(), '0'),
43 -(307, 3, '出库撤销', '2', '', '', 7, '1', 'delivery:cancel', 'admin', NOW(), 'admin', NOW(), '0'); 43 +(307, 3, '出库统计', '2', '', '', 7, '1', 'delivery:statistics', 'admin', NOW(), 'admin', NOW(), '0'),
44 +(308, 3, '出库打印', '2', '', '', 8, '1', 'delivery:print', 'admin', NOW(), 'admin', NOW(), '0'),
45 +(309, 3, '出库确认', '2', '', '', 9, '1', 'delivery:confirm', 'admin', NOW(), 'admin', NOW(), '0'),
46 +(310, 3, '出库撤销', '2', '', '', 10, '1', 'delivery:cancel', 'admin', NOW(), 'admin', NOW(), '0');
44 47
45 -- ========================================= 48 -- =========================================
46 -- 3. 插入发票管理相关按钮权限 49 -- 3. 插入发票管理相关按钮权限
...@@ -78,7 +81,7 @@ AND del_flag = '0'; ...@@ -78,7 +81,7 @@ AND del_flag = '0';
78 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag) 81 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
79 SELECT @admin_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0' 82 SELECT @admin_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
80 FROM t_sys_menu 83 FROM t_sys_menu
81 -WHERE menu_id IN (301, 302, 303, 304, 305, 306, 307) 84 +WHERE menu_id IN (301, 302, 303, 304, 305, 306, 307, 308, 309, 310)
82 AND del_flag = '0'; 85 AND del_flag = '0';
83 86
84 -- 为ADMIN角色分配发票管理按钮权限 87 -- 为ADMIN角色分配发票管理按钮权限
...@@ -102,11 +105,11 @@ FROM t_sys_menu ...@@ -102,11 +105,11 @@ FROM t_sys_menu
102 WHERE menu_id IN (201, 202, 203, 205, 206, 207, 208, 209, 210) 105 WHERE menu_id IN (201, 202, 203, 205, 206, 207, 208, 209, 210)
103 AND del_flag = '0'; 106 AND del_flag = '0';
104 107
105 --- 为OPERATOR角色分配出库查询按钮权限 108 +-- 为OPERATOR角色分配出库查询按钮权限(除删除外)
106 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag) 109 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
107 SELECT @operator_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0' 110 SELECT @operator_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
108 FROM t_sys_menu 111 FROM t_sys_menu
109 -WHERE menu_id IN (301, 302, 303, 304, 305, 306, 307) 112 +WHERE menu_id IN (301, 302, 303, 305, 306, 307, 308, 309, 310)
110 AND del_flag = '0'; 113 AND del_flag = '0';
111 114
112 -- 为OPERATOR角色分配发票管理按钮权限(除删除外) 115 -- 为OPERATOR角色分配发票管理按钮权限(除删除外)
...@@ -130,11 +133,11 @@ FROM t_sys_menu ...@@ -130,11 +133,11 @@ FROM t_sys_menu
130 WHERE menu_id IN (201, 205, 206) 133 WHERE menu_id IN (201, 205, 206)
131 AND del_flag = '0'; 134 AND del_flag = '0';
132 135
133 --- 为DEALER_MANAGER角色分配出库查询按钮权限 136 +-- 为DEALER_MANAGER角色分配出库查询按钮权限(只读权限)
134 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag) 137 INSERT INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
135 SELECT @dealer_manager_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0' 138 SELECT @dealer_manager_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
136 FROM t_sys_menu 139 FROM t_sys_menu
137 -WHERE menu_id IN (301, 302, 303, 304, 305) 140 +WHERE menu_id IN (301, 305, 306, 307, 308)
138 AND del_flag = '0'; 141 AND del_flag = '0';
139 142
140 -- 为DEALER_MANAGER角色分配发票管理按钮权限(只读权限) 143 -- 为DEALER_MANAGER角色分配发票管理按钮权限(只读权限)
......
1 +-- Apple经销商ERP系统 - 修复出库新增权限
2 +-- 创建时间: 2025-01-27
3 +-- 版本: v1.0
4 +
5 +-- 设置数据库和字符集
6 +SET NAMES utf8mb4;
7 +SET FOREIGN_KEY_CHECKS = 0;
8 +
9 +-- 使用数据库
10 +USE apple_erp;
11 +
12 +-- =========================================
13 +-- 1. 添加缺失的出库新增权限
14 +-- =========================================
15 +
16 +-- 检查是否已存在出库新增权限
17 +SET @delivery_add_exists = (SELECT COUNT(*) FROM t_sys_menu WHERE perms = 'delivery:add' AND del_flag = '0');
18 +
19 +-- 如果不存在,则添加出库新增权限
20 +INSERT INTO t_sys_menu (menu_id, parent_id, menu_name, menu_type, path, icon, sort, status, perms, create_by, create_time, update_by, update_time, del_flag)
21 +SELECT 302, 3, '出库新增', '2', '', '', 2, '1', 'delivery:add', 'admin', NOW(), 'admin', NOW(), '0'
22 +WHERE @delivery_add_exists = 0;
23 +
24 +-- =========================================
25 +-- 2. 为所有角色分配出库新增权限
26 +-- =========================================
27 +
28 +-- 获取ADMIN角色ID
29 +SET @admin_role_id = (SELECT role_id FROM t_sys_role WHERE role_code = 'ADMIN' AND del_flag = '0' LIMIT 1);
30 +
31 +-- 为ADMIN角色分配出库新增权限
32 +INSERT IGNORE INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
33 +SELECT @admin_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
34 +FROM t_sys_menu
35 +WHERE perms = 'delivery:add' AND del_flag = '0';
36 +
37 +-- 获取OPERATOR角色ID
38 +SET @operator_role_id = (SELECT role_id FROM t_sys_role WHERE role_code = 'OPERATOR' AND del_flag = '0' LIMIT 1);
39 +
40 +-- 为OPERATOR角色分配出库新增权限
41 +INSERT IGNORE INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
42 +SELECT @operator_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
43 +FROM t_sys_menu
44 +WHERE perms = 'delivery:add' AND del_flag = '0';
45 +
46 +-- 获取DEALER_MANAGER角色ID
47 +SET @dealer_manager_role_id = (SELECT role_id FROM t_sys_role WHERE role_code = 'DEALER_MANAGER' AND del_flag = '0' LIMIT 1);
48 +
49 +-- 为DEALER_MANAGER角色分配出库新增权限
50 +INSERT IGNORE INTO t_sys_role_menu (role_id, menu_id, create_by, create_time, update_by, update_time, del_flag)
51 +SELECT @dealer_manager_role_id, menu_id, 'admin', NOW(), 'admin', NOW(), '0'
52 +FROM t_sys_menu
53 +WHERE perms = 'delivery:add' AND del_flag = '0';
54 +
55 +-- 重置外键检查
56 +SET FOREIGN_KEY_CHECKS = 1;
57 +
58 +-- 输出完成信息
59 +SELECT '出库新增权限修复完成!' AS message;
1 +import { request } from '../utils/request'
2 +
3 +// 出库相关类型定义
4 +export interface DeliveryInfo {
5 + deliveryId: number
6 + deliveryNo: string
7 + dealerCode: string
8 + dealerName: string
9 + orderNo: string
10 + deliveryDate: string
11 + deliveryStatus: number
12 + warehouseCode: string
13 + dataSource: string
14 + uploadTime?: string
15 + createBy?: string
16 + createTime?: string
17 + updateBy?: string
18 + updateTime?: string
19 + deliveryItems?: DeliveryItemInfo[]
20 +}
21 +
22 +export interface DeliveryItemInfo {
23 + itemId?: number
24 + deliveryId?: number
25 + productCode: string
26 + productName: string
27 + deliveryQty: number
28 + deliveryPrice: number
29 + deliveryAmount: number
30 +}
31 +
32 +export interface DeliveryQueryReq {
33 + deliveryNo?: string
34 + dealerCode?: string
35 + dealerName?: string
36 + deliveryStatus?: number
37 + warehouseCode?: string
38 + dataSource?: string
39 + deliveryStartDate?: string
40 + deliveryEndDate?: string
41 + minAmount?: number
42 + maxAmount?: number
43 + pageNum?: number
44 + pageSize?: number
45 +}
46 +
47 +export interface DeliveryAddReq {
48 + deliveryNo: string
49 + dealerCode: string
50 + dealerName: string
51 + orderNo: string
52 + deliveryDate: string
53 + deliveryStatus?: number
54 + warehouseCode: string
55 + dataSource?: string
56 + deliveryItems: DeliveryItemAddReq[]
57 +}
58 +
59 +export interface DeliveryItemAddReq {
60 + productCode: string
61 + productName: string
62 + deliveryQty: number
63 + deliveryPrice: number
64 + deliveryAmount: number
65 +}
66 +
67 +export interface DeliveryUpdateReq {
68 + deliveryId: number
69 + deliveryNo: string
70 + dealerCode: string
71 + dealerName: string
72 + orderNo: string
73 + deliveryDate: string
74 + deliveryStatus?: number
75 + warehouseCode: string
76 + dataSource?: string
77 + deliveryItems: DeliveryItemUpdateReq[]
78 +}
79 +
80 +export interface DeliveryItemUpdateReq {
81 + itemId?: number
82 + productCode: string
83 + productName: string
84 + deliveryQty: number
85 + deliveryPrice: number
86 + deliveryAmount: number
87 +}
88 +
89 +// 出库API接口
90 +export const deliveryApi = {
91 + // 分页查询出库列表
92 + getDeliveryList: (params: DeliveryQueryReq) => {
93 + return request.get('/api/delivery/list', params)
94 + },
95 +
96 + // 获取出库详情
97 + getDeliveryDetail: (deliveryId: number) => {
98 + return request.get(`/api/delivery/${deliveryId}`)
99 + },
100 +
101 + // 新增出库
102 + addDelivery: (data: DeliveryAddReq) => {
103 + return request.post('/api/delivery', data)
104 + },
105 +
106 + // 修改出库
107 + updateDelivery: (data: DeliveryUpdateReq) => {
108 + return request.post('/api/delivery/update', data)
109 + },
110 +
111 + // 删除出库
112 + deleteDelivery: (deliveryId: number) => {
113 + return request.delete(`/api/delivery/${deliveryId}`)
114 + },
115 +
116 + // 批量删除出库
117 + batchDeleteDeliveries: (deliveryIds: number[]) => {
118 + return request.post('/api/delivery/batchDelete', deliveryIds)
119 + },
120 +
121 + // 修改出库状态
122 + updateDeliveryStatus: (deliveryId: number, deliveryStatus: number) => {
123 + return request.post(`/api/delivery/${deliveryId}/deliveryStatus`, null, {
124 + params: { deliveryStatus }
125 + })
126 + }
127 +}
1 +import { request } from '../utils/request'
2 +
3 +export interface InvoiceInfo {
4 + invoiceId: number
5 + invoiceNo: string
6 + orderNo: string
7 + deliveryNo: string
8 + dealerCode: string
9 + dealerName: string
10 + totalAmount: number
11 + invoiceDate: string
12 + invoiceStatus: number
13 + taxRate: number
14 + dataSource: string
15 + uploadTime?: string
16 + createBy?: string
17 + createTime?: string
18 + updateBy?: string
19 + updateTime?: string
20 + invoiceItems?: InvoiceItemInfo[]
21 +}
22 +
23 +export interface InvoiceItemInfo {
24 + itemId: number
25 + invoiceId: number
26 + invoiceNo: string
27 + productCode: string
28 + productName: string
29 + productQty: number
30 + unitPrice: number
31 + itemAmount: number
32 + taxRate: number
33 + taxAmount: number
34 + createBy?: string
35 + createTime?: string
36 + updateBy?: string
37 + updateTime?: string
38 +}
39 +
40 +export interface InvoiceQueryReq {
41 + invoiceNo?: string
42 + orderNo?: string
43 + deliveryNo?: string
44 + dealerCode?: string
45 + dealerName?: string
46 + invoiceStatus?: number
47 + dataSource?: string
48 + invoiceStartDate?: string
49 + invoiceEndDate?: string
50 + pageNum: number
51 + pageSize: number
52 +}
53 +
54 +export interface InvoiceAddReq {
55 + invoiceNo: string
56 + orderNo: string
57 + deliveryNo: string
58 + dealerCode: string
59 + dealerName: string
60 + totalAmount: number
61 + invoiceDate: string
62 + invoiceStatus?: number
63 + taxRate: number
64 + dataSource?: string
65 + invoiceItems: InvoiceItemAddReq[]
66 +}
67 +
68 +export interface InvoiceUpdateReq {
69 + invoiceId: number
70 + invoiceNo: string
71 + orderNo: string
72 + deliveryNo: string
73 + dealerCode: string
74 + dealerName: string
75 + totalAmount: number
76 + invoiceDate: string
77 + invoiceStatus?: number
78 + taxRate: number
79 + dataSource?: string
80 + invoiceItems: InvoiceItemUpdateReq[]
81 +}
82 +
83 +export interface InvoiceItemAddReq {
84 + productCode: string
85 + productName: string
86 + productQty: number
87 + unitPrice: number
88 + itemAmount: number
89 + taxRate: number
90 + taxAmount: number
91 +}
92 +
93 +export interface InvoiceItemUpdateReq {
94 + itemId?: number
95 + productCode: string
96 + productName: string
97 + productQty: number
98 + unitPrice: number
99 + itemAmount: number
100 + taxRate: number
101 + taxAmount: number
102 +}
103 +
104 +export const invoiceApi = {
105 + getInvoiceList: (params: InvoiceQueryReq) => {
106 + return request.get('/api/invoice/list', params)
107 + },
108 + getInvoiceDetail: (invoiceId: number) => {
109 + return request.get(`/api/invoice/${invoiceId}`)
110 + },
111 + addInvoice: (data: InvoiceAddReq) => {
112 + return request.post('/api/invoice', data)
113 + },
114 + updateInvoice: (data: InvoiceUpdateReq) => {
115 + return request.post('/api/invoice/update', data)
116 + },
117 + deleteInvoice: (invoiceId: number) => {
118 + return request.delete(`/api/invoice/${invoiceId}`)
119 + },
120 + batchDeleteInvoices: (invoiceIds: number[]) => {
121 + return request.post('/api/invoice/batchDelete', invoiceIds)
122 + },
123 + updateInvoiceStatus: (invoiceId: number, invoiceStatus: number) => {
124 + return request.post(`/api/invoice/${invoiceId}/invoiceStatus`, null, {
125 + params: { invoiceStatus }
126 + })
127 + }
128 +}
...@@ -103,7 +103,7 @@ export interface OrderItemUpdateReq { ...@@ -103,7 +103,7 @@ export interface OrderItemUpdateReq {
103 export const orderApi = { 103 export const orderApi = {
104 // 分页查询订单列表 104 // 分页查询订单列表
105 getOrderList: (params: OrderQueryReq) => { 105 getOrderList: (params: OrderQueryReq) => {
106 - return request.get('/order/list', { params }) 106 + return request.get('/order/list', params)
107 }, 107 },
108 108
109 // 获取订单详情 109 // 获取订单详情
......
...@@ -86,25 +86,25 @@ ...@@ -86,25 +86,25 @@
86 <table class="data-table"> 86 <table class="data-table">
87 <thead> 87 <thead>
88 <tr> 88 <tr>
89 - <th>单ID</th> 89 + <th>出库单ID</th>
90 - <th class="sortable">单编号 ↕️</th> 90 + <th class="sortable">出库单编号 ↕️</th>
91 <th>经销商编码</th> 91 <th>经销商编码</th>
92 <th>经销商名称</th> 92 <th>经销商名称</th>
93 - <th>订单日期</th> 93 + <th>出库日期</th>
94 - <th>订单金额</th> 94 + <th>关联订单编号</th>
95 <th>出库状态</th> 95 <th>出库状态</th>
96 <th>出库时间</th> 96 <th>出库时间</th>
97 <th>操作</th> 97 <th>操作</th>
98 </tr> 98 </tr>
99 </thead> 99 </thead>
100 <tbody> 100 <tbody>
101 - <tr v-for="order in orderList" :key="order.orderId"> 101 + <tr v-for="order in orderList" :key="order.deliveryId">
102 - <td>{{ order.orderId }}</td> 102 + <td>{{ order.deliveryId }}</td>
103 - <td>{{ order.orderNo }}</td> 103 + <td>{{ order.deliveryNo }}</td>
104 <td>{{ order.dealerCode }}</td> 104 <td>{{ order.dealerCode }}</td>
105 <td>{{ order.dealerName }}</td> 105 <td>{{ order.dealerName }}</td>
106 - <td>{{ formatDate(order.orderDate) }}</td> 106 + <td>{{ formatDate(order.deliveryDate) }}</td>
107 - <td>{{ formatCurrency(order.totalAmount) }}</td> 107 + <td>{{ order.orderNo }}</td>
108 <td> 108 <td>
109 <span :class="getDeliveryStatusClass(order.deliveryStatus)"> 109 <span :class="getDeliveryStatusClass(order.deliveryStatus)">
110 {{ getDeliveryStatusText(order.deliveryStatus) }} 110 {{ getDeliveryStatusText(order.deliveryStatus) }}
...@@ -113,6 +113,7 @@ ...@@ -113,6 +113,7 @@
113 <td>{{ formatTime(order.uploadTime || '') }}</td> 113 <td>{{ formatTime(order.uploadTime || '') }}</td>
114 <td class="action-col"> 114 <td class="action-col">
115 <button @click="handleView(order)" class="view-btn">👁️ 查看</button> 115 <button @click="handleView(order)" class="view-btn">👁️ 查看</button>
116 + <button @click="handleDelete(order)" class="delete-btn">🗑️ 删除</button>
116 </td> 117 </td>
117 </tr> 118 </tr>
118 </tbody> 119 </tbody>
...@@ -298,6 +299,7 @@ ...@@ -298,6 +299,7 @@
298 v-model="addFormData.deliveryDate" 299 v-model="addFormData.deliveryDate"
299 class="form-input" 300 class="form-input"
300 type="datetime-local" 301 type="datetime-local"
302 + step="1"
301 required 303 required
302 /> 304 />
303 </div> 305 </div>
...@@ -409,13 +411,13 @@ ...@@ -409,13 +411,13 @@
409 411
410 <script setup lang="ts"> 412 <script setup lang="ts">
411 import { ref, reactive, computed, onMounted } from 'vue' 413 import { ref, reactive, computed, onMounted } from 'vue'
412 -import { orderApi, type OrderInfo, type OrderQueryReq } from '../../api/order' 414 +import { deliveryApi, type DeliveryAddReq, type DeliveryInfo, type DeliveryQueryReq } from '../../api/delivery'
413 415
414 // 响应式数据 416 // 响应式数据
415 const loading = ref(false) 417 const loading = ref(false)
416 -const orderList = ref<OrderInfo[]>([]) 418 +const orderList = ref<DeliveryInfo[]>([])
417 const showDetailDialog = ref(false) 419 const showDetailDialog = ref(false)
418 -const orderDetail = ref<OrderInfo | null>(null) 420 +const orderDetail = ref<DeliveryInfo | null>(null)
419 421
420 // 新增出库相关数据 422 // 新增出库相关数据
421 const showAddDialog = ref(false) 423 const showAddDialog = ref(false)
...@@ -433,12 +435,14 @@ const addFormData = reactive({ ...@@ -433,12 +435,14 @@ const addFormData = reactive({
433 435
434 // 搜索参数 436 // 搜索参数
435 const searchParams = reactive({ 437 const searchParams = reactive({
436 - orderNo: '', 438 + deliveryNo: '',
437 dealerCode: '', 439 dealerCode: '',
438 dealerName: '', 440 dealerName: '',
439 deliveryStatus: undefined, 441 deliveryStatus: undefined,
440 - startDate: '', 442 + warehouseCode: '',
441 - endDate: '', 443 + dataSource: '',
444 + deliveryStartDate: '',
445 + deliveryEndDate: '',
442 pageNum: 1, 446 pageNum: 1,
443 pageSize: 10 447 pageSize: 10
444 }) 448 })
...@@ -511,7 +515,7 @@ const fetchOrders = async () => { ...@@ -511,7 +515,7 @@ const fetchOrders = async () => {
511 try { 515 try {
512 loading.value = true 516 loading.value = true
513 const params = { ...searchParams, pageNum: pagination.pageNum, pageSize: pagination.pageSize } 517 const params = { ...searchParams, pageNum: pagination.pageNum, pageSize: pagination.pageSize }
514 - const response = await orderApi.getOrderList(params) as any 518 + const response = await deliveryApi.getDeliveryList(params) as any
515 console.log('出库查询API响应:', response) 519 console.log('出库查询API响应:', response)
516 520
517 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data 521 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data
...@@ -551,13 +555,13 @@ const handleReset = () => { ...@@ -551,13 +555,13 @@ const handleReset = () => {
551 fetchOrders() 555 fetchOrders()
552 } 556 }
553 557
554 -const handleView = async (order: OrderInfo) => { 558 +const handleView = async (order: DeliveryInfo) => {
555 try { 559 try {
556 - const response = await orderApi.getOrderDetail(order.orderId) as any 560 + const response = await deliveryApi.getDeliveryDetail(order.deliveryId) as any
557 console.log('出库查询详情API响应:', response) 561 console.log('出库查询详情API响应:', response)
558 562
559 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data 563 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data
560 - if (response && response.orderId) { 564 + if (response && response.deliveryId) {
561 orderDetail.value = response 565 orderDetail.value = response
562 showDetailDialog.value = true 566 showDetailDialog.value = true
563 } else { 567 } else {
...@@ -569,6 +573,19 @@ const handleView = async (order: OrderInfo) => { ...@@ -569,6 +573,19 @@ const handleView = async (order: OrderInfo) => {
569 } 573 }
570 } 574 }
571 575
576 +const handleDelete = async (order: DeliveryInfo) => {
577 + if (confirm(`确定要删除出库单"${order.deliveryNo}"吗?`)) {
578 + try {
579 + await deliveryApi.deleteDelivery(order.deliveryId)
580 + showMessage('删除出库单成功', 'success')
581 + fetchOrders() // 刷新列表
582 + } catch (error) {
583 + console.error('删除出库单失败:', error)
584 + showMessage('删除出库单失败, 请重试', 'error')
585 + }
586 + }
587 +}
588 +
572 589
573 const handleExport = () => { 590 const handleExport = () => {
574 showMessage('导出功能开发中...', 'warning') 591 showMessage('导出功能开发中...', 'warning')
...@@ -618,11 +635,36 @@ const calculateDeliveryItemTotal = (index: number) => { ...@@ -618,11 +635,36 @@ const calculateDeliveryItemTotal = (index: number) => {
618 635
619 const handleSubmitAdd = async () => { 636 const handleSubmitAdd = async () => {
620 try { 637 try {
621 - // 这里应该调用新增出库的API 638 + // 处理日期时间格式,将datetime-local格式转换为后端需要的格式
622 - // await deliveryApi.addDelivery(addFormData) 639 + let formattedDeliveryDate = addFormData.deliveryDate
623 - showMessage('新增出库功能开发中...', 'warning') 640 + if (formattedDeliveryDate && formattedDeliveryDate.includes('T')) {
641 + // 将 YYYY-MM-DDTHH:MM:SS 格式转换为 YYYY-MM-DD HH:MM:SS 格式
642 + formattedDeliveryDate = formattedDeliveryDate.replace('T', ' ')
643 + }
644 +
645 + // 构造新增出库的请求数据
646 + const deliveryData: DeliveryAddReq = {
647 + deliveryNo: addFormData.deliveryNo,
648 + dealerCode: addFormData.dealerCode,
649 + dealerName: addFormData.dealerName,
650 + orderNo: addFormData.orderNo,
651 + deliveryDate: formattedDeliveryDate,
652 + deliveryStatus: 1, // 默认已出库
653 + warehouseCode: addFormData.warehouseCode,
654 + dataSource: addFormData.dataSource || '系统录入',
655 + deliveryItems: addFormData.deliveryItems.map(item => ({
656 + productCode: item.productCode,
657 + productName: item.productName,
658 + deliveryQty: item.deliveryQty,
659 + deliveryPrice: item.deliveryPrice,
660 + deliveryAmount: item.deliveryAmount
661 + }))
662 + }
663 +
664 + await deliveryApi.addDelivery(deliveryData)
665 + showMessage('新增出库成功', 'success')
624 closeAddDialog() 666 closeAddDialog()
625 - // fetchOrders() // 刷新列表 667 + fetchOrders() // 刷新列表
626 } catch (error) { 668 } catch (error) {
627 console.error('新增出库失败:', error) 669 console.error('新增出库失败:', error)
628 showMessage('新增出库失败, 请重试', 'error') 670 showMessage('新增出库失败, 请重试', 'error')
...@@ -891,6 +933,11 @@ onMounted(() => { ...@@ -891,6 +933,11 @@ onMounted(() => {
891 color: white; 933 color: white;
892 } 934 }
893 935
936 +.delete-btn {
937 + background: #dc3545;
938 + color: white;
939 +}
940 +
894 .status-btn { 941 .status-btn {
895 background: #28a745; 942 background: #28a745;
896 color: white; 943 color: white;
......
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
4 <div class="search-section"> 4 <div class="search-section">
5 <div class="search-row"> 5 <div class="search-row">
6 <div class="search-item"> 6 <div class="search-item">
7 + <label>发票编号:</label>
8 + <input
9 + v-model="searchParams.invoiceNo"
10 + class="search-input"
11 + placeholder="请输入发票编号"
12 + />
13 + </div>
14 + <div class="search-item">
7 <label>订单编号:</label> 15 <label>订单编号:</label>
8 <input 16 <input
9 v-model="searchParams.orderNo" 17 v-model="searchParams.orderNo"
...@@ -38,17 +46,17 @@ ...@@ -38,17 +46,17 @@
38 </div> 46 </div>
39 <div class="search-row"> 47 <div class="search-row">
40 <div class="search-item"> 48 <div class="search-item">
41 - <label>开始日期:</label> 49 + <label>开票开始日期:</label>
42 <input 50 <input
43 - v-model="searchParams.startDate" 51 + v-model="searchParams.invoiceStartDate"
44 class="search-input" 52 class="search-input"
45 type="date" 53 type="date"
46 /> 54 />
47 </div> 55 </div>
48 <div class="search-item"> 56 <div class="search-item">
49 - <label>结束日期:</label> 57 + <label>开票结束日期:</label>
50 <input 58 <input
51 - v-model="searchParams.endDate" 59 + v-model="searchParams.invoiceEndDate"
52 class="search-input" 60 class="search-input"
53 type="date" 61 type="date"
54 /> 62 />
...@@ -65,8 +73,6 @@ ...@@ -65,8 +73,6 @@
65 <div class="action-buttons"> 73 <div class="action-buttons">
66 <button @click="handleAdd" class="action-btn primary">✨ 新增发票</button> 74 <button @click="handleAdd" class="action-btn primary">✨ 新增发票</button>
67 <button @click="handleExport" class="action-btn secondary">📋 导出</button> 75 <button @click="handleExport" class="action-btn secondary">📋 导出</button>
68 - <button @click="handlePrint" class="action-btn secondary">🖨️ 打印</button>
69 - <button @click="handleStatistics" class="action-btn secondary">📊 统计</button>
70 </div> 76 </div>
71 </div> 77 </div>
72 78
...@@ -88,40 +94,36 @@ ...@@ -88,40 +94,36 @@
88 <table class="data-table"> 94 <table class="data-table">
89 <thead> 95 <thead>
90 <tr> 96 <tr>
91 - <th>订单ID</th> 97 + <th>发票ID</th>
92 - <th class="sortable">订单编号 ↕️</th> 98 + <th class="sortable">发票编号 ↕️</th>
93 <th>经销商编码</th> 99 <th>经销商编码</th>
94 <th>经销商名称</th> 100 <th>经销商名称</th>
95 - <th>订单日期</th> 101 + <th>开票日期</th>
96 - <th>订单金额</th> 102 + <th>发票金额</th>
97 <th>开票状态</th> 103 <th>开票状态</th>
98 <th>开票时间</th> 104 <th>开票时间</th>
99 - <th>发票号码</th> 105 + <th>关联订单编号</th>
100 <th>操作</th> 106 <th>操作</th>
101 </tr> 107 </tr>
102 </thead> 108 </thead>
103 <tbody> 109 <tbody>
104 - <tr v-for="order in orderList" :key="order.orderId"> 110 + <tr v-for="order in orderList" :key="order.invoiceId">
105 - <td>{{ order.orderId }}</td> 111 + <td>{{ order.invoiceId }}</td>
106 - <td>{{ order.orderNo }}</td> 112 + <td>{{ order.invoiceNo }}</td>
107 <td>{{ order.dealerCode }}</td> 113 <td>{{ order.dealerCode }}</td>
108 <td>{{ order.dealerName }}</td> 114 <td>{{ order.dealerName }}</td>
109 - <td>{{ formatDate(order.orderDate) }}</td> 115 + <td>{{ formatDate(order.invoiceDate) }}</td>
110 <td>{{ formatCurrency(order.totalAmount) }}</td> 116 <td>{{ formatCurrency(order.totalAmount) }}</td>
111 <td> 117 <td>
112 <span :class="getInvoiceStatusClass(order.invoiceStatus)"> 118 <span :class="getInvoiceStatusClass(order.invoiceStatus)">
113 {{ getInvoiceStatusText(order.invoiceStatus) }} 119 {{ getInvoiceStatusText(order.invoiceStatus) }}
114 </span> 120 </span>
115 </td> 121 </td>
116 - <td>{{ formatTime('') }}</td> 122 + <td>{{ formatTime(order.uploadTime || '') }}</td>
117 - <td>{{ '-' }}</td> 123 + <td>{{ order.orderNo }}</td>
118 <td class="action-col"> 124 <td class="action-col">
119 <button @click="handleView(order)" class="view-btn">👁️ 查看</button> 125 <button @click="handleView(order)" class="view-btn">👁️ 查看</button>
120 <button @click="handleEdit(order)" class="edit-btn">✏️ 编辑</button> 126 <button @click="handleEdit(order)" class="edit-btn">✏️ 编辑</button>
121 - <button @click="handleInvoiceStatus(order)" class="status-btn">
122 - {{ order.invoiceStatus === 0 ? '开票' : '撤销开票' }}
123 - </button>
124 - <button @click="handlePrintInvoice(order)" class="print-btn">🖨️ 打印</button>
125 </td> 127 </td>
126 </tr> 128 </tr>
127 </tbody> 129 </tbody>
...@@ -275,24 +277,47 @@ ...@@ -275,24 +277,47 @@
275 </div> 277 </div>
276 <div class="dialog-body"> 278 <div class="dialog-body">
277 <div v-if="invoiceDetail" class="detail-content"> 279 <div v-if="invoiceDetail" class="detail-content">
280 + <!-- 发票基本信息 -->
278 <div class="detail-section"> 281 <div class="detail-section">
279 <h4>发票基本信息</h4> 282 <h4>发票基本信息</h4>
280 <div class="detail-grid"> 283 <div class="detail-grid">
281 <div class="detail-item"> 284 <div class="detail-item">
282 - <label>订单编号:</label> 285 + <label>发票ID:</label>
283 - <span>{{ invoiceDetail.orderNo }}</span> 286 + <span>{{ invoiceDetail.invoiceId }}</span>
284 </div> 287 </div>
285 <div class="detail-item"> 288 <div class="detail-item">
286 - <label>发票号码:</label> 289 + <label>发票编号:</label>
287 <span>{{ invoiceDetail.invoiceNo }}</span> 290 <span>{{ invoiceDetail.invoiceNo }}</span>
288 </div> 291 </div>
289 <div class="detail-item"> 292 <div class="detail-item">
293 + <label>关联订单编号:</label>
294 + <span>{{ invoiceDetail.orderNo }}</span>
295 + </div>
296 + <div class="detail-item">
297 + <label>关联出库单编号:</label>
298 + <span>{{ invoiceDetail.deliveryNo || '-' }}</span>
299 + </div>
300 + <div class="detail-item">
301 + <label>经销商编码:</label>
302 + <span>{{ invoiceDetail.dealerCode }}</span>
303 + </div>
304 + <div class="detail-item">
305 + <label>经销商名称:</label>
306 + <span>{{ invoiceDetail.dealerName }}</span>
307 + </div>
308 + <div class="detail-item">
290 <label>开票日期:</label> 309 <label>开票日期:</label>
291 <span>{{ formatDate(invoiceDetail.invoiceDate) }}</span> 310 <span>{{ formatDate(invoiceDetail.invoiceDate) }}</span>
292 </div> 311 </div>
293 <div class="detail-item"> 312 <div class="detail-item">
294 - <label>开票金额:</label> 313 + <label>开票状态:</label>
295 - <span>{{ formatCurrency(invoiceDetail.invoiceAmount) }}</span> 314 + <span :class="getInvoiceStatusClass(invoiceDetail.invoiceStatus)">
315 + {{ getInvoiceStatusText(invoiceDetail.invoiceStatus) }}
316 + </span>
317 + </div>
318 + <div class="detail-item">
319 + <label>发票总金额:</label>
320 + <span class="amount-text">{{ formatCurrency(invoiceDetail.totalAmount) }}</span>
296 </div> 321 </div>
297 <div class="detail-item"> 322 <div class="detail-item">
298 <label>税率:</label> 323 <label>税率:</label>
...@@ -300,20 +325,72 @@ ...@@ -300,20 +325,72 @@
300 </div> 325 </div>
301 <div class="detail-item"> 326 <div class="detail-item">
302 <label>税额:</label> 327 <label>税额:</label>
303 - <span>{{ formatCurrency(invoiceDetail.taxAmount) }}</span> 328 + <span class="amount-text">{{ formatCurrency((invoiceDetail.totalAmount || 0) * (invoiceDetail.taxRate || 0)) }}</span>
304 </div> 329 </div>
305 <div class="detail-item"> 330 <div class="detail-item">
306 - <label>开票状态:</label> 331 + <label>数据来源:</label>
307 - <span :class="getInvoiceStatusClass(invoiceDetail.invoiceStatus)"> 332 + <span>{{ invoiceDetail.dataSource || '-' }}</span>
308 - {{ getInvoiceStatusText(invoiceDetail.invoiceStatus) }} 333 + </div>
309 - </span> 334 + <div class="detail-item">
335 + <label>上传时间:</label>
336 + <span>{{ formatTime(invoiceDetail.uploadTime || '') }}</span>
337 + </div>
338 + <div class="detail-item">
339 + <label>创建时间:</label>
340 + <span>{{ formatTime(invoiceDetail.createTime || '') }}</span>
310 </div> 341 </div>
311 <div class="detail-item"> 342 <div class="detail-item">
312 - <label>备注:</label> 343 + <label>更新时间:</label>
313 - <span>{{ invoiceDetail.remark || '-' }}</span> 344 + <span>{{ formatTime(invoiceDetail.updateTime || '') }}</span>
314 </div> 345 </div>
315 </div> 346 </div>
316 </div> 347 </div>
348 +
349 + <!-- 发票明细信息 -->
350 + <div v-if="invoiceDetail.invoiceItems && invoiceDetail.invoiceItems.length > 0" class="detail-section">
351 + <h4>发票明细信息</h4>
352 + <div class="detail-table-container">
353 + <table class="detail-table">
354 + <thead>
355 + <tr>
356 + <th>产品编码</th>
357 + <th>产品名称</th>
358 + <th>数量</th>
359 + <th>单价</th>
360 + <th>金额</th>
361 + <th>税率</th>
362 + <th>税额</th>
363 + </tr>
364 + </thead>
365 + <tbody>
366 + <tr v-for="item in invoiceDetail.invoiceItems" :key="item.itemId">
367 + <td>{{ item.productCode }}</td>
368 + <td>{{ item.productName }}</td>
369 + <td>{{ item.productQty }}</td>
370 + <td>{{ formatCurrency(item.unitPrice) }}</td>
371 + <td class="amount-text">{{ formatCurrency(item.itemAmount) }}</td>
372 + <td>{{ item.taxRate ? (item.taxRate * 100).toFixed(2) + '%' : '-' }}</td>
373 + <td class="amount-text">{{ formatCurrency(item.taxAmount || 0) }}</td>
374 + </tr>
375 + </tbody>
376 + <tfoot>
377 + <tr class="total-row">
378 + <td colspan="4" class="total-label">合计:</td>
379 + <td class="amount-text total-amount">{{ formatCurrency(invoiceDetail.totalAmount) }}</td>
380 + <td>-</td>
381 + <td class="amount-text total-amount">{{ formatCurrency((invoiceDetail.totalAmount || 0) * (invoiceDetail.taxRate || 0)) }}</td>
382 + </tr>
383 + </tfoot>
384 + </table>
385 + </div>
386 + </div>
387 +
388 + <!-- 操作按钮 -->
389 + <div class="detail-actions">
390 + <button @click="handleEdit(invoiceDetail)" class="edit-btn">✏️ 编辑</button>
391 + <button @click="handlePrintInvoice(invoiceDetail)" class="print-btn">🖨️ 打印</button>
392 + <button @click="closeDetailDialog" class="close-btn">关闭</button>
393 + </div>
317 </div> 394 </div>
318 </div> 395 </div>
319 </div> 396 </div>
...@@ -323,24 +400,27 @@ ...@@ -323,24 +400,27 @@
323 400
324 <script setup lang="ts"> 401 <script setup lang="ts">
325 import { ref, reactive, computed, onMounted } from 'vue' 402 import { ref, reactive, computed, onMounted } from 'vue'
326 -import { orderApi, type OrderInfo, type OrderQueryReq } from '../../api/order' 403 +import { invoiceApi, type InvoiceInfo, type InvoiceQueryReq } from '../../api/invoice'
327 404
328 // 响应式数据 405 // 响应式数据
329 const loading = ref(false) 406 const loading = ref(false)
330 -const orderList = ref<OrderInfo[]>([]) 407 +const orderList = ref<InvoiceInfo[]>([])
331 const showDialog = ref(false) 408 const showDialog = ref(false)
332 const showDetailDialog = ref(false) 409 const showDetailDialog = ref(false)
333 const isEdit = ref(false) 410 const isEdit = ref(false)
334 -const invoiceDetail = ref<any>(null) 411 +const invoiceDetail = ref<InvoiceInfo | null>(null)
335 412
336 // 搜索参数 413 // 搜索参数
337 const searchParams = reactive({ 414 const searchParams = reactive({
415 + invoiceNo: '',
338 orderNo: '', 416 orderNo: '',
417 + deliveryNo: '',
339 dealerCode: '', 418 dealerCode: '',
340 dealerName: '', 419 dealerName: '',
341 invoiceStatus: undefined, 420 invoiceStatus: undefined,
342 - startDate: '', 421 + dataSource: '',
343 - endDate: '', 422 + invoiceStartDate: '',
423 + invoiceEndDate: '',
344 pageNum: 1, 424 pageNum: 1,
345 pageSize: 10 425 pageSize: 10
346 }) 426 })
...@@ -424,7 +504,7 @@ const fetchOrders = async () => { ...@@ -424,7 +504,7 @@ const fetchOrders = async () => {
424 try { 504 try {
425 loading.value = true 505 loading.value = true
426 const params = { ...searchParams, pageNum: pagination.pageNum, pageSize: pagination.pageSize } 506 const params = { ...searchParams, pageNum: pagination.pageNum, pageSize: pagination.pageSize }
427 - const response = await orderApi.getOrderList(params) as any 507 + const response = await invoiceApi.getInvoiceList(params) as any
428 console.log('发票管理API响应:', response) 508 console.log('发票管理API响应:', response)
429 509
430 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data 510 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data
...@@ -453,12 +533,15 @@ const handleSearch = () => { ...@@ -453,12 +533,15 @@ const handleSearch = () => {
453 533
454 const handleReset = () => { 534 const handleReset = () => {
455 Object.assign(searchParams, { 535 Object.assign(searchParams, {
536 + invoiceNo: '',
456 orderNo: '', 537 orderNo: '',
538 + deliveryNo: '',
457 dealerCode: '', 539 dealerCode: '',
458 dealerName: '', 540 dealerName: '',
459 invoiceStatus: undefined, 541 invoiceStatus: undefined,
460 - startDate: '', 542 + dataSource: '',
461 - endDate: '' 543 + invoiceStartDate: '',
544 + invoiceEndDate: ''
462 }) 545 })
463 pagination.pageNum = 1 546 pagination.pageNum = 1
464 fetchOrders() 547 fetchOrders()
...@@ -478,12 +561,12 @@ const handleAdd = () => { ...@@ -478,12 +561,12 @@ const handleAdd = () => {
478 showDialog.value = true 561 showDialog.value = true
479 } 562 }
480 563
481 -const handleEdit = (order: OrderInfo) => { 564 +const handleEdit = (order: InvoiceInfo) => {
482 isEdit.value = true 565 isEdit.value = true
483 Object.assign(formData, { 566 Object.assign(formData, {
484 orderNo: order.orderNo, 567 orderNo: order.orderNo,
485 - invoiceNo: (order as any).invoiceNo || '', 568 + invoiceNo: order.invoiceNo,
486 - invoiceDate: (order as any).invoiceTime || '', 569 + invoiceDate: order.invoiceDate,
487 invoiceAmount: order.totalAmount, 570 invoiceAmount: order.totalAmount,
488 taxRate: 0, 571 taxRate: 0,
489 taxAmount: 0, 572 taxAmount: 0,
...@@ -492,13 +575,13 @@ const handleEdit = (order: OrderInfo) => { ...@@ -492,13 +575,13 @@ const handleEdit = (order: OrderInfo) => {
492 showDialog.value = true 575 showDialog.value = true
493 } 576 }
494 577
495 -const handleView = async (order: OrderInfo) => { 578 +const handleView = async (order: InvoiceInfo) => {
496 try { 579 try {
497 - const response = await orderApi.getOrderDetail(order.orderId) as any 580 + const response = await invoiceApi.getInvoiceDetail(order.invoiceId) as any
498 console.log('发票管理详情API响应:', response) 581 console.log('发票管理详情API响应:', response)
499 582
500 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data 583 // 由于request.ts的响应拦截器已经处理了code=200的情况,直接返回data
501 - if (response && response.orderId) { 584 + if (response && response.invoiceId) {
502 invoiceDetail.value = response 585 invoiceDetail.value = response
503 showDetailDialog.value = true 586 showDetailDialog.value = true
504 } else { 587 } else {
...@@ -510,36 +593,16 @@ const handleView = async (order: OrderInfo) => { ...@@ -510,36 +593,16 @@ const handleView = async (order: OrderInfo) => {
510 } 593 }
511 } 594 }
512 595
513 -const handleInvoiceStatus = async (order: OrderInfo) => {
514 - const newStatus = order.invoiceStatus === 0 ? 1 : 0
515 - const action = newStatus === 1 ? '开票' : '撤销开票'
516 - if (confirm(`确定要${action}订单"${order.orderNo}"吗?`)) {
517 - try {
518 - await orderApi.updateInvoiceStatus(order.orderId, newStatus)
519 - showMessage(`${action}成功`, 'success')
520 - fetchOrders()
521 - } catch (error) {
522 - console.error(`${action}失败:`, error)
523 - showMessage(`${action}失败, 请重试`, 'error')
524 - }
525 - }
526 -}
527 596
528 const handleExport = () => { 597 const handleExport = () => {
529 showMessage('导出功能开发中...', 'warning') 598 showMessage('导出功能开发中...', 'warning')
530 } 599 }
531 600
532 -const handlePrint = () => { 601 +const handlePrintInvoice = (invoice: InvoiceInfo) => {
533 showMessage('打印功能开发中...', 'warning') 602 showMessage('打印功能开发中...', 'warning')
534 } 603 }
535 604
536 -const handleStatistics = () => {
537 - showMessage('统计功能开发中...', 'warning')
538 -}
539 605
540 -const handlePrintInvoice = (order: OrderInfo) => {
541 - showMessage(`打印发票 ${order.orderNo} 功能开发中...`, 'warning')
542 -}
543 606
544 const handleSubmit = async () => { 607 const handleSubmit = async () => {
545 try { 608 try {
...@@ -973,7 +1036,8 @@ onMounted(() => { ...@@ -973,7 +1036,8 @@ onMounted(() => {
973 } 1036 }
974 1037
975 .dialog-content.large-dialog { 1038 .dialog-content.large-dialog {
976 - max-width: 1000px; 1039 + max-width: 1200px;
1040 + width: 95%;
977 } 1041 }
978 1042
979 .dialog-header { 1043 .dialog-header {
...@@ -1105,4 +1169,145 @@ onMounted(() => { ...@@ -1105,4 +1169,145 @@ onMounted(() => {
1105 color: #333; 1169 color: #333;
1106 font-size: 16px; 1170 font-size: 16px;
1107 } 1171 }
1172 +
1173 +/* 发票详情样式 */
1174 +.detail-content {
1175 + padding: 20px;
1176 +}
1177 +
1178 +.detail-section {
1179 + margin-bottom: 30px;
1180 +}
1181 +
1182 +.detail-section h4 {
1183 + margin: 0 0 15px 0;
1184 + padding: 10px 0;
1185 + border-bottom: 2px solid #007bff;
1186 + color: #007bff;
1187 + font-size: 16px;
1188 + font-weight: 600;
1189 +}
1190 +
1191 +.detail-grid {
1192 + display: grid;
1193 + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1194 + gap: 15px;
1195 +}
1196 +
1197 +.detail-item {
1198 + display: flex;
1199 + align-items: center;
1200 + padding: 8px 0;
1201 + border-bottom: 1px solid #f0f0f0;
1202 +}
1203 +
1204 +.detail-item label {
1205 + font-weight: 600;
1206 + color: #333;
1207 + min-width: 120px;
1208 + margin-right: 10px;
1209 +}
1210 +
1211 +.detail-item span {
1212 + color: #666;
1213 + flex: 1;
1214 +}
1215 +
1216 +.amount-text {
1217 + color: #e74c3c;
1218 + font-weight: 600;
1219 +}
1220 +
1221 +.detail-table-container {
1222 + margin-top: 15px;
1223 + overflow-x: auto;
1224 +}
1225 +
1226 +.detail-table {
1227 + width: 100%;
1228 + border-collapse: collapse;
1229 + font-size: 14px;
1230 +}
1231 +
1232 +.detail-table th,
1233 +.detail-table td {
1234 + padding: 10px 8px;
1235 + text-align: left;
1236 + border: 1px solid #ddd;
1237 +}
1238 +
1239 +.detail-table th {
1240 + background: #f8f9fa;
1241 + font-weight: 600;
1242 + color: #333;
1243 +}
1244 +
1245 +.detail-table tbody tr:nth-child(even) {
1246 + background: #f8f9fa;
1247 +}
1248 +
1249 +.detail-table tbody tr:hover {
1250 + background: #e9ecef;
1251 +}
1252 +
1253 +.total-row {
1254 + background: #e9ecef !important;
1255 + font-weight: 600;
1256 +}
1257 +
1258 +.total-label {
1259 + text-align: right;
1260 + font-weight: 600;
1261 +}
1262 +
1263 +.total-amount {
1264 + color: #e74c3c;
1265 + font-weight: 700;
1266 + font-size: 15px;
1267 +}
1268 +
1269 +.detail-actions {
1270 + margin-top: 20px;
1271 + padding-top: 20px;
1272 + border-top: 1px solid #eee;
1273 + display: flex;
1274 + gap: 10px;
1275 + justify-content: flex-end;
1276 +}
1277 +
1278 +.detail-actions button {
1279 + padding: 8px 16px;
1280 + border: none;
1281 + border-radius: 4px;
1282 + cursor: pointer;
1283 + font-size: 14px;
1284 + transition: all 0.2s;
1285 +}
1286 +
1287 +.detail-actions .edit-btn {
1288 + background: #28a745;
1289 + color: white;
1290 +}
1291 +
1292 +.detail-actions .edit-btn:hover {
1293 + background: #218838;
1294 +}
1295 +
1296 +.detail-actions .print-btn {
1297 + background: #17a2b8;
1298 + color: white;
1299 +}
1300 +
1301 +.detail-actions .print-btn:hover {
1302 + background: #138496;
1303 +}
1304 +
1305 +.detail-actions .close-btn {
1306 + background: #6c757d;
1307 + color: white;
1308 +}
1309 +
1310 +.detail-actions .close-btn:hover {
1311 + background: #5a6268;
1312 +}
1108 </style> 1313 </style>
......
...@@ -467,6 +467,8 @@ const searchParams = reactive<OrderQueryReq>({ ...@@ -467,6 +467,8 @@ const searchParams = reactive<OrderQueryReq>({
467 invoiceStatus: undefined, 467 invoiceStatus: undefined,
468 rebateCalcFlag: undefined, 468 rebateCalcFlag: undefined,
469 verifyStatus: undefined, 469 verifyStatus: undefined,
470 + minAmount: undefined,
471 + maxAmount: undefined,
470 pageNum: 1, 472 pageNum: 1,
471 pageSize: 10 473 pageSize: 10
472 }) 474 })
...@@ -593,7 +595,20 @@ const showMessage = (message: string, type: 'success' | 'error' | 'warning' = 's ...@@ -593,7 +595,20 @@ const showMessage = (message: string, type: 'success' | 'error' | 'warning' = 's
593 const fetchOrders = async () => { 595 const fetchOrders = async () => {
594 try { 596 try {
595 loading.value = true 597 loading.value = true
596 - const params = { ...searchParams, pageNum: pagination.pageNum, pageSize: pagination.pageSize } 598 + // 构造查询参数对象
599 + const params: OrderQueryReq = {
600 + orderNo: searchParams.orderNo || undefined,
601 + dealerCode: searchParams.dealerCode || undefined,
602 + dealerName: searchParams.dealerName || undefined,
603 + deliveryStatus: searchParams.deliveryStatus,
604 + invoiceStatus: searchParams.invoiceStatus,
605 + rebateCalcFlag: searchParams.rebateCalcFlag,
606 + verifyStatus: searchParams.verifyStatus,
607 + minAmount: searchParams.minAmount,
608 + maxAmount: searchParams.maxAmount,
609 + pageNum: pagination.pageNum,
610 + pageSize: pagination.pageSize
611 + }
597 const response = await orderApi.getOrderList(params) as any 612 const response = await orderApi.getOrderList(params) as any
598 console.log('API响应:', response) // 添加调试日志 613 console.log('API响应:', response) // 添加调试日志
599 614
...@@ -632,7 +647,9 @@ const handleReset = () => { ...@@ -632,7 +647,9 @@ const handleReset = () => {
632 deliveryStatus: undefined, 647 deliveryStatus: undefined,
633 invoiceStatus: undefined, 648 invoiceStatus: undefined,
634 rebateCalcFlag: undefined, 649 rebateCalcFlag: undefined,
635 - verifyStatus: undefined 650 + verifyStatus: undefined,
651 + minAmount: undefined,
652 + maxAmount: undefined
636 }) 653 })
637 pagination.pageNum = 1 654 pagination.pageNum = 1
638 fetchOrders() 655 fetchOrders()
......