PickPayBiz.java 6.35 KB
package com.cjs.site.biz.user.pick;

import com.cjs.site.dao.user.pick.OutpropApplyPayDao;
import com.cjs.site.dao.user.pick.PickPackDao;
import com.cjs.site.model.union.CreateQrCode;
import com.cjs.site.model.union.UnionResponse;
import com.cjs.site.model.user.pick.OutpropApplyPayInfo;
import com.cjs.site.model.user.pick.OutpropApplyPickInfo;
import com.cjs.site.model.user.pick.PickPackInfo;
import com.cjs.site.util.lang.DateEnum;
import com.cjs.site.util.lang.DateUtil;
import com.cjs.site.util.lang.JsonUtil;
import com.cjs.site.util.union.UnionConstants;
import com.cjs.site.util.union.UnionPayUtil;
import com.cjs.site.util.web.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by bruce on 2019-05-06 17:22
 */
@Service
public class PickPayBiz {

    @Autowired
    private OutpropApplyPayDao outpropApplyPayDao;
    @Autowired
    private PickPackDao pickPackDao;
    @Autowired
    private PickBiz pickBiz;
    @Autowired
    @Qualifier("transactionManagerOracle")
    private DataSourceTransactionManager transactionManager;

    public Map<String, Object> createOrder(HttpSession session) {
        Map<String, Object> result = new HashMap<String, Object>();
        result.put("code", true);

        String userId = ActionUtil.getUser().getUserId();
        List<PickPackInfo> applyList = pickPackDao.queryUserPosition(userId);
        int pickTotal = 0;
        for (PickPackInfo apply : applyList) {
            if (apply.getCurrentAmount() > 0) {
                pickTotal += apply.getCurrentAmount();
            }
        }
//        BigDecimal totalAmount = new BigDecimal("0.01").multiply(new BigDecimal(DateUtil.getTrustCycle())).
//                multiply(new BigDecimal(pickTotal)).add(new BigDecimal("6"));
        BigDecimal totalAmount = new BigDecimal("0.01");//调试接口代码写死
        result.put("totalAmount", totalAmount);
        try {
            CreateQrCode createQrCode = new CreateQrCode();
            createQrCode.setQrCodeId(UnionPayUtil.getQrCodeId());
            createQrCode.setBillNo(createQrCode.getQrCodeId());
            createQrCode.setTotalAmount(String.valueOf(totalAmount.multiply(BigDecimal.valueOf(100)).intValue()));
            createQrCode.setRequestTimestamp(DateUtil.getNow());
            createQrCode.setBillDate(DateUtil.getNow(DateEnum.DATE));
            //此处拼接提货信息
            OutpropApplyPickInfo pickInfo = (OutpropApplyPickInfo) session.getAttribute("pickInfo");
            pickInfo.setCreateTime((String) session.getAttribute("pack"));//将提货方式放入createTime属性里
            createQrCode.setSrcReserve(JsonUtil.toJsonRemoveNull(pickInfo));
            @SuppressWarnings("unchecked")
            Map<String, String> mapTypes = JsonUtil.fromJson(JsonUtil.toJson(createQrCode), Map.class);
            String json = UnionPayUtil.sendPost(UnionConstants.CREATE_ORDER, mapTypes);
            UnionResponse response = JsonUtil.fromJson(json, UnionResponse.class);
            if (response != null && response.getErrCode().equals(UnionConstants.SUCCESS_CODE)) {
                result.put("qrCode", UnionPayUtil.createQrCode(createQrCode.getQrCodeId()));
                insertPickPay(userId, createQrCode.getBillNo(), createQrCode.getSrcReserve(),totalAmount.toString(),DateUtil.getTrustCycle());
            } else {
                result.put("code", false);
                result.put("msg", response.getErrMsg());
            }
        } catch (Exception e) {
            result.put("code", false);
            result.put("msg", e.getMessage());
        }
        return result;
    }

    public Boolean isValidNotify(Map<String, String> result) {
        if (UnionPayUtil.checkSign(result)) {
            if (result.get("status").equals(UnionConstants.NOTIFY_PAY_STATUS)) {
                DefaultTransactionDefinition def = new DefaultTransactionDefinition();
                def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
                TransactionStatus status = transactionManager.getTransaction(def);
                try {
                    String tradeNo = result.get("billNo");
                    OutpropApplyPayInfo info = outpropApplyPayDao.selectByTradeNo(tradeNo);
                    if (!info.getStatus().equals("2")) {
                        OutpropApplyPayInfo update = new OutpropApplyPayInfo();
                        update.setTradeNo(tradeNo);
                        update.setStatus("2");
                        outpropApplyPayDao.update(update);

                        OutpropApplyPickInfo pickInfo = JsonUtil.fromJson(result.get("srcReserve"), OutpropApplyPickInfo.class);
                        pickInfo.setClientId(info.getClientId());
                        if ("0".equals(pickInfo.getPickType()) || "1".equals(pickInfo.getPickType())) {
                            pickBiz.selfPickNew(pickInfo);
                        } else if ("2".equals(pickInfo.getPickType())) {
                            pickBiz.expressPickNew(pickInfo);
                        } else if ("3".equals(pickInfo.getPickType())) {
                            pickBiz.zhaoonlinePickNew(pickInfo);
                        }
                    }
                    transactionManager.commit(status);
                    return true;
                } catch (Exception e) {
                    transactionManager.rollback(status);
                }
            }
        }
        return false;
    }

    private void insertPickPay(String clientId, String tradeNo, String extInfo, String amount, Integer cycle) {
        OutpropApplyPayInfo insert = new OutpropApplyPayInfo();
        insert.setCreatedAt(DateUtil.getNow());
        insert.setClientId(clientId);
        insert.setStatus("1");
        insert.setTradeNo(tradeNo);
        insert.setExtInfo(extInfo);
        insert.setAmount(amount);
        insert.setTrusteeshipCycle(cycle);
        outpropApplyPayDao.insert(insert);
    }

}