Api.java 6.3 KB
package com.xiniunet.erp.ledger.module.screen;

import com.alibaba.citrus.service.requestcontext.buffered.BufferedRequestContext;
import com.alibaba.citrus.turbine.dataresolver.Param;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.xiniunet.erp.foundation.helper.FoundationHelper;
import com.xiniunet.erp.ledger.domain.CapitalAccountDetail;
import com.xiniunet.erp.ledger.helper.LedgerHelper;
import com.xiniunet.erp.tool.Constants;
import com.xiniunet.data.domain.Bank;
import com.xiniunet.data.request.BankGetListRequest;
import com.xiniunet.log.request.ErrorLogCreateRequest;
import com.xiniunet.data.response.BankGetListResponse;
import com.xiniunet.framework.base.BaseFindResponse;
import com.xiniunet.framework.base.BaseResponse;
import com.xiniunet.framework.exception.ErrorType;
import com.xiniunet.framework.log.Log;
import com.xiniunet.framework.log.LogUtil;
import com.xiniunet.framework.security.Passport;
import com.xiniunet.framework.util.auth.LocalData;
import com.xiniunet.master.domain.ledger.CapitalAccount;
import com.xiniunet.master.domain.ledger.CapitalAccountTypeEnum;
import com.xiniunet.master.request.ledger.CapitalAccountFindRequest;
import com.xiniunet.master.request.ledger.CurrencyChartSearchRequest;
import com.xiniunet.master.response.ledger.CapitalAccountFindResponse;
import com.xiniunet.master.response.ledger.CurrencyChartSearchResponse;
import com.xiniunet.master.service.MasterService;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created on 2015-08-07.
 *
 * @author 吕浩
 * @since 1.0.0
 */
public class Api {

    @Autowired
    private HttpServletResponse response;

    @Autowired
    private BufferedRequestContext brc;

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private FoundationHelper foundationHelper;

    @Autowired
    private MasterService masterService;

    @Autowired
    private LedgerHelper ledgerHelper;

    public void execute(@Param("method") String method) throws Exception {

        BaseResponse baseResponse = new BaseResponse();

        Passport passport = LocalData.getCurrentPassport();

        InputStreamReader isr = new InputStreamReader(request.getInputStream());
        BufferedReader in = new BufferedReader(isr);
        String line = in.readLine();
        try {
            // 必须关闭buffering,未完成的页面才会被显示在浏览器上。
            brc.setBuffering(false);

            // 设置content type,但不需要设置charset,框架会设置正确的charset。
            response.setContentType("text/plain");
            method = method.toLowerCase();
            JSONObject jsonObject = JSON.parseObject(line);
            switch(method) {

                case "api.ledger.capital.account.find":
                    baseResponse = apiLedgerCapitalAccountFind(jsonObject, passport);
                    break;
                case "api.ledger.currency.chart.search":
                    baseResponse = apiLedgerCurrencyChartSearch(jsonObject, passport);
                    break;


                //---------------不存在的方法--------------
                default:
                    baseResponse.addError(ErrorType.INVALID_PARAMETER, Constants.NOT_EXIST_METHOD);
                    break;
            }
        } catch(Exception e) {
            LogUtil.writeLog(new Log("debug", "web", "", e.getMessage(), passport));
            baseResponse.addError(ErrorType.SYSTEM_ERROR, Constants.ERROR_MESSAGE_500);
            baseResponse.addError(ErrorType.STACK_DUMP, LogUtil.dumpException(e));

            foundationHelper.createErrorLog(new ErrorLogCreateRequest(e, Constants.ERROR_MESSAGE_500, line), passport);
        } finally {
            PrintWriter out = response.getWriter();
            String json = JSON.toJSONString(baseResponse, SerializerFeature.DisableCircularReferenceDetect);
            out.println(json);
        }
    }

    BaseFindResponse<CapitalAccountDetail> apiLedgerCapitalAccountFind(JSONObject jsonObject, Passport passport) {
        BaseFindResponse<CapitalAccountDetail> findResponse = new BaseFindResponse<>();
        CapitalAccountFindRequest capitalAccountFindRequest = JSON.toJavaObject(jsonObject, CapitalAccountFindRequest.class);
        BankGetListResponse bankGetListResponse = foundationHelper.getBankList(new BankGetListRequest());
        List<Bank> bankList = new ArrayList<>();
        if(bankGetListResponse != null && !bankGetListResponse.hasError()) {
            bankList = bankGetListResponse.getBankList();
        }
        Map<Long, String> bankMap = new HashMap<>();
        for(Bank bank : bankList) {
            bankMap.put(bank.getId(), bank.getName());
        }

        CapitalAccountFindResponse capitalAccountFindResponse = masterService.findCapitalAccount(capitalAccountFindRequest, passport);
        if(capitalAccountFindResponse.hasError()) {
            findResponse.addErrors(capitalAccountFindResponse.getErrors());
            return findResponse;
        }
        List<CapitalAccount> capitalAccounts = capitalAccountFindResponse.getResult();
        List<CapitalAccountDetail> capitalAccountDetails = JSON.parseArray(JSON.toJSONString(capitalAccounts), CapitalAccountDetail.class);
        for(CapitalAccountDetail capitalAccountDetail : capitalAccountDetails) {
            if(capitalAccountDetail.getType() == CapitalAccountTypeEnum.BANK) {
                String bankName = bankMap.get(capitalAccountDetail.getBankId());
                capitalAccountDetail.setBankName(bankName);
            }
        }
        findResponse.setResult(capitalAccountDetails);
        findResponse.setTotalCount(capitalAccountFindResponse.getTotalCount());
        return findResponse;
    }
    CurrencyChartSearchResponse apiLedgerCurrencyChartSearch(JSONObject jsonObject, Passport passport) {
        CurrencyChartSearchRequest currencyChartSearchRequest = JSON.toJavaObject(jsonObject, CurrencyChartSearchRequest.class);
        return ledgerHelper.searchCurrencyChart(currencyChartSearchRequest, passport);
    }
}