///*
// *      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.common.mp.base;
//
//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;
//
//import org.springblade.core.constant.BladeConstant;
//import org.springblade.core.secure.BladeUser;
//import org.springblade.core.secure.utils.AuthUtil;
//import org.springblade.core.tool.utils.Func;
//import org.springframework.beans.BeanUtils;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.ClassUtils;
//import org.springframework.validation.annotation.Validated;
//
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.ReflectUtil;
//import lombok.SneakyThrows;
//
///**
// * 业务封装基础类
// *
// * @param <M> mapper
// * @param <T> model
// * @author Chill
// */
//@Validated
//public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends ServiceImpl<M, T> implements BaseService<T> {
//
//	@Override
//	public boolean save(T entity) {
//		this.resolveEntity(entity);
//		return super.save(entity);
//	}
//
//	@Override
//	public boolean saveBatch(Collection<T> 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<T> 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<T> entityList, int batchSize) {
//		entityList.forEach(this::resolveEntity);
//		return super.saveOrUpdateBatch(entityList, batchSize);
//	}
//
//	@Override
//	@Transactional(rollbackFor = Exception.class)
//	public boolean deleteLogic(List<Long> ids) {
//		BladeUser user = AuthUtil.getUser();
//		List<T> list = new ArrayList<>();
//		ids.forEach(id -> {
//			T entity = BeanUtils.instantiateClass(currentModelClass());
//			if (user != null) {
//				entity.setUpdateUser(user.getUserId());
//			}
//			entity.setUpdateTime(new Date());
//			entity.setId(id);
//			list.add(entity);
//		});
//		return super.updateBatchById(list) && super.removeByIds(ids);
//	}
//
//	@Override
//	public boolean changeStatus(List<Long> ids, Integer status) {
//		BladeUser user = AuthUtil.getUser();
//		List<T> list = new ArrayList<>();
//		ids.forEach(id -> {
//			T entity = BeanUtils.instantiateClass(currentModelClass());
//			if (user != null) {
//				entity.setUpdateUser(user.getUserId());
//			}
//			entity.setUpdateTime(new Date());
//			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 = new Date();
//		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 = ClassUtils.getMethod(entity.getClass(), BladeConstant.DB_TENANT_KEY_GET_METHOD);
//			String tenantId = String.valueOf(getTenantId.invoke(entity));
//			if (ObjectUtil.isEmpty(tenantId)) {
//				Method setTenantId = ClassUtils.getMethod(entity.getClass(), BladeConstant.DB_TENANT_KEY_SET_METHOD, String.class);
//				setTenantId.invoke(entity, (Object) null);
//			}
//		}
//	}
//
//}
