-- ContractBalance 实体对应的数据库表 DDL
-- 生成时间: 2024年12月
-- 实体类位置: d:\idea-workspace\Contract-Manager\server\src\main\java\com\ecep\contract\ds\contract\model\ContractBalance.java

-- 删除已存在的表（如果存在）
DROP TABLE IF EXISTS `supplier_ms`.`CONTRACT_BALANCE`;

-- 创建 CONTRACT_BALANCE 表
CREATE TABLE `supplier_ms`.`CONTRACT_BALANCE` (
    -- 主键字段
    `ID` INT AUTO_INCREMENT COMMENT '主键，自增ID',
    `REF_ID` VARCHAR(255) COMMENT '余额ID',
    
    -- 基本信息字段
    `GUID` CHAR(36) NOT NULL COMMENT 'GUID，余额在系统中的唯一标识',
    `INVOICE_NUMBER` VARCHAR(255) COMMENT '发票号码，对应 balanceDetails 字段',
    `JSD_TYPE` VARCHAR(255) NOT NULL COMMENT 'JSD类型',
    
    -- 关联字段
    `CONTRACT_ID` INT COMMENT '关联合同ID，外键指向 CONTRACT 表',
    `BM_EMPLOYEE_ID` INT COMMENT '业务员ID，外键指向 EMPLOYEE 表',
    `SETUP_PERSON_ID` INT COMMENT '创建人ID，外键指向 EMPLOYEE 表',
    `AUDITER_ID` INT COMMENT '审核人ID，外键指向 EMPLOYEE 表',
    `MODIFER_ID` INT COMMENT '修改人ID，外键指向 EMPLOYEE 表',
    `ADMIN_ID` INT COMMENT '管理员ID，外键指向 EMPLOYEE 表',
    
    -- 时间字段
    `SETUP_DATE_TIME` DATETIME COMMENT '创建日期',
    `AUDITE_DATE` DATE COMMENT '审核日期',
    `MODIFY_DATE_TIME` DATETIME COMMENT '修改时间',
    `ADMIN_DATE` DATE COMMENT '管理员日期',
    `EFFECT_DATE_TIME` DATETIME COMMENT '生效时间',
    
    -- 凭证相关字段
    `PZ_ID` VARCHAR(255) COMMENT '凭证ID',
    `PZ_NUM` VARCHAR(255) COMMENT '凭证编号',
    
    -- 复合主键
    PRIMARY KEY (`ID`, `REF_ID`),
    
    -- 外键约束（可选，需要根据实际情况创建）
    CONSTRAINT `FK_CONTRACT_BALANCE_CONTRACT` FOREIGN KEY (`CONTRACT_ID`) 
        REFERENCES `supplier_ms`.`CONTRACT` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `FK_CONTRACT_BALANCE_BM_EMPLOYEE` FOREIGN KEY (`BM_EMPLOYEE_ID`) 
        REFERENCES `supplier_ms`.`EMPLOYEE` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `FK_CONTRACT_BALANCE_SETUP_PERSON` FOREIGN KEY (`SETUP_PERSON_ID`) 
        REFERENCES `supplier_ms`.`EMPLOYEE` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `FK_CONTRACT_BALANCE_AUDITER` FOREIGN KEY (`AUDITER_ID`) 
        REFERENCES `supplier_ms`.`EMPLOYEE` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `FK_CONTRACT_BALANCE_MODIFER` FOREIGN KEY (`MODIFER_ID`) 
        REFERENCES `supplier_ms`.`EMPLOYEE` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT `FK_CONTRACT_BALANCE_ADMIN` FOREIGN KEY (`ADMIN_ID`) 
        REFERENCES `supplier_ms`.`EMPLOYEE` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
    
    -- 索引优化
    INDEX `IDX_CONTRACT_BALANCE_GUID` (`GUID`),
    INDEX `IDX_CONTRACT_BALANCE_CONTRACT_ID` (`CONTRACT_ID`),
    INDEX `IDX_CONTRACT_BALANCE_EMPLOYEE_ID` (`BM_EMPLOYEE_ID`),
    INDEX `IDX_CONTRACT_BALANCE_SETUP_DATE` (`SETUP_DATE_TIME`),
    INDEX `IDX_CONTRACT_BALANCE_AUDITE_DATE` (`AUDITE_DATE`),
    
    -- 唯一约束
    UNIQUE KEY `UK_CONTRACT_BALANCE_GUID` (`GUID`)
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同余额表';

-- 插入测试数据（可选）
INSERT INTO `supplier_ms`.`CONTRACT_BALANCE` (
    `ID`, `REF_ID`, `GUID`, `INVOICE_NUMBER`, `JSD_TYPE`,
    `CONTRACT_ID`, `BM_EMPLOYEE_ID`, `SETUP_DATE_TIME`, `EFFECT_DATE_TIME`
) VALUES (
    1, 'REF001', UUID(), 'INV-2024-001', 'NORMAL',
    1001, 5001, NOW(), NOW()
);

-- 字段映射说明：
-- Java 实体类字段 → MySQL 字段类型映射
-- Integer id → INT AUTO_INCREMENT
-- String refId → VARCHAR(255)  
-- UUID guid → CHAR(36) (MySQL 不支持 UUID，转换为 CHAR(36))
-- String invoiceNumber → VARCHAR(255)
-- String jsdType → VARCHAR(255)
-- Integer contractId → INT (外键)
-- Integer employeeId → INT (外键)
-- LocalDateTime → DATETIME
-- LocalDate → DATE
-- @ManyToOne → INT (外键关联)

-- 注意事项：
-- 1. 复合主键：使用了 ID 和 REF_ID 作为复合主键
-- 2. UUID 处理：MySQL 不支持 UUID 原生类型，使用 CHAR(36) 存储
-- 3. 外键约束：如果 EMPLOYEE 表和 CONTRACT 表不存在，需要先创建
-- 4. 字符集：使用 utf8mb4 支持完整Unicode
-- 5. 引擎：使用 InnoDB 支持事务和外键
-- 6. 注释：每个字段都添加了中文注释，便于维护