group by

作者: 年年_DK | 来源:发表于2018-06-16 14:25 被阅读0次
    /**
     * @(#)ErrorNotificationServiceImpl.java
     *
     *                                       Copyright (c) 2018 Fast Retailing Corporation.
     */
    
    package com.fastretailing.dcp.sales.errornotification.service;
    
    import java.text.MessageFormat;
    import java.util.List;
    import java.util.stream.Collectors;
    import org.apache.commons.collections.CollectionUtils;
    import org.modelmapper.ModelMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.fastretailing.dcp.sales.common.dto.PayOffData;
    import com.fastretailing.dcp.sales.common.dto.SalesTransactionErrorDetail;
    import com.fastretailing.dcp.sales.common.repository.PayOffDataMapper;
    import com.fastretailing.dcp.sales.common.repository.SalesTransactionErrorDetailMapper;
    import com.fastretailing.dcp.sales.common.type.ErrorNotificationFlag;
    import com.fastretailing.dcp.sales.common.type.ErrorNotificationPattern;
    import com.fastretailing.dcp.sales.common.type.ErrorType;
    import com.fastretailing.dcp.sales.common.type.IntegrityCheckFlag;
    import com.fastretailing.dcp.sales.errornotification.dto.ErrorNotificationMessageMaster;
    import com.fastretailing.dcp.sales.errornotification.dto.ErrorNotificationPatternMaster;
    import com.fastretailing.dcp.sales.errornotification.dto.TransactionErrorWithPattern;
    import com.fastretailing.dcp.sales.errornotification.repository.ErrorNotificationMessageMasterMapper;
    import com.fastretailing.dcp.sales.errornotification.repository.ErrorNotificationPatternMasterMapper;
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * Error notification service class.
     */
    @Service
    @Slf4j
    public class ErrorNotificationServiceImpl implements ErrorNotificationService {
    
        /** DB access parts(master error notification message). */
        @Autowired
        private ErrorNotificationMessageMasterMapper errorNotificationMessageMasterMapper;
    
        /** DB access parts(payOff data). */
        @Autowired
        private PayOffDataMapper payOffDataMapper;
    
        /** DB access parts(sales transaction error detail). */
        @Autowired
        private SalesTransactionErrorDetailMapper salesTransactionErrorDetailMapper;
    
        /**
         * DB access parts(master error notification pattern left join sales transaction error detail).
         */
        @Autowired
        private ErrorNotificationPatternMasterMapper errorNotificationPatternMasterMapper;
    
        /** Model mapped. */
        @Autowired
        private ModelMapper mapper;
    
        /**
         * {@inheritDoc}
         */
        @Override
        public void processErrorNotification() {
    
            // Get sales transaction error detail records.
            TransactionErrorWithPattern transactionErrorWithPattern = new TransactionErrorWithPattern();
            transactionErrorWithPattern.setErrorNotificationFlag(
                    String.valueOf(ErrorNotificationFlag.UNSENT.getErrorNotificationFlag()));
            List<TransactionErrorWithPattern> transactionErrorWithPatternList =
                    errorNotificationPatternMasterMapper
                            .selectByErrorNotificationFlag(transactionErrorWithPattern);
    
            // Sales transaction error detail no data.
            if (CollectionUtils.isEmpty(transactionErrorWithPatternList)) {
                // Output the empty sales information error log.
                outputEmptyLog();
            } else {
                transactionErrorWithPatternList = transactionErrorWithPatternList.stream()
                        .filter(entity -> ErrorNotificationPattern.COUNTRY_UNIT
                                .getErrorNotificationPattern()
                                .equals(entity.getErrorNotificationPattern()))
                        .collect(Collectors.toList());
    
                transactionErrorWithPatternList.stream()
                        .collect(Collectors.groupingBy(entity -> entity.getSystemCountryCode(),
                                Collectors.toList()))
                        .forEach((countryCode, list) ->
                // Output log.
                outputSalesTransactionErrorDetailLog(list));
            }
    
            // Get pay off data records.
            PayOffData payOffData = new PayOffData();
            payOffData.setIntegrityCheckFlag(
                    String.valueOf(IntegrityCheckFlag.MISMATCH.getIntegrityCheckFlag()));
            payOffData.setPayoffIntegrityErrorNotificationFlag(
                    String.valueOf(ErrorNotificationFlag.UNSENT.getErrorNotificationFlag()));
            List<PayOffData> payOffDataList = payOffDataMapper.selectErrorNotification(payOffData);
    
            // Pay off data no data.
            if (CollectionUtils.isEmpty(payOffDataList)) {
                // Output the empty sales information error log is output.
                outputEmptyLog();
            } else {
                payOffDataList.stream()
                        .collect(Collectors.groupingBy(entity -> entity.getSystemCountryCode(),
                                Collectors.toList()))
                        .forEach((countryCode, list) ->
                // Output log.
                outputPayOffDataLog(list));
            }
        }
    
        /**
         * Output empty log.
         */
        private void outputEmptyLog() {
    
            // Get error output message.
            ErrorNotificationMessageMaster errorNotificationMessageMaster =
                    getErrorOutputMessage(ErrorType.NO_ERROR.getErrorType());
            // Output log.
            log.error(errorNotificationMessageMaster.getErrorOutputMessage());
        }
    
        /**
         * Get error output message.
         * 
         * @param errorType Error type.
         * @return Master error notification message entity.
         */
        private ErrorNotificationMessageMaster getErrorOutputMessage(String errorType) {
    
            ErrorNotificationPatternMaster errorNotificationPatternMaster =
                    new ErrorNotificationPatternMaster();
            errorNotificationPatternMaster.setErrorType(errorType);
    
            ErrorNotificationMessageMaster errorNotificationMessageMaster =
                    errorNotificationMessageMasterMapper
                            .selectByErrorType(errorNotificationPatternMaster);
    
            return errorNotificationMessageMaster;
        }
    
        /**
         * Output sales transaction error detail log.
         * 
         * @param transactionErrorWithPatternList Transaction error with pattern list.
         */
        private void outputSalesTransactionErrorDetailLog(
                List<TransactionErrorWithPattern> transactionErrorWithPatternList) {
    
            // Error type validation records log output.
            outputSameErrorTypeSalesTransactionErrorDetailLog(transactionErrorWithPatternList,
                    ErrorType.VALIDATION_ERROR.getErrorType());
    
            // Error type relation records log output.
            outputSameErrorTypeSalesTransactionErrorDetailLog(transactionErrorWithPatternList,
                    ErrorType.RELATION_ERROR.getErrorType());
    
            // Error type business records log output.
            outputSameErrorTypeSalesTransactionErrorDetailLog(transactionErrorWithPatternList,
                    ErrorType.BUSINESS_ERROR.getErrorType());
    
            // Error type unique constraints records log output.
            outputSameErrorTypeSalesTransactionErrorDetailLog(transactionErrorWithPatternList,
                    ErrorType.UNIQUE_CONSTRAINTS_ERROR.getErrorType());
    
            // Update error notification flag.
            transactionErrorWithPatternList.forEach(transactionError -> {
                SalesTransactionErrorDetail salesTransactionErrorDetail =
                        new SalesTransactionErrorDetail();
                mapper.map(transactionError, salesTransactionErrorDetail);
                salesTransactionErrorDetailMapper.updateErrorNotificationFlag(
                        salesTransactionErrorDetail,
                        ErrorNotificationFlag.SENT.getErrorNotificationFlag());
            });
        }
    
        /**
         * Output same error type sales transaction error detail log.
         * 
         * @param transactionErrorList Transaction error list.
         * @param errorType Error type.
         */
        private void outputSameErrorTypeSalesTransactionErrorDetailLog(
                List<TransactionErrorWithPattern> transactionErrorList, String errorType) {
    
            // Get same error type data from transaction error list.
            List<TransactionErrorWithPattern> sameErrorTypeList = transactionErrorList.stream()
                    .filter(detail -> detail.getErrorType().equals(errorType))
                    .collect(Collectors.toList());
    
            int count = sameErrorTypeList.size();
    
            // Data is exist.
            if (count != 0) {
    
                TransactionErrorWithPattern transactionErrorWithPattern = sameErrorTypeList.get(0);
    
                // Get output massage.
                String errorOutputMessage = getOutputMassage(transactionErrorWithPattern.getErrorType(),
                        transactionErrorWithPattern.getSystemCountryCode(), count);
    
                // Output log.
                log.error(errorOutputMessage);
            }
        }
    
        /**
         * Output payoff data log.
         * 
         * @param payOffDataList Payoff data list.
         */
        private void outputPayOffDataLog(List<PayOffData> payOffDataList) {
    
            PayOffData payOffData = payOffDataList.stream().findFirst().get();
    
            // Get output massage.
            String errorOutputMessage =
                    getOutputMassage(ErrorType.PAYOFF_CONFORMITY_CHECK.getErrorType(),
                            payOffData.getSystemCountryCode(), payOffDataList.size());
    
            // Output log.
            log.error(errorOutputMessage);
    
            // Update error notification flag.
            payOffDataList.forEach(entity -> {
                payOffDataMapper.updateErrorNotificationFlag(entity,
                        ErrorNotificationFlag.SENT.getErrorNotificationFlag());
            });
        }
    
        /**
         * Get output massage.
         * 
         * @param errorType Error type.
         * @param countryCode Country code.
         * @param count Message count.
         * @return Output massage.
         */
        private String getOutputMassage(String errorType, String countryCode, int count) {
    
            ErrorNotificationMessageMaster errorNotificationMessage = getErrorOutputMessage(errorType);
            MessageFormat messageFormat =
                    new MessageFormat(errorNotificationMessage.getErrorOutputMessage());
    
            return messageFormat.format(new String[] {countryCode, String.valueOf(count)});
        }
    }
    
    

    相关文章

      网友评论

          本文标题:group by

          本文链接:https://www.haomeiwen.com/subject/avztsftx.html