用一个byte标识8个开关状态

内容纲要
  1. 数据库对应字段

    ADD COLUMN craft_status tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '工艺状态'

    选用tinyint,长度属性不影响存储值的大小,对应填充0的属性:如果选择了填充0,长度为5的话,即显示时,1会显示为00001.

  2. 建立一个枚举类

    /**  
    * 合同明细的工艺状态枚举  
    */  
    public enum CraftStatus {  
    /** 工艺文件上传*/  
    UploadProcess(0,1),  
    /** 生产流程*/  
    ProcessManagement(1,2),  
    /** 技术要求*/  
    TechnicalRequirement(2,4),  
    /** 成份性能指标*/  
    ProcessInspection(3,8),  
    /** 工艺关键尺寸*/  
    ProcessSize(4,16);  
    
    public final int type;  
    public final int value;  
    
    private CraftStatus(int type,int value) {  
        this.type= type;  
        this.value = value;  
    }  
    
    public static  CraftStatus getInstance(int type){  
        for (CraftStatus cs:CraftStatus.values()) {  
            if(cs.type==type){  
                return cs;  
            }  
        }  
        return  null;  
    }  
    }
  3. 更新方法

    /**  
    * 修改合同明细的工艺状态  
    * @param contractDetailId  合同明细id  
    * @param type  0.工艺文件;1.生产流程;2.技术要求;3.成份性能指标;4.工艺关键尺寸  
    * @param status    true.通过状态;false.不通过状态  
    * @return  
    */  
    public int syncContarctDetailCraftStatus(int contractDetailId,int  type,boolean status){  
    CraftStatus craftStatus = CraftStatus.getInstance(type);  
    if(craftStatus==null){  
        return -1;  
    }  
    int byteStatus = craftStatus.value;  
    if(status){  
        return contractDetailMapper.syncCraftStatusTrue(contractDetailId,byteStatus);  
    }else {  
        return contractDetailMapper.syncCraftStatusfalse(contractDetailId,~byteStatus);  
    }  
    
    //return 0;  
    }
  4. Mybatis 数据库修改

    
    -- 某个位设置为开启
    UPDATE t_contract_detail SET craft_status=(craft_status | #{byteStatus}) WHERE id=#{contractDetailId}
    -- 某个位设置为关闭
    UPDATE t_contract_detail SET craft_status=(craft_status & #{byteStatus}) WHERE id=#{contractDetailId}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注