package com.mzl.flower.service; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mzl.flower.base.cache.MarkupCacheClient; import com.mzl.flower.base.cache.StringCacheClient; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.PriceDTO; import com.mzl.flower.dto.response.payment.OrderSalesItemChargeDTO; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.flower.*; import com.mzl.flower.entity.menber.Member; import com.mzl.flower.entity.partner.Partner; import com.mzl.flower.entity.payment.FeeService; import com.mzl.flower.entity.payment.OrderItemSales; import com.mzl.flower.entity.payment.OrderSalesItem; import com.mzl.flower.entity.supplier.Supplier; import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.mapper.flower.FlowerCategoryMapper; import com.mzl.flower.mapper.member.MemberMapper; import com.mzl.flower.mapper.partner.PartnerMapper; import com.mzl.flower.mapper.supplier.SupplierMapper; import com.mzl.flower.mapper.system.UserMapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2RefreshToken; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; import static java.time.format.DateTimeFormatter.BASIC_ISO_DATE; @Service public class BaseService { @Autowired protected UserMapper userMapper; @Autowired protected RedisTemplate stringRedisTemplate; @Autowired protected SupplierMapper supplierMapper; @Autowired protected PartnerMapper partnerMapper; @Autowired protected CustomerMapper customerMapper; @Autowired protected MarkupCacheClient markupCacheClient; @Autowired private FlowerCategoryMapper flowerCategoryMapper; @Autowired private MemberMapper memberMapper; protected Member getMember(Long levelId){ return memberMapper.selectById(levelId); } @Autowired private StringCacheClient stringCacheClient; @Autowired private TokenStore tokenStore; public static final String TOKEN_KEY = "TOKEN-KEY"; public static final String SEPARATOR = ":"; protected double getServiceFeeRate(List fees, Integer saleCount){ int sc = saleCount == null ? 0 : saleCount; double rate = 0D; if(fees != null && fees.size() > 0){ for(FeeService f : fees){ Integer lowerNum = f.getLowerNum();//下限 Integer upperNum = f.getUpperNum();//上限 Double feeRate = f.getFeeRate();//费率 % if (lowerNum == null && upperNum == null) { continue; } if (lowerNum == null) { if(sc <= upperNum){ rate = feeRate; break; } } else if (upperNum == null) { if(sc > lowerNum){ rate = feeRate; break; } } else if (sc <= upperNum && sc > lowerNum) { rate = feeRate; break; } } } return rate; } protected void prepareSalesAmount(OrderItemSales s , Map supplierSalesMap , Map partnerSalesMap , Map platformSalesMap){ String orderItemId = s.getOrderItemId(); if (supplierSalesMap != null) { BigDecimal feeSupplier = s.getFeeSupplier(); BigDecimal b = supplierSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } supplierSalesMap.put(orderItemId, b.add(feeSupplier)); } if (partnerSalesMap != null) { BigDecimal feePartner = s.getFeePartner(); BigDecimal b = partnerSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } partnerSalesMap.put(orderItemId, b.add(feePartner)); } if (platformSalesMap != null) { BigDecimal feePlatform = getAmount(s.getFeePlatform()); BigDecimal feePlatformPack = getAmount(s.getFeePlatformPack()); BigDecimal feePlatformCheck = getAmount(s.getFeePlatformCheck()); BigDecimal feePlatformTransport = getAmount(s.getFeePlatformTransport()); BigDecimal feePackingTransport = getAmount(s.getFeePackingTransport()); BigDecimal b = platformSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } b = b.add(feePlatform).add(feePlatformPack).add(feePlatformCheck) .add(feePlatformTransport).add(feePackingTransport); platformSalesMap.put(orderItemId, b); } } protected BigDecimal getAmount(BigDecimal amount){ return amount == null ? new BigDecimal(0) : amount; } protected void prepareSalesAmount(OrderSalesItem s , Map supplierSalesMap , Map partnerSalesMap , Map platformSalesMap){//旧 String orderItemId = s.getOrderItemId(); String chargePersons = s.getChargePersons(); List charges = parseArray(chargePersons, OrderSalesItemChargeDTO.class); if(charges != null && charges.size() > 0){ for(OrderSalesItemChargeDTO c : charges){ BigDecimal amount = c.getAmount() == null ? new BigDecimal(0) : c.getAmount(); setChargePersonAmount(orderItemId, c.getPersonInCharge(), supplierSalesMap , partnerSalesMap, platformSalesMap, amount); } } else { BigDecimal amount = s.getAmount() == null ? new BigDecimal(0) : s.getAmount(); setChargePersonAmount(orderItemId, s.getPersonInCharge(), supplierSalesMap , partnerSalesMap, platformSalesMap, amount); } } private void setChargePersonAmount(String orderItemId, String personInCharge , Map supplierSalesMap , Map partnerSalesMap , Map platformSalesMap , BigDecimal amount){//旧 if (Constants.CHARGE_PERSON.supplier.name().equals(personInCharge)) { if (supplierSalesMap == null) { return; } BigDecimal b = supplierSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } supplierSalesMap.put(orderItemId, b.add(amount)); } else if (Constants.CHARGE_PERSON.partner.name().equals(personInCharge)) { if (partnerSalesMap == null) { return; } BigDecimal b = partnerSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } partnerSalesMap.put(orderItemId, b.add(amount)); } else if (Constants.CHARGE_PERSON.platform.name().equals(personInCharge)) { if (platformSalesMap == null) { return; } BigDecimal b = platformSalesMap.get(orderItemId); if (b == null) { b = new BigDecimal(0); } platformSalesMap.put(orderItemId, b.add(amount)); } } protected BigDecimal getFinalPrice(Long partnerId, Long categoryId, Long flowerId, BigDecimal price, String level){ PriceDTO dto = getFinalPriceDTO(partnerId, categoryId, flowerId, price, level); return dto.getPrice(); } protected PriceDTO getFinalPriceDTO(Long partnerId, Long categoryId, Long flowerId, BigDecimal price, String level){ PriceDTO dto = new PriceDTO(); dto.setOrgPrice(price); List plList = markupCacheClient.getMarkupPl(); BigDecimal fp = new BigDecimal(0); fp = fp.add(price); if(plList != null && plList.size() > 0){//区间加价 BigDecimal b = new BigDecimal(0); for(FlowerMarkupPl pl : plList){ BigDecimal lowerPrice = pl.getLowerPrice(); BigDecimal upperPrice = pl.getUpperPrice(); if(lowerPrice == null && upperPrice == null){ continue; } if (lowerPrice == null) { if(fp.compareTo(upperPrice) <= 0) { b = pl.getFee(); break; } } else if (upperPrice == null) { if(fp.compareTo(lowerPrice) > 0){ b = pl.getFee(); break; } } else if (fp.compareTo(upperPrice) <= 0 && fp.compareTo(lowerPrice) > 0) { b = pl.getFee(); break; } } fp = fp.add(getAmount(b)); dto.setFirstFee(b); } if(partnerId != null){//二次加价和合伙人加价 FlowerCategory fc = flowerCategoryMapper.selectById(categoryId); Long fcpId = fc == null ? null : fc.getParentId(); FlowerMarkupPsSpCg ppsc = null; if(fcpId != null){//父类加价 ppsc = markupCacheClient.getMarkupPsSpCg(partnerId, fcpId); } FlowerMarkupPsSpCg psc = markupCacheClient.getMarkupPsSpCg(partnerId, categoryId); FlowerMarkupPsSp ps = markupCacheClient.getMarkupPsSp(partnerId, flowerId); BigDecimal b = new BigDecimal(0); if(ps != null){ b = ps.getFee(); } else if (psc != null) { switch (level) { case "A": b = psc.getLevelA(); break; case "B": b = psc.getLevelB(); break; case "C": b = psc.getLevelC(); break; case "D": b = psc.getLevelD(); break; case "E": b = psc.getLevelE(); break; case "O": b = psc.getLevelO(); break; } } else if (ppsc != null) { switch (level) { case "A": b = ppsc.getLevelA(); break; case "B": b = ppsc.getLevelB(); break; case "C": b = ppsc.getLevelC(); break; case "D": b = ppsc.getLevelD(); break; case "E": b = ppsc.getLevelE(); break; case "O": b = ppsc.getLevelO(); break; } } fp = fp.add(getAmount(b)); dto.setSecondFee(b); FlowerMarkupSpCg fmpsc = null; if(fcpId != null){//父类加价 fmpsc = markupCacheClient.getMarkupSpCg(partnerId, fcpId); } FlowerMarkupSpCg sc = markupCacheClient.getMarkupSpCg(partnerId, categoryId); FlowerMarkupSp s = markupCacheClient.getMarkupSp(partnerId, flowerId); b = new BigDecimal(0); if(s != null){ b = s.getFee(); } else if (sc != null) { switch (level) { case "A": b = sc.getLevelA(); break; case "B": b = sc.getLevelB(); break; case "C": b = sc.getLevelC(); break; case "D": b = sc.getLevelD(); break; case "E": b = sc.getLevelE(); break; case "O": b = sc.getLevelO(); break; } } else if (fmpsc != null) { switch (level) { case "A": b = fmpsc.getLevelA(); break; case "B": b = fmpsc.getLevelB(); break; case "C": b = fmpsc.getLevelC(); break; case "D": b = fmpsc.getLevelD(); break; case "E": b = fmpsc.getLevelE(); break; case "O": b = fmpsc.getLevelO(); break; } } fp = fp.add(getAmount(b)); dto.setPartnerFee(b); } dto.setPrice(fp); return dto; } protected BigDecimal getFinalPriceForPartner(Long partnerId, Long categoryId, Long flowerId, BigDecimal price, String level){ List plList = markupCacheClient.getMarkupPl(); BigDecimal fp = new BigDecimal(0); fp = fp.add(price); if(plList != null && plList.size() > 0){//区间加价 BigDecimal b = new BigDecimal(0); for(FlowerMarkupPl pl : plList){ BigDecimal lowerPrice = pl.getLowerPrice(); BigDecimal upperPrice = pl.getUpperPrice(); if(lowerPrice == null && upperPrice == null){ continue; } if (lowerPrice == null) { if(fp.compareTo(upperPrice) <= 0) { b = pl.getFee(); break; } } else if (upperPrice == null) { if(fp.compareTo(lowerPrice) > 0){ b = pl.getFee(); break; } } else if (fp.compareTo(upperPrice) <= 0 && fp.compareTo(lowerPrice) > 0) { b = pl.getFee(); break; } } fp = fp.add(getAmount(b)); } //二次加价 FlowerCategory fc = flowerCategoryMapper.selectById(categoryId); Long fcpId = fc == null ? null : fc.getParentId(); FlowerMarkupPsSpCg ppsc = null; if(fcpId != null){//父类加价 ppsc = markupCacheClient.getMarkupPsSpCg(partnerId, fcpId); } FlowerMarkupPsSpCg psc = markupCacheClient.getMarkupPsSpCg(partnerId, categoryId); FlowerMarkupPsSp ps = markupCacheClient.getMarkupPsSp(partnerId, flowerId); BigDecimal b = new BigDecimal(0); if(ps != null){ b = ps.getFee(); } else if (psc != null) { switch (level) { case "A": b = psc.getLevelA(); break; case "B": b = psc.getLevelB(); break; case "C": b = psc.getLevelC(); break; case "D": b = psc.getLevelD(); break; case "E": b = psc.getLevelE(); break; case "O": b = psc.getLevelO(); break; } } else if (ppsc != null) { switch (level) { case "A": b = ppsc.getLevelA(); break; case "B": b = ppsc.getLevelB(); break; case "C": b = ppsc.getLevelC(); break; case "D": b = ppsc.getLevelD(); break; case "E": b = ppsc.getLevelE(); break; case "O": b = ppsc.getLevelO(); break; } } fp = fp.add(getAmount(b)); return fp; } protected Long getCurrentCustomerPartner(){ Customer p = getCurrentCustomerWithoutCheck(); return p == null ? null : p.getPartnerId(); } protected Customer getCurrentCustomerWithoutCheck(){ String userId = SecurityUtils.getUserId(); Customer p = customerMapper.selectOne(new QueryWrapper() .eq("user_id", userId)); return p; } protected Customer getCurrentCustomer(){ Customer p = getCurrentCustomerWithoutCheck(); if(p == null){ throw new ValidationException("客户不存在"); } return p; } /** * 计算会员单价 * * @param price * @param member * @return */ protected BigDecimal calculateMemberPrice(BigDecimal price, Member member){ if(price == null || member == null){ return price; } BigDecimal r = price; String discountType = member.getDiscountType(); if(Constants.DISCOUNT_TYPE.ratio.name().equals(discountType)){ BigDecimal discountRatio = getAmount(member.getDiscountRatio()); r = price.multiply(discountRatio).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); } else if (Constants.DISCOUNT_TYPE.amount.name().equals(discountType)){ BigDecimal discountAmount = getAmount(member.getDiscountAmount()); r = price.subtract(discountAmount); } if(r.doubleValue() < 0){ r = new BigDecimal(0); } return r; } protected Customer getCustomerByUserId(String userId){ Customer p = customerMapper.selectOne(new QueryWrapper() .eq("user_id", userId)); if(p == null){ throw new ValidationException("客户不存在"); } return p; } protected Customer getCustomer(Long id){ Customer p = customerMapper.selectById(id); if(p == null){ throw new ValidationException("商户不存在"); } return p; } public Partner getCurrentPartner(){ String userId = SecurityUtils.getUserId(); Partner p = partnerMapper.selectOne(new QueryWrapper() .eq("user_id", userId)); if(p == null){ throw new ValidationException("合伙人信息未认证,请到个人中心进行认证"); } return p; } public Supplier getCurrentSupplier(){ String userId = SecurityUtils.getUserId(); Supplier s = supplierMapper.selectOne(new QueryWrapper() .eq("user_id", userId)); if(s == null){ throw new ValidationException("供应商信息未认证,请到个人中心进行认证"); } return s; } protected String formatTime(LocalDateTime start, LocalDateTime end){ long s = start.toEpochSecond(ZoneOffset.UTC); long e = end.toEpochSecond(ZoneOffset.UTC); long du = e - s; long m = du / 60; if(m == 0){ return du + "秒"; } long dl = du % 60; long h = m / 60; if(h == 0){ return m + "分钟" + dl + "秒"; } long ml = m % 60; long d = h / 24; if(d == 0){ return h + "小时" + ml + "分钟" + dl + "秒"; } long hl = h % 24; return d + "天" + hl + "小时" + ml + "分钟" + dl + "秒"; } public String format(ZonedDateTime dateTime, String format) { if (dateTime == null || format == null) { return null; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format).withZone(ZoneId.of("Asia/Shanghai")); return dateTimeFormatter.format(dateTime); } public String format(LocalDateTime dateTime, String format) { if (dateTime == null || format == null) { return null; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format).withZone(ZoneId.of("Asia/Shanghai")); return dateTimeFormatter.format(dateTime); } protected LocalDateTime parseLocalDateTime(final String dateStr, String format) { if (StringUtils.isBlank(dateStr)) { return null; } DateTimeFormatter dateTimeFormatter = BASIC_ISO_DATE; if (StringUtils.isNotBlank(format)) { dateTimeFormatter = DateTimeFormatter.ofPattern(format); } return LocalDateTime.parse(dateStr,dateTimeFormatter); } public LocalDate parseLocalDate(final String dateStr){ if(StringUtils.isEmpty(dateStr)){ return null; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse(dateStr, dateTimeFormatter); return date; } public LocalDateTime parseLocalDateTime(final String dateStr, final boolean isStart) { return parseLocalDateTime(dateStr, isStart, "yyyy-MM-dd"); } protected LocalDateTime parseLocalDateTime(final String dateStr, final boolean isStart, String format) { LocalDateTime dateTime = null; if (StringUtils.isNotBlank(dateStr)) { DateTimeFormatter dateTimeFormatter = BASIC_ISO_DATE; if (StringUtils.isNotBlank(format)) { dateTimeFormatter = DateTimeFormatter.ofPattern(format); } LocalDate date = LocalDate.parse(dateStr, dateTimeFormatter); if (isStart) { dateTime = date.atTime(0, 0, 0); } else { dateTime = date.atTime(23, 59, 59); } } return dateTime; } protected LocalDateTime parseLocalDateTime(final String dateStr, int hour , int minute, int second, long plusDays) { LocalDateTime dateTime = null; if (StringUtils.isNotBlank(dateStr)) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse(dateStr, dateTimeFormatter).plusDays(plusDays); dateTime = date.atTime(hour, minute, second); } return dateTime; } protected LocalDateTime parseLocalDateTime(String dateStr){ if(StringUtils.isEmpty(dateStr)){ return null; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return LocalDateTime.parse(dateStr, dateTimeFormatter); } protected List splitParam(String param) { if (StringUtils.isNotEmpty(param)) { String[] params = param.split(","); List levelList = new ArrayList<>(); for (String l : params) { levelList.add(l.trim()); } return levelList; } return null; } protected List parseArray(String text, Class clazz) { List result = new ArrayList<>(); if(StringUtils.isNotEmpty(text)){ try { result = JSON.parseArray(text, clazz); }catch (Exception e){ } } return result; } protected String toJSONString(Object o){ try{ return JSON.toJSONString(o); }catch (Exception e){ } return null; } protected T parseObject(String text, Class clazz){ try{ return JSON.parseObject(text, clazz); }catch (Exception e){ } return null; } public void removeToken(String userId) { String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + userId); if (StringUtils.isNotBlank(tokenCache)) { //强制删除token,下线 if (StringUtils.isNotBlank(tokenCache) && StringUtils.isNotBlank(userId)) { stringCacheClient.delete(TOKEN_KEY + SEPARATOR + userId); String tokenValue = tokenCache.replace(OAuth2AccessToken.BEARER_TYPE, StrUtil.EMPTY).trim(); OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue); if (accessToken != null && StringUtils.isNotBlank(accessToken.getValue())) { tokenStore.removeAccessToken(accessToken); OAuth2RefreshToken refreshToken = accessToken.getRefreshToken(); tokenStore.removeRefreshToken(refreshToken); } } } } }