/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.core.mp.base; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.SneakyThrows; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.utils.*; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotEmpty; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; /** * 业务封装基础类 * * @param mapper * @param model * @author Chill */ @Validated public class BaseServiceImpl, T extends BaseEntity> extends ServiceImpl implements BaseService { @Override public boolean save(T entity) { this.resolveEntity(entity); return super.save(entity); } @Override public boolean saveBatch(Collection entityList, int batchSize) { entityList.forEach(this::resolveEntity); return super.saveBatch(entityList, batchSize); } @Override public boolean updateById(T entity) { this.resolveEntity(entity); return super.updateById(entity); } @Override public boolean updateBatchById(Collection entityList, int batchSize) { entityList.forEach(this::resolveEntity); return super.updateBatchById(entityList, batchSize); } @Override public boolean saveOrUpdate(T entity) { if (entity.getId() == null) { return this.save(entity); } else { return this.updateById(entity); } } @Override public boolean saveOrUpdateBatch(Collection entityList, int batchSize) { entityList.forEach(this::resolveEntity); return super.saveOrUpdateBatch(entityList, batchSize); } @Override @Transactional(rollbackFor = Exception.class) public boolean deleteLogic(@NotEmpty List ids) { BladeUser user = AuthUtil.getUser(); List list = new ArrayList<>(); ids.forEach(id -> { T entity = BeanUtil.newInstance(currentModelClass()); if (user != null) { entity.setUpdateUser(user.getUserId()); } entity.setUpdateTime(DateUtil.now()); entity.setId(id); list.add(entity); }); return super.updateBatchById(list) && super.removeByIds(ids); } @Override public boolean changeStatus(@NotEmpty List ids, Integer status) { BladeUser user = AuthUtil.getUser(); List list = new ArrayList<>(); ids.forEach(id -> { T entity = BeanUtil.newInstance(currentModelClass()); if (user != null) { entity.setUpdateUser(user.getUserId()); } entity.setUpdateTime(DateUtil.now()); entity.setId(id); entity.setStatus(status); list.add(entity); }); return super.updateBatchById(list); } @SneakyThrows private void resolveEntity(T entity) { BladeUser user = AuthUtil.getUser(); Date now = DateUtil.now(); if (entity.getId() == null) { // 处理新增逻辑 if (user != null) { entity.setCreateUser(user.getUserId()); entity.setCreateDept(Func.firstLong(user.getDeptId())); entity.setUpdateUser(user.getUserId()); } if (entity.getStatus() == null) { entity.setStatus(BladeConstant.DB_STATUS_NORMAL); } entity.setCreateTime(now); } else if (user != null) { // 处理修改逻辑 entity.setUpdateUser(user.getUserId()); } // 处理通用逻辑 entity.setUpdateTime(now); entity.setIsDeleted(BladeConstant.DB_NOT_DELETED); // 处理多租户逻辑,若字段值为空,则不进行操作 Field field = ReflectUtil.getField(entity.getClass(), BladeConstant.DB_TENANT_KEY); if (ObjectUtil.isNotEmpty(field)) { Method getTenantId = ClassUtil.getMethod(entity.getClass(), BladeConstant.DB_TENANT_KEY_GET_METHOD); String tenantId = String.valueOf(getTenantId.invoke(entity)); if (ObjectUtil.isEmpty(tenantId)) { Method setTenantId = ClassUtil.getMethod(entity.getClass(), BladeConstant.DB_TENANT_KEY_SET_METHOD, String.class); setTenantId.invoke(entity, (Object) null); } } } }