package com.hai.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; import com.hai.config.TuanYouConfig; import com.hai.dao.HighGasDiscountOilPriceMapper; import com.hai.entity.HighGasDiscountOilPrice; import com.hai.entity.HighGasDiscountOilPriceExample; import com.hai.entity.HighGasOilPrice; import com.hai.entity.HighTyAgentPrice; import com.hai.model.GasPayPriceModel; import com.hai.model.HighMerchantStoreModel; import com.hai.service.*; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.util.List; import java.util.Map; @Service("gasDiscountOilPriceService") public class HighGasDiscountOilPriceServiceImpl implements HighGasDiscountOilPriceService { @Resource private HighMerchantStoreService merchantStoreService; @Resource private HighGasDiscountOilPriceService gasDiscountOilPriceService; @Resource private HighGasOilPriceService gasOilPriceService; @Resource private HighTyAgentPriceService tyAgentPriceService; @Resource private HighGasDiscountOilPriceMapper highGasDiscountOilPriceMapper; @Override public void editGasDiscountOilPrice(HighGasDiscountOilPrice highGasDiscountOilPrice) { if (highGasDiscountOilPrice.getId() != null) { highGasDiscountOilPriceMapper.updateByPrimaryKey(highGasDiscountOilPrice); } else { highGasDiscountOilPriceMapper.insert(highGasDiscountOilPrice); } } @Override public void delete(Long id) { highGasDiscountOilPriceMapper.deleteByPrimaryKey(id); } @Override public HighGasDiscountOilPrice getDetail(Long id) { return highGasDiscountOilPriceMapper.selectByPrimaryKey(id); } @Override public HighGasDiscountOilPrice getDetailByOilNo(String oilNo) { HighGasDiscountOilPriceExample example = new HighGasDiscountOilPriceExample(); example.createCriteria().andOilNoEqualTo(oilNo); List list = highGasDiscountOilPriceMapper.selectByExample(example); if (list.size() > 0) { return list.get(0); } return null; } @Override public HighGasDiscountOilPrice getDetailByOilNoName(String oilNoName) { HighGasDiscountOilPriceExample example = new HighGasDiscountOilPriceExample(); example.createCriteria().andOilNoNameEqualTo(oilNoName); List list = highGasDiscountOilPriceMapper.selectByExample(example); if (list.size() > 0) { return list.get(0); } return null; } @Override public List getList(Map map) { HighGasDiscountOilPriceExample example = new HighGasDiscountOilPriceExample(); HighGasDiscountOilPriceExample.Criteria criteria = example.createCriteria(); if (StringUtils.isNotBlank(MapUtils.getString(map, "oilNo"))) { criteria.andOilNoEqualTo(MapUtils.getString(map, "oilNo")); } if (StringUtils.isNotBlank(MapUtils.getString(map, "oilNoName"))) { criteria.andOilNoNameEqualTo(MapUtils.getString(map, "oilNoName")); } example.setOrderByClause("create_time desc"); return highGasDiscountOilPriceMapper.selectByExample(example); } @Override public GasPayPriceModel oilPriceDiscountCompute(BigDecimal oilingPrice, Long goodsId, String oilNo, Boolean isTyAgent) throws Exception { // 查询油站信息 HighMerchantStoreModel store = merchantStoreService.getMerchantStoreById(goodsId); if (store == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油站"); } // 是否是加油站 if (!store.getType().equals(1)) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油站"); } // 优惠比例 BigDecimal discount = new BigDecimal("100"); // 查询是否配置了【油站的】优惠比例 HighTyAgentPrice tyAgentPrice = tyAgentPriceService.getDetail(1, goodsId, oilNo); if (tyAgentPrice != null) { discount = tyAgentPrice.getPriceRate(); } else { // 查询是否配置了【油品】优惠比例 HighGasDiscountOilPrice gasDiscountOilPrice = gasDiscountOilPriceService.getDetailByOilNo(oilNo); if (gasDiscountOilPrice != null) { discount = gasDiscountOilPrice.getPriceRate(); } } if (isTyAgent != null && isTyAgent.equals(true)) { // 价格 HighTyAgentPrice priceRate = tyAgentPriceService.getDetail(2, goodsId, oilNo); if (priceRate != null) { discount = priceRate.getPriceRate(); } } discount = discount.divide(new BigDecimal("100")); // 枪价 BigDecimal priceGun; // 优惠价 BigDecimal priceVip; // 优惠幅度 BigDecimal preferentialMargin = new BigDecimal("0"); // 查询油站价格 HighGasOilPrice gasOilPrice = gasOilPriceService.getGasOilPriceByStoreAndOilNo(goodsId, Integer.parseInt(oilNo)); if (gasOilPrice == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油站价格"); } priceGun = gasOilPrice.getPriceGun(); priceVip = gasOilPrice.getPriceVip(); preferentialMargin = gasOilPrice.getPreferentialMargin(); // 国标价 BigDecimal priceOfficial = gasOilPrice.getPriceOfficial(); GasPayPriceModel payPriceModel = new GasPayPriceModel(); if (store.getSourceType().equals(1)) { // 嗨森逛平台价 国标价 * 折扣 BigDecimal pricePlatform = priceGun.multiply(discount).setScale(2, BigDecimal.ROUND_HALF_UP); // 加油金额 payPriceModel.setOilingPrice(oilingPrice); // 加油站枪价 payPriceModel.setPriceGun(priceGun); // 加油站优惠价 payPriceModel.setPriceVip(priceVip); // 加油站国标价 payPriceModel.setPriceOfficial(priceOfficial); // 平台价 payPriceModel.setPricePlatform(pricePlatform); // 加油升数,计算方式:加油金额 / 枪价 payPriceModel.setOilLiters(oilingPrice.divide(priceGun, 2, BigDecimal.ROUND_HALF_DOWN)); // 平台折扣,我们平台或者代理商设置的折扣 payPriceModel.setDiscount(discount.compareTo(new BigDecimal("1.00")) == 0 ? new BigDecimal("100") : discount); // 加油补贴, 计算方式:加油站枪价 - 加油站VIP价 payPriceModel.setOilSubsidy(priceGun.subtract(priceVip)); // 折扣,1 -平台折扣 BigDecimal decimal1 = new BigDecimal("1").subtract(discount); // 油枪价 - 优惠幅度 BigDecimal price = payPriceModel.getPriceGun().subtract(preferentialMargin); // 优惠价格 (油枪价 - 优惠幅度) * 系统折扣 payPriceModel.setPricePreferences(price.multiply(discount).setScale(2, BigDecimal.ROUND_HALF_UP)); // 每升优惠 枪价 - 优惠价格 payPriceModel.setLitersPreferences(priceGun.subtract(payPriceModel.getPricePreferences())); // 本次优惠 加油升数 * 每升优惠 payPriceModel.setTotalPreferences(payPriceModel.getOilLiters().multiply(payPriceModel.getLitersPreferences()).setScale(2, BigDecimal.ROUND_DOWN)); // 支付价格 加油金额 - 本次优惠 payPriceModel.setPayPrice(oilingPrice.subtract(payPriceModel.getTotalPreferences())); } else if (store.getSourceType().equals(2)) { // 查询油站油品价格 JSONObject oilPriceObject = TuanYouConfig.queryCompanyPriceDetail(store.getStoreKey(), oilNo); if (oilPriceObject == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油站价格"); } JSONArray oilPriceObjectArray = oilPriceObject.getJSONArray("result"); if (oilPriceObjectArray.size() == 0) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油站价格"); } JSONObject priceDetail = (JSONObject) oilPriceObjectArray.get(0); // 团油枪价 priceGun = priceDetail.getBigDecimal("priceGun"); // 团油优惠价 priceVip = priceDetail.getBigDecimal("priceVip"); // 嗨森逛平台价 国标价 * 折扣 BigDecimal pricePlatform = priceGun.multiply(discount).setScale(2, BigDecimal.ROUND_HALF_UP); // 加油金额 payPriceModel.setOilingPrice(oilingPrice); // 团油枪价 payPriceModel.setPriceGun(priceGun); // 团油优惠价 payPriceModel.setPriceVip(priceVip); // 团油国标价 payPriceModel.setPriceOfficial(priceOfficial); // 平台价 payPriceModel.setPricePlatform(pricePlatform); // 加油升数,计算方式:加油金额 / 枪价 payPriceModel.setOilLiters(oilingPrice.divide(priceGun, 2, BigDecimal.ROUND_HALF_DOWN)); // 平台折扣,我们平台或者代理商设置的折扣 payPriceModel.setDiscount(discount.compareTo(new BigDecimal("1.00")) == 0 ? new BigDecimal("100") : discount); // 加油补贴, 计算方式:团油枪价 - 团油VIP价 payPriceModel.setOilSubsidy(priceGun.subtract(priceVip)); // 折扣,1 -平台折扣 BigDecimal decimal1 = new BigDecimal("1").subtract(discount); // 价格差价 团油枪价 - 团油VIP价 BigDecimal oilPriceDifferences = priceGun.subtract(priceVip); // 每升优惠 团油枪价 *(1-平台折扣)+(国标价-团油VIP价 ) payPriceModel.setLitersPreferences(priceGun.multiply(decimal1).setScale(2, BigDecimal.ROUND_HALF_UP).add(oilPriceDifferences)); // 优惠价格 团油枪价 * 平台折扣 -(国标价-团油VIP价 ) payPriceModel.setPricePreferences(pricePlatform.subtract(oilPriceDifferences)); // 本次优惠 payPriceModel.setTotalPreferences(payPriceModel.getOilLiters().multiply(payPriceModel.getLitersPreferences()).setScale(2, BigDecimal.ROUND_DOWN)); // 支付价格 payPriceModel.setPayPrice(oilingPrice.subtract(payPriceModel.getTotalPreferences())); } return payPriceModel; } }