package ${packageName}.service.impl;
<#if table.cacheServiceType==0 >
    <#assign Service = "AbstractCRUDServiceImpl">
<#elseif table.cacheServiceType==1 >
    <#assign Service = "AbstractCRUDCacheServiceImpl">
<#elseif table.cacheServiceType==2 >
    <#assign Service = "AbstractCRUDDynamicCacheServiceImpl">
<#else >
    <#assign Service = "AbstractCRUDServiceImpl">
</#if>
import org.springframework.beans.BeanUtils;
import java.util.function.Function;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.${Service};
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import ${packageName}.dao.${ClassName}Dao;
import ${packageName}.model.${ClassName}Entity;
import ${packageName}.service.${ClassName}Service;
<#if table.tplCategory=="sub" || table.tplCategory=="subone">
import org.springframework.beans.factory.annotation.Autowired;
import ${subPackageName}.model.${subClassName}Entity;
import ${subPackageName}.model.${subClassName}Query;
import ${subPackageName}.service.${subClassName}Service;
import org.springframework.util.ObjectUtils;
import java.util.Date;
import java.util.Arrays;
import java.util.List;
</#if>
<#if pkColumn??&&pkColumn.isIncrement==0 >
import cn.hutool.core.util.IdUtil;
</#if>
<#if pkColumn??&&pkColumn.isIncrement==0 >
    <#assign Temp>
    @Override
    protected void saveBefore(${ClassName}Entity entity, Context context) throws AppException {
    //非系统自增,需这里设置主键
    <#if pkColumn.javaType=="String" >
        entity.set${pkColumn.javaField?cap_first}(IdUtil.fastSimpleUUID());
    <#elseif pkColumn.javaType=="Integer">
        entity.set${pkColumn.javaField?cap_first}(((Long)IdUtil.getSnowflake(0,1).nextId()).intValue());
    <#elseif pkColumn.javaType=="Long">
        entity.set${pkColumn.javaField?cap_first}(IdUtil.getSnowflake(0,1).nextId());
    </#if>
    super.saveBefore(entity, context);
    }
    </#assign>
    <#else>
    <#assign Temp ></#assign>
</#if>
import lombok.extern.slf4j.Slf4j;
/**
* ${ClassName}Service
* ${functionName} service实现
*
* @author ${author}
* @date ${datetime}
*/
@Service("${ClassName?uncap_first}Service")
@Slf4j
public class ${ClassName}ServiceImpl extends ${Service}<${ClassName}Dao, ${ClassName}Entity, ${pkColumn.javaType}> implements ${ClassName}Service {
<#if table.tplCategory=="sub">
    @Autowired
    private ${subClassName}Service ${subclassName}Service;

    @Override
    protected void findAfter(${ClassName}Entity params,PageInfo pageInfo, Context context, List<${ClassName}Entity> list) throws AppException {
        fillSubData(list);
        super.findAfter(params,pageInfo, context, list);
    }
    @Override
    protected void findAfter(${ClassName}Entity params, Context context, List<${ClassName}Entity> list) throws AppException {
        fillSubData(list);
        super.findAfter(params, context, list);
    }

    private void fillSubData(List<${ClassName}Entity> list) {
        List<${pkColumn.javaType}> idList = list.stream().map(i -> i.get${pkColumn.javaField?cap_first}()).collect(Collectors.toList());
        if(ObjectUtils.isEmpty(idList))return;
        Map<${pkColumn.javaType}, List<${subClassName}Entity>> ${subclassName}ListMap = ${subclassName}Service
                .find(new ${subClassName}Query().${subTableFkClassName}List(idList)).parallelStream()
                .collect(Collectors.groupingBy(${subClassName}Entity::get${subTableFkClassName}));
        list.forEach(item -> item.set${subClassName}List(${subclassName}ListMap.get(item.get${pkColumn.javaField?cap_first}())));
    }

    ${Temp}
    @Override
    protected void saveAfter(${ClassName}Entity entity, Context context) throws AppException {
        if(!ObjectUtils.isEmpty(entity.get${subClassName}List())){
            entity.get${subClassName}List().stream().peek(item->{
            <#if subPkColumn??&&subPkColumn.isIncrement==0 >
            <#if subPkColumn.javaType=="String" >
                item.set${subPkColumn.javaField?cap_first}(IdUtil.fastSimpleUUID());
            <#elseif subPkColumn.javaType=="Integer">
                item.set${subPkColumn.javaField?cap_first}(((Long)IdUtil.getSnowflake(1024,512).nextId()).intValue());
            <#elseif subPkColumn.javaType=="Long">
                item.set${subPkColumn.javaField?cap_first}(IdUtil.getSnowflake(1024,512).nextId());
            </#if>
            </#if>
                item.set${subTableFkClassName}(entity.get${pkColumn.javaField?cap_first}());
                item.setCreateUserId(this.getContextUserId(context));
                item.setCreateTime(new Date());
            }).count();
            ${subclassName}Service.save(entity.get${subClassName}List());
        }
        super.saveAfter(entity, context);
    }

