统一管理java线性处理多个不同业务

本文介绍了如何在Java中通过统一接口和组件注册,实现对多个不同业务的线性处理。首先,利用ApplicationContextAware接口注册组件;接着,详细阐述了业务的统一调用实现;然后,定义了业务的统一接口;最后,讨论了具体的子类实现细节。
摘要由CSDN通过智能技术生成

1、注册统一接口类组件(ApplicationContextAware)

@Component
public class CalcServiceLocator implements ApplicationContextAware {
    /**
     * 用于保存接口实现类名及对应的类
     */
    private List<ACalcBase> calcImpl;

    /**
     * 获取应用上下文并获取相应的接口实现类
     *
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //根据接口类型返回相应的所有bean
        Map<String, ACalcBase> calcImplMap = applicationContext.getBeansOfType(ACalcBase.class);
        calcImpl = new ArrayList<>();
        calcImplMap.forEach((k, v) -> calcImpl.add(v));
        calcImpl.sort(Comparator.comparing(ACalcBase::sequence));
    }

    public List<ACalcBase> getCalcImpl() {
        return calcImpl;
    }
}

2、业务统一调用实现

@Service
public class CalReportServiceImpl extends BaseServiceImpl<CalReportRepository, CalReport, CalReportDTO> implements ICalReportService {
    @Autowired
    private CalcServiceLocator calcServiceLocator;

    @Override
    public CalReportDTO create(CalReportDTO dto) throws BaseException {
        CalReport qResult = iBaseRepository.findTopByMonthAndFarmId(dto.getMonth(), dto.getFarmId());
        if (qResult == null) {
            CalReportDTO result = super.create(dto);
            calcServiceLocator.getCalcImpl().forEach(v -> v.initCalc(result));
            return result;
        }
        throw new SysException("该报表已经存在,不用再次创建!");
    }

    @Override
    public PageDTO<CalReportDTO> getPage(PageDTO<CalReportDTO> pageDTO) {
        Page<CalReportDTO> pageList = iBaseRepository.findPageable(pageDTO.getFilters(), CommonJpaPageUtil.getInstance().toPageRequest(pageDTO));
        pageDTO.setTotal(pageList.getTotalElements());
        pageDTO.setList(pageList.getContent());
        return pageDTO;
    }

    @Override
    public void beforeRemove(List<String> ids) {
        super.beforeRemove(ids);
        calcServiceLocator.getCalcImpl().forEach(v -> v.delCalc(ids));
    }

   /* @Override
    public CalReportDTO beforeSave(CalReportDTO dto) {
        super.beforeSave(dto);
        calcServiceLocator.getCalcImpl().forEach((k, v) -> v.initCalc(dto));
        return dto;
    }*/

    @Override
    public CalReportDTO update(CalReportDTO dto) throws BaseException {
        /**
         * 更新修改人和时间
         */
        dto.setModifiedDate(null);
        dto.setModifiedBy(null);
        CalReportDTO result = super.update(dto);
        calcServiceLocator.getCalcImpl().forEach(v -> v.reCalc(dto));
        return result;
    }
}

3、业务统一接口

public abstract class ACalcBase {
    /**
     * 计算定值计算
     *
     * @param dto
     */
    public abstract void initCalc(CalReportDTO dto);

    /**
     * 删除定值计算
     */
    public abstract void delCalc(List<String> ids);

    /**
     * 重算定值计算
     *
     * @param dto
     */
    public void reCalc(CalReportDTO dto) {
        /**
         * 1、删除
         * 2、生成
         */
        System.out.println("★默认重算★-[" + this.getClass().getSimpleName() + "]");
        delCalc(Arrays.asList(new String[]{dto.getId()}));
        initCalc(dto);
    }
    /**
     * 计算顺序
     * @return
     */
    public abstract int sequence();
}

4子类

/**
 * 基础参数
 */
@Service
public class BasicParametersServiceImpl extends ACalcBase {
    @Autowired
    private CalcCustomRepository calcCustomRepository;
    @Autowired
    private ICalBaseCapaService calBaseCapaService;
    @Autowired
    private ICalBaseEquipService calBaseEquipService;


    @Override
    public int sequence() {
        return 1;
    }

    @Override
    public void initCalc(CalReportDTO dto) {
        System.out.println("计算--基础参数");
        System.out.println("*********"+dto.getId());
        this.initBaseCapaData(dto);
        this.initEquip(dto);
    }

    @Override
    public void delCalc(List<String> ids) {
        System.out.println("删除--基础参数");
        if (BaseUtils.isEmpty(ids)) return;
        this.delBaseCapaData(ids);
        this.delEquip(ids);
    }

    private void initBaseCapaData(CalReportDTO dto) {
        List<CapaData> capaDataList = calcCustomRepository.getBaseCapaData(dto);
        List<CalBaseCapaDTO> dtoList = capaDataList.stream().map(val -> new CalBaseCapaDTO().setReportId(dto.getId())
                .setCapa(val.getCapa()).setPositiveImpSmall(val.getPositiveImpSmall()).setPositiveImpBig(val.getPositiveImpBig())
                .setZeroImpSmall(val.getZeroImpSmall()).setZeroImpBig(val.getZeroImpBig()))
                .collect(Collectors.toList());
        if (BaseUtils.isEmpty(dtoList)) return;
        calBaseCapaService.batchCreate(dtoList);
    }

    private void initEquip(CalReportDTO dto) {
        List<Map> qResult = calcCustomRepository.getEquipmentConfigure(dto);
        AtomicInteger index = new AtomicInteger(0);
        List<CalBaseEquipDTO> dtoList = qResult.stream().map(val -> new CalBaseEquipDTO(val).setReportId(dto.getId()).setSequence(index.getAndIncrement())).collect(Collectors.toList());
        if (BaseUtils.isEmpty(dtoList)) return;
        calBaseEquipService.batchCreate(dtoList);
    }

    private void delBaseCapaData(List<String> ids) {
        List<CalBaseCapaDTO> qList = calBaseCapaService.selectByReportIds(ids);
        List<String> dtoIds = qList.stream().map(v -> v.getId()).collect(Collectors.toList());
        if (BaseUtils.isEmpty(dtoIds)) return;
        calBaseCapaService.removeByIds(dtoIds);
    }

    private void delEquip(List<String> ids) {
        List<CalBaseEquipDTO> qList = calBaseEquipService.selectByReportIds(ids);
        List<String> dtoIds = qList.stream().map(v -> v.getId()).collect(Collectors.toList());
        if (BaseUtils.isEmpty(dtoIds)) return;
        calBaseEquipService.removeByIds(dtoIds);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值