You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
11 KiB
268 lines
11 KiB
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<HighGasDiscountOilPrice> 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<HighGasDiscountOilPrice> list = highGasDiscountOilPriceMapper.selectByExample(example);
|
|
if (list.size() > 0) {
|
|
return list.get(0);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public List<HighGasDiscountOilPrice> getList(Map<String,Object> 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;
|
|
}
|
|
}
|
|
|