    @Override
    protected void updateAfter(${ClassName}Entity entity, Context context) throws AppException {
        if(!ObjectUtils.isEmpty(entity.get${subClassName}List())){
            ${subPkColumn.javaType}[] ${subclassName}Ids = ${subclassName}Service.find(new ${subClassName}Query().${subTableFkclassName}(entity.get${pkColumn.javaField?cap_first}())).stream().map(${subClassName}Entity::get${subPkColumn.javaField?cap_first}).toArray(${subPkColumn.javaType}[]::new);
            ${subclassName}Service.remove(${subclassName}Ids,context);
            entity.get${subClassName}List().stream().peek(item ->{
        <#if subPkColumn??&&subPkColumn.isIncrement==0 >
            <#if subPkColumn.javaType=="String" >
                item.set${subPkColumn.javaField?cap_first}(IdUtil.fastSimpleUUID());
            <#elseif subPkColumn.javaType=="Integer">
                item.set${subPkColumn.javaField?cap_first}(((Long)IdUtil.getSnowflake(1024,512).nextId()).intValue());
            <#elseif subPkColumn.javaType=="Long">
                item.set${subPkColumn.javaField?cap_first}(IdUtil.getSnowflake(1024,512).nextId());
            </#if>
        </#if>
                item.set${subTableFkClassName}(entity.get${pkColumn.javaField?cap_first}());
                item.setCreateUserId(this.getContextUserId(context));
                item.setCreateTime(new Date());
                item.setUpdateUserId(this.getContextUserId(context));
                item.setUpdateTime(new Date());
            }).count();
            ${subclassName}Service.save(entity.get${subClassName}List());
        }
        super.updateAfter(entity, context);
    }

    @Override
    protected void removeAfter(${pkColumn.javaType}[] ids, Context context, int result) throws AppException {
        List<${subClassName}Entity> ${subclassName}list = ${subclassName}Service.find(new ${subClassName?cap_first}Query().${subTableFkClassName?uncap_first}List(Arrays.asList(ids)));
        ${subclassName}Service.removeList(${subclassName}list,context);
        super.removeAfter(ids, context, result);
    }
    <#elseif table.tplCategory=="subone">
    @Autowired
    private ${subClassName}Service ${subclassName}Service;

    @Override
    protected void findAfter(${ClassName}Entity params,PageInfo pageInfo, Context context, List<${ClassName}Entity> list) throws AppException {
        fillSubData(list);
        super.findAfter(params,pageInfo, context, list);
    }
    @Override
    protected void findAfter(${ClassName}Entity params, Context context, List<${ClassName}Entity> list) throws AppException {
        fillSubData(list);
        super.findAfter(params, context, list);
    }

    private void fillSubData(List<${ClassName}Entity> list) {
        List<${pkColumn.javaType}> idList = list.stream().map(i -> i.get${pkColumn.javaField?cap_first}()).collect(Collectors.toList());
        if(ObjectUtils.isEmpty(idList)) return;
        ${subClassName}Query ${subclassName}Query = new ${subClassName}Query();
        ${subclassName}Query.set${subTableFkClassName}List(idList);
        Map<${pkColumn.javaType}, ${subClassName}Entity> ${subclassName}Map = ${subclassName}Service.find(${subclassName}Query).stream().collect(Collectors.toMap(${subClassName}Entity::get${subTableFkClassName}, Function.identity(), (n1, n2) -> n1));
        list.forEach(item -> item.set${subClassName}Entity(${subclassName}Map.get(item.get${pkColumn.javaField?cap_first}())));
    }

    ${Temp}
    @Override
    protected void saveAfter(${ClassName}Entity entity, Context context) throws AppException {
        if(!ObjectUtils.isEmpty(entity.get${subClassName}Entity())){
            ${subClassName}Entity ${subclassName}Entity = new ${subClassName}Entity();
            ${subclassName}Entity.initAttrValue();
            ${subClassName}Entity subEntity=entity.get${subClassName}Entity();
            BeanUtils.copyProperties(subEntity,${subclassName}Entity);
        <#if subPkColumn??&&subPkColumn.isIncrement==0&&subPkColumn.javaType=="String" >
            ${subclassName}Entity.set${subPkColumn.javaField?cap_first}(IdUtil.fastSimpleUUID());
        <#elseif subPkColumn??&&subPkColumn.isIncrement==0&&subPkColumn.javaType=="Integer">
            ${subclassName}Entity.set${subPkColumn.javaField?cap_first}(((Long)IdUtil.getSnowflake(1024,512).nextId()).intValue());
        <#elseif subPkColumn??&&subPkColumn.isIncrement==0&&subPkColumn.javaType=="Long">
            ${subclassName}Entity.set${subPkColumn.javaField?cap_first}(IdUtil.getSnowflake(1024,512).nextId());
        </#if>
            ${subclassName}Entity.set${subTableFkClassName}(entity.get${pkColumn.javaField?cap_first}());
            ${subclassName}Entity.setCreateUserId(this.getContextUserId(context));
            ${subclassName}Entity.setCreateTime(new Date());
            ${subclassName}Service.save(${subclassName}Entity,context);
        }
        super.saveAfter(entity, context);
    }

    @Override
    protected void updateAfter(${ClassName}Entity entity, Context context) throws AppException {
        if(!ObjectUtils.isEmpty(entity.get${subClassName}Entity())){
            ${subClassName}Entity subEntity=entity.get${subClassName}Entity();
            subEntity.setUpdateUserId(this.getContextUserId(context));
            subEntity.setUpdateTime(new Date());
            ${subclassName}Service.update(subEntity,context);
        }
        super.updateAfter(entity, context);
    }
    @Override
    protected void removeAfter(${pkColumn.javaType}[] ids, Context context, int result) throws AppException {
        List<${subClassName}Entity> ${subclassName}list = ${subclassName}Service.find(new ${subClassName?cap_first}Query().${subTableFkClassName?uncap_first}List(Arrays.asList(ids)));
        ${subclassName}Service.removeList(${subclassName}list,context);
        super.removeAfter(ids, context, result);
    }
        <#else>
    ${Temp}
</#if>
}