-- 报销多级审批流程改造 - 数据库表结构
-- 执行时间：2024年
-- 说明：支持3-5个动态审批节点，每个报销申请在创建时设置节点和审批人，支持通过/不通过/退回操作

-- 1. 报销申请节点表（每个报销申请的节点配置）
CREATE TABLE IF NOT EXISTS `lq_reimbursement_application_node` (
  `F_Id` varchar(50) NOT NULL COMMENT '节点编号',
  `F_ApplicationId` varchar(50) NOT NULL COMMENT '报销申请ID',
  `F_NodeOrder` int NOT NULL COMMENT '节点顺序（1,2,3,4,5）',
  `F_NodeName` varchar(100) DEFAULT NULL COMMENT '节点名称',
  `F_ApprovalType` varchar(20) DEFAULT '会签' COMMENT '审批类型（会签/或签）',
  `F_IsRequired` int DEFAULT 1 COMMENT '是否必审（1-必审，0-可选）',
  `F_CreateTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`F_Id`),
  KEY `idx_application_id` (`F_ApplicationId`),
  KEY `idx_node_order` (`F_ApplicationId`, `F_NodeOrder`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='报销申请节点表';

-- 2. 报销申请节点审批人表（每个节点的审批人，在创建报销申请时指定）
CREATE TABLE IF NOT EXISTS `lq_reimbursement_application_node_user` (
  `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 COMMENT '节点顺序（1,2,3,4,5）',
  `F_UserId` varchar(50) NOT NULL COMMENT '审批人ID',
  `F_UserName` varchar(100) DEFAULT NULL COMMENT '审批人姓名',
  `F_SortOrder` int DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`F_Id`),
  KEY `idx_application_id` (`F_ApplicationId`),
  KEY `idx_node_id` (`F_NodeId`),
  KEY `idx_user_id` (`F_UserId`),
  KEY `idx_node_order` (`F_ApplicationId`, `F_NodeOrder`),
  UNIQUE KEY `uk_application_node_user` (`F_ApplicationId`, `F_NodeId`, `F_UserId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='报销申请节点审批人表';

-- 3. 审批记录表
CREATE TABLE IF NOT EXISTS `lq_reimbursement_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 COMMENT '节点顺序（1,2,3,4,5）',
  `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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='审批记录表';

-- 4. 修改报销申请表，添加新字段
ALTER TABLE `lq_reimbursement_application`
  ADD COLUMN `F_NodeCount` int DEFAULT 0 COMMENT '节点数量（3,4,5）' AFTER `F_PurchaseRecordsId`,
  ADD COLUMN `F_CurrentNodeOrder` int DEFAULT 0 COMMENT '当前审批节点（0-待审批，1-N节点，N+1-已完成）' AFTER `F_NodeCount`,
  ADD COLUMN `F_CurrentNodeId` varchar(50) DEFAULT NULL COMMENT '当前节点ID' AFTER `F_CurrentNodeOrder`,
  ADD COLUMN `F_ApprovalStatus` varchar(20) DEFAULT '待审批' COMMENT '审批状态（待审批/审批中/已通过/未通过/已退回）' AFTER `F_CurrentNodeId`,
  ADD COLUMN `F_ReturnedNodeOrder` int DEFAULT NULL COMMENT '退回节点' AFTER `F_ApprovalStatus`,
  ADD COLUMN `F_ReturnedReason` varchar(500) DEFAULT NULL COMMENT '退回原因' AFTER `F_ReturnedNodeOrder`,
  ADD KEY `idx_current_node` (`F_CurrentNodeId`),
  ADD KEY `idx_approval_status` (`F_ApprovalStatus`),
  ADD KEY `idx_node_count` (`F_NodeCount`);

-- 5. 数据迁移：更新已有数据的审批状态
-- 已审批的数据（假设为4个节点）
UPDATE `lq_reimbursement_application` 
SET `F_NodeCount` = 4,
    `F_CurrentNodeOrder` = 5, 
    `F_ApprovalStatus` = '已通过'
WHERE `F_ApproveStatus` = '已审批';

-- 未通过的数据（假设为4个节点）
UPDATE `lq_reimbursement_application` 
SET `F_NodeCount` = 4,
    `F_CurrentNodeOrder` = 1, 
    `F_ApprovalStatus` = '未通过'
WHERE `F_ApproveStatus` = '未通过';

-- 待审批的数据
UPDATE `lq_reimbursement_application` 
SET `F_NodeCount` = 4,  -- 默认4个节点，实际使用时需要根据具体情况设置
    `F_CurrentNodeOrder` = 0, 
    `F_ApprovalStatus` = '待审批'
WHERE `F_ApproveStatus` = '待审批' OR `F_ApproveStatus` IS NULL;

