/* * Copyright [2020-2030] [https://www.stylefeng.cn] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: * * 1.请不要删除和修改根目录下的LICENSE文件。 * 2.请不要删除和修改Guns源码头部的版权声明。 * 3.请保留源码和相关描述文件的项目出处,作者声明等。 * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns * 6.若您的项目无法满足以上几点,可申请商业授权 */ package cn.stylefeng.roses.kernel.db.mp.fieldfill; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.rule.enums.StatusEnum; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.ReflectionException; import java.lang.reflect.Field; import java.util.Date; import static cn.stylefeng.roses.kernel.db.api.constants.DbFieldConstants.*; /** * 字段自动填充工具,在mybatis-plus执行更新和新增操作时候,会对指定字段进行自动填充,例如 create_time 等字段 * * @author fengshuonan * @date 2020/10/16 17:14 */ @Slf4j public class CustomMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { try { // 设置createUser(BaseEntity) setValue(metaObject, CREATE_USER, this.getUserUniqueId()); // 设置createTime(BaseEntity) setValue(metaObject, CREATE_TIME, new Date()); // 设置删除标记 默认N-删除 setDelFlagDefaultValue(metaObject); // 设置状态字段 默认1-启用 setStatusDefaultValue(metaObject); // 设置乐观锁字段,从0开始 setValue(metaObject, VERSION_FLAG, 0L); // 设置组织id setValue(metaObject, ORG_ID, this.getUserOrgId()); } catch (ReflectionException e) { log.warn("CustomMetaObjectHandler处理过程中无相关字段,不做处理"); } } @Override public void updateFill(MetaObject metaObject) { try { // 设置updateUser(BaseEntity) setValue(metaObject, UPDATE_USER, this.getUserUniqueId()); // 设置updateTime(BaseEntity) setValue(metaObject, UPDATE_TIME, new Date()); } catch (ReflectionException e) { log.warn("CustomMetaObjectHandler处理过程中无相关字段,不做处理"); } } /** * 获取用户唯一id * * @author fengshuonan * @date 2021/10/29 10:01 */ private Long getUserUniqueId() { try { return LoginContext.me().getLoginUser().getUserId(); } catch (Exception e) { //如果获取不到就返回-1 return -1L; } } /** * 设置属性 * * @author fengshuonan * @date 2021/10/29 10:01 */ private void setValue(MetaObject metaObject, String fieldName, Object value) { Object originalAttr = getFieldValByName(fieldName, metaObject); if (ObjectUtil.isEmpty(originalAttr)) { setFieldValByName(fieldName, value, metaObject); } } /** * 获取用户唯一id * * @author yxx * @date 2022/09/01 10:14 */ private Long getUserOrgId() { try { return LoginContext.me().getLoginUser().getOrganizationId(); } catch (Exception e) { //如果获取不到就返回-1 return -1L; } } /** * 设置属性,针对逻辑删除字段 * * @author fengshuonan * @date 2022/9/7 17:23 */ private void setDelFlagDefaultValue(MetaObject metaObject) { Object originalAttr = getFieldValByName(DEL_FLAG, metaObject); if (ObjectUtil.isNotEmpty(originalAttr)) { return; } Object originalObject = metaObject.getOriginalObject(); try { // 获取delFlag字段的类型,如果是枚举类型,则设置枚举 Field declaredField = originalObject.getClass().getDeclaredField(DEL_FLAG); if (ClassUtil.isEnum(declaredField.getType())) { setFieldValByName(DEL_FLAG, YesOrNotEnum.N, metaObject); } else { setFieldValByName(DEL_FLAG, YesOrNotEnum.N.getCode(), metaObject); } } catch (NoSuchFieldException ignored) { // 没有字段,忽略 } } /** * 设置属性,针对状态字段 * * @author fengshuonan * @date 2022/9/7 17:23 */ private void setStatusDefaultValue(MetaObject metaObject) { Object originalAttr = getFieldValByName(STATUS_FLAG, metaObject); if (ObjectUtil.isNotEmpty(originalAttr)) { return; } Object originalObject = metaObject.getOriginalObject(); try { // 获取statusFlag字段的类型,如果是枚举类型,则设置枚举 Field declaredField = originalObject.getClass().getDeclaredField(STATUS_FLAG); if (ClassUtil.isEnum(declaredField.getType())) { setFieldValByName(STATUS_FLAG, StatusEnum.ENABLE, metaObject); } else { setFieldValByName(STATUS_FLAG, StatusEnum.ENABLE.getCode(), metaObject); } } catch (NoSuchFieldException ignored) { // 没有字段,忽略 } } }