库存管理审批功能表结构.sql
9.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
-- ============================================
-- 库存管理审批功能相关表结构SQL
-- ============================================
-- 说明:为库存使用记录添加审批功能,包括申请记录、审批记录等
-- 执行时间:2025年
-- 注意:本SQL只包含实际使用的表和字段,已删除未使用的节点审批人表
-- ============================================
-- ============================================
-- 1. 修改库存使用记录表,添加单价和合计金额字段(如果不存在)
-- ============================================
-- 说明:用于统计成本费用,单价从产品表获取,合计金额 = 单价 × 数量
-- 检查并添加单价字段
SET @dbname = DATABASE();
SET @tablename = 'lq_inventory_usage';
SET @columnname = 'F_UnitPrice';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (COLUMN_NAME = @columnname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN `', @columnname, '` decimal(18,2) DEFAULT 0.00 COMMENT ''单价(从产品表F_Price获取)'' AFTER `F_UsageQuantity`')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- 检查并添加合计金额字段
SET @columnname = 'F_TotalAmount';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (COLUMN_NAME = @columnname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN `', @columnname, '` decimal(18,2) DEFAULT 0.00 COMMENT ''合计金额(单价×数量)'' AFTER `F_UnitPrice`')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- 添加索引(如果不存在)
-- 注意:MySQL 5.7+ 不支持 IF NOT EXISTS,使用存储过程或先检查
-- 这里先检查索引是否存在,如果不存在则添加
SET @indexname = 'idx_unit_price';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (INDEX_NAME = @indexname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD INDEX `', @indexname, '` (`F_UnitPrice`)')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
SET @indexname = 'idx_total_amount';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (INDEX_NAME = @indexname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD INDEX `', @indexname, '` (`F_TotalAmount`)')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- 数据迁移:更新已有数据的单价和合计金额(从产品表获取价格)
UPDATE `lq_inventory_usage` u
INNER JOIN `lq_product` p ON u.`F_ProductId` = p.`F_Id`
SET u.`F_UnitPrice` = COALESCE(p.`F_Price`, 0),
u.`F_TotalAmount` = COALESCE(p.`F_Price`, 0) * u.`F_UsageQuantity`
WHERE (u.`F_UnitPrice` = 0 OR u.`F_UnitPrice` IS NULL) AND p.`F_Price` IS NOT NULL;
-- ============================================
-- 2. 创建库存使用申请表(如果不存在)
-- ============================================
CREATE TABLE IF NOT EXISTS `lq_inventory_usage_application` (
`F_Id` varchar(50) NOT NULL COMMENT '申请编号',
`F_UsageBatchId` varchar(50) NOT NULL COMMENT '使用批次ID(关联lq_inventory_usage.F_UsageBatchId)',
`F_ApplicationUserId` varchar(50) NOT NULL COMMENT '申请人ID',
`F_ApplicationUserName` varchar(100) DEFAULT NULL COMMENT '申请人姓名',
`F_ApplicationStoreId` varchar(50) DEFAULT NULL COMMENT '申请门店ID',
`F_ApplicationTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
`F_NodeCount` int DEFAULT 1 COMMENT '节点数量(固定为1)',
`F_CurrentNodeOrder` int DEFAULT 0 COMMENT '当前审批节点(0-待审批,1-审批中,2-已完成)',
`F_CurrentNodeId` varchar(50) DEFAULT NULL COMMENT '当前节点ID',
`F_ApprovalStatus` varchar(20) DEFAULT '待审批' COMMENT '审批状态(待审批/审批中/已通过/未通过/已退回)',
`F_IsReceived` int DEFAULT 0 COMMENT '是否已领取(1-已领取,0-未领取)',
`F_ReceiveTime` datetime DEFAULT NULL COMMENT '领取时间',
`F_ReceiveUser` varchar(50) DEFAULT NULL COMMENT '领取人ID',
`F_Remarks` varchar(500) DEFAULT NULL COMMENT '备注',
`F_CreateTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建人ID',
`F_UpdateTime` datetime DEFAULT NULL COMMENT '更新时间',
`F_UpdateUser` varchar(50) DEFAULT NULL COMMENT '更新人ID',
`F_IsEffective` int DEFAULT 1 COMMENT '是否有效(1-有效,0-无效)',
PRIMARY KEY (`F_Id`),
UNIQUE KEY `uk_usage_batch_id` (`F_UsageBatchId`),
KEY `idx_application_user_id` (`F_ApplicationUserId`),
KEY `idx_application_store_id` (`F_ApplicationStoreId`),
KEY `idx_current_node` (`F_CurrentNodeId`),
KEY `idx_approval_status` (`F_ApprovalStatus`),
KEY `idx_is_received` (`F_IsReceived`),
KEY `idx_create_time` (`F_CreateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存使用申请表';
-- ============================================
-- 3. 创建库存使用申请审批记录表(如果不存在)
-- ============================================
CREATE TABLE IF NOT EXISTS `lq_inventory_usage_approval_record` (
`F_Id` varchar(50) NOT NULL COMMENT '记录编号',
`F_ApplicationId` varchar(50) NOT NULL COMMENT '申请ID',
`F_NodeId` varchar(50) NOT NULL COMMENT '节点编号',
`F_NodeOrder` int NOT NULL DEFAULT 1 COMMENT '节点顺序(固定为1)',
`F_ApproverId` varchar(50) NOT NULL COMMENT '审批人ID',
`F_ApproverName` varchar(100) DEFAULT NULL COMMENT '审批人姓名',
`F_ApprovalResult` varchar(20) NOT NULL COMMENT '审批结果(通过/不通过/退回)',
`F_ApprovalOpinion` varchar(500) DEFAULT NULL COMMENT '审批意见',
`F_ApprovalTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间',
`F_IsCurrentNode` int DEFAULT 0 COMMENT '是否当前节点(1-是,0-否)',
PRIMARY KEY (`F_Id`),
KEY `idx_application_id` (`F_ApplicationId`),
KEY `idx_node_id` (`F_NodeId`),
KEY `idx_approver_id` (`F_ApproverId`),
KEY `idx_node_order` (`F_ApplicationId`, `F_NodeOrder`),
KEY `idx_approval_result` (`F_ApprovalResult`),
KEY `idx_approval_time` (`F_ApprovalTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存使用申请审批记录表';
-- ============================================
-- 4. 检查并添加可能缺失的字段(兼容性处理)
-- ============================================
-- 检查 lq_inventory_usage_application 表是否有所需字段
-- 如果表已存在但字段缺失,则添加字段
-- 检查并添加 F_IsReceived 字段(如果不存在)
SET @tablename = 'lq_inventory_usage_application';
SET @columnname = 'F_IsReceived';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (COLUMN_NAME = @columnname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN `', @columnname, '` int DEFAULT 0 COMMENT ''是否已领取(1-已领取,0-未领取)'' AFTER `F_ApprovalStatus`')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- 检查并添加 F_ReceiveTime 字段(如果不存在)
SET @columnname = 'F_ReceiveTime';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (COLUMN_NAME = @columnname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN `', @columnname, '` datetime DEFAULT NULL COMMENT ''领取时间'' AFTER `F_IsReceived`')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- 检查并添加 F_ReceiveUser 字段(如果不存在)
SET @columnname = 'F_ReceiveUser';
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
(TABLE_SCHEMA = @dbname)
AND (TABLE_NAME = @tablename)
AND (COLUMN_NAME = @columnname)
) > 0,
'SELECT 1',
CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN `', @columnname, '` varchar(50) DEFAULT NULL COMMENT ''领取人ID'' AFTER `F_ReceiveTime`')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
-- ============================================
-- SQL脚本执行完成
-- ============================================
-- 说明:
-- 1. lq_inventory_usage 表:添加了 F_UnitPrice 和 F_TotalAmount 字段
-- 2. lq_inventory_usage_application 表:创建申请记录表
-- 3. lq_inventory_usage_approval_record 表:创建审批记录表
-- 4. 注意:未使用节点审批人表(lq_inventory_usage_application_node_user),已删除相关实体