| package com.doumee.service.business.impl; | 
|   | 
| import com.doumee.core.constants.Constants; | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.model.LoginUserInfo; | 
| import com.doumee.core.model.PageData; | 
| import com.doumee.core.model.PageWrap; | 
| import com.doumee.core.utils.Utils; | 
| import com.doumee.dao.business.BaseParamMapper; | 
| import com.doumee.dao.business.PricingDetailMapper; | 
| import com.doumee.dao.business.join.PricingDetailJoinMapper; | 
| import com.doumee.dao.business.model.BaseParam; | 
| import com.doumee.dao.business.model.PricingDetail; | 
| import com.doumee.service.business.BaseParamService; | 
| import com.doumee.service.business.PricingDetailService; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
|   | 
| import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
| import org.apache.commons.collections.MapUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.apache.shiro.SecurityUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.util.CollectionUtils; | 
| import sun.text.resources.et.CollationData_et; | 
|   | 
| import java.math.BigDecimal; | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 定价方案明细配置Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2023/09/27 18:06 | 
|  */ | 
| @Service | 
| public class PricingDetailServiceImpl implements PricingDetailService { | 
|   | 
|     @Autowired | 
|     private PricingDetailMapper pricingDetailMapper; | 
|   | 
|     @Autowired | 
|     PricingDetailJoinMapper pricingDetailJoinMapper; | 
|   | 
|     @Autowired | 
|     BaseParamMapper baseParamMapper; | 
|   | 
|   | 
|     @Override | 
|     public String create(PricingDetail pricingDetail) { | 
|   | 
|         //校验参数合法性 | 
|         checkPricingDetail(pricingDetail); | 
|   | 
|         LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); | 
|         UpdateWrapper<PricingDetail> wrapper = new UpdateWrapper<>(); | 
|         wrapper.lambda() | 
|                 .set(PricingDetail::getIsdeleted,Constants.ONE) | 
|                 .set(PricingDetail::getEditDate,new Date()) | 
|                 .set(PricingDetail::getEditor,principal.getId()) | 
|                 .eq(PricingDetail::getBikeTypeId,pricingDetail.getBikeTypeId()) | 
|                 .eq(PricingDetail::getPricePramId,pricingDetail.getPricePramId()); | 
|         pricingDetailMapper.update(null, wrapper);//删除老的配置 | 
|   | 
|         PricingDetail insert = new PricingDetail(); | 
|         insert.setId(Constants.getUUID()); | 
|         insert.setCreateDate(new Date()); | 
|         insert.setCreator(principal.getId()); | 
|         insert.setIsdeleted(Constants.ZERO); | 
|         insert.setPricePramId(pricingDetail.getPricePramId()); | 
|         insert.setBikeTypeId(pricingDetail.getBikeTypeId()); | 
|         insert.setBaseTime(pricingDetail.getBaseTime()); | 
|         insert.setUnitTime(pricingDetail.getUnitTime()); | 
|         insert.setHolidayBaseTime(pricingDetail.getHolidayBaseTime()); | 
|         insert.setHolidayUnitTime(pricingDetail.getHolidayUnitTime()); | 
|         insert.setBasePrice(Constants.formatDecimalNum(pricingDetail.getBasePrice()).multiply(new BigDecimal(100))); | 
|         insert.setUnitPrice(Constants.formatDecimalNum(pricingDetail.getUnitPrice()).multiply(new BigDecimal(100))); | 
|         insert.setHolidayBasePrice(Constants.formatDecimalNum(pricingDetail.getHolidayBasePrice()).multiply(new BigDecimal(100))); | 
|         insert.setHolidayUnitPrice(Constants.formatDecimalNum(pricingDetail.getHolidayUnitPrice()).multiply(new BigDecimal(100))); | 
|         insert.setInfo(pricingDetail.getInfo()); | 
|         String title = getRoleNameByParam(pricingDetail.getBasePrice(),pricingDetail.getBaseTime(),pricingDetail.getUnitPrice(),pricingDetail.getUnitTime()); | 
|         String info = getRoleNameByParam(pricingDetail.getHolidayBasePrice(),pricingDetail.getHolidayBaseTime(),pricingDetail.getHolidayUnitPrice(),pricingDetail.getHolidayUnitTime());; | 
|         insert.setTitle(title);//工作日计价配置规则 | 
|         insert.setInfo(info);//节假日计价配置规则 | 
|         pricingDetailMapper.insert(insert); | 
|         return pricingDetail.getId(); | 
|     } | 
|   | 
|     public static  String getRoleNameByParam(BigDecimal basePrice, Integer baseTime, BigDecimal unitPrice, Integer unitTime) { | 
|         String title = "计费规则:"; | 
|         if(baseTime < 0){ | 
|             title = (basePrice.divide(new BigDecimal(100))).doubleValue()+"元畅骑一整天"; | 
|         }else { | 
|             title = "起步"; | 
|             int time = baseTime / 60; | 
|             int min = baseTime % 60; | 
|             if(time > 0){ | 
|                 title += time+"小时"; | 
|             } | 
|             if(min >0){ | 
|                 title += min+"分钟"; | 
|             } | 
|             title += basePrice.doubleValue() | 
|                     +"元,超过后"+unitPrice.doubleValue()+"元/" | 
|                     +unitTime+"分钟"; | 
|         } | 
|         return  title; | 
|     } | 
|   | 
|     private void checkPricingDetail(PricingDetail pricingDetail){ | 
|         if(StringUtils.isBlank(pricingDetail.getPricePramId()) | 
|                 ||StringUtils.isBlank(pricingDetail.getBikeTypeId()) | 
|                 ||pricingDetail.getBaseTime() == null | 
|                 ||pricingDetail.getBaseTime()==0 | 
|                 ||Constants.formatDecimalNum(pricingDetail.getBasePrice() ).doubleValue()<0 | 
|                 ||Constants.formatDecimalNum(pricingDetail.getHolidayBasePrice() ).doubleValue()<0 | 
|                 ||pricingDetail.getHolidayBaseTime() == null | 
|                 || pricingDetail.getHolidayBaseTime()==0){ | 
|             //参数错误 | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         if (  pricingDetail.getBaseTime() < 0){ | 
|             pricingDetail.setBaseTime(-1); | 
|         } | 
|         if (  pricingDetail.getHolidayBaseTime() < 0){ | 
|             pricingDetail.setHolidayBaseTime(-1); | 
|         } | 
| //        PricingDetail exitCount = pricingDetailMapper.selectOne(wrapper); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public void deleteById(String id) { | 
|         pricingDetailMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(PricingDetail pricingDetail) { | 
|         UpdateWrapper<PricingDetail> deleteWrapper = new UpdateWrapper<>(pricingDetail); | 
|         pricingDetailMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<String> ids) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         pricingDetailMapper.deleteBatchIds(ids); | 
|     } | 
|   | 
|     @Override | 
|     public void updateById(PricingDetail pricingDetail) { | 
|         checkPricingDetail(pricingDetail); | 
|         LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); | 
|         pricingDetail.setEditDate(new Date()); | 
|         pricingDetail.setEditor(principal.getId()); | 
|         pricingDetail.setBasePrice(Constants.formatDecimalNum(pricingDetail.getBasePrice()).multiply(new BigDecimal(100))); | 
|         pricingDetail.setUnitPrice(Constants.formatDecimalNum(pricingDetail.getUnitPrice()).multiply(new BigDecimal(100))); | 
|         pricingDetail.setHolidayBasePrice(Constants.formatDecimalNum(pricingDetail.getHolidayBasePrice()).multiply(new BigDecimal(100))); | 
|         pricingDetail.setHolidayUnitPrice(Constants.formatDecimalNum(pricingDetail.getHolidayUnitPrice()).multiply(new BigDecimal(100))); | 
|   | 
|         pricingDetailMapper.updateById(pricingDetail); | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<PricingDetail> pricingDetails) { | 
|         if (CollectionUtils.isEmpty(pricingDetails)) { | 
|             return; | 
|         } | 
|         for (PricingDetail pricingDetail: pricingDetails) { | 
|             this.updateById(pricingDetail); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public PricingDetail findById(String id) { | 
|         PricingDetail model =  pricingDetailMapper.selectById(id); | 
|         if(model !=null ){ | 
|             model.setBasePrice(Constants.translateMoney(model.getBasePrice())); | 
|             model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice())); | 
|             model.setUnitPrice(Constants.translateMoney(model.getUnitPrice())); | 
|             model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice())); | 
|         } | 
|         return model; | 
|     } | 
|   | 
|     @Override | 
|     public PricingDetail findOne(PricingDetail pricingDetail) { | 
|         QueryWrapper<PricingDetail> wrapper = new QueryWrapper<>(pricingDetail); | 
|         PricingDetail model =  pricingDetailMapper.selectOne(wrapper.last(" limit 1")); | 
|         if(model !=null ){ | 
|             model.setBasePrice(Constants.translateMoney(model.getBasePrice())); | 
|             model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice())); | 
|             model.setUnitPrice(Constants.translateMoney(model.getUnitPrice())); | 
|             model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice())); | 
|         } | 
|         return model; | 
|     } | 
|   | 
|     @Override | 
|     public List<PricingDetail> findList(PricingDetail pricingDetail) { | 
|         MPJLambdaWrapper<PricingDetail> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.eq(PricingDetail::getPricePramId,pricingDetail.getPricePramId()) | 
|                 .eq(PricingDetail::getIsdeleted,Constants.ZERO); | 
|         wrapper.rightJoin(BaseParam.class,BaseParam::getId,PricingDetail::getBikeTypeId); | 
|         wrapper.selectAll(PricingDetail.class) | 
|                 .selectAs(BaseParam::getId,PricingDetail::getBikeTypeId) | 
|                 .selectAs(BaseParam::getName,PricingDetail::getBikeTypeName); | 
|         List<PricingDetail> result = pricingDetailJoinMapper.selectJoinList(PricingDetail.class,wrapper); | 
|   | 
|         Map<String, PricingDetail> stringPricingDetailMap = Optional.ofNullable(result) | 
|                                                                     .map(s -> s.stream().collect(Collectors.toMap(p -> p.getBikeTypeId(), p -> p))) | 
|                                                                     .orElse(new HashMap<>()); | 
|         QueryWrapper<BaseParam> baseParamQuery = new QueryWrapper(); | 
|         baseParamQuery.lambda() | 
|                        .eq(BaseParam::getIsdeleted,Constants.ZERO) | 
|                        .eq(BaseParam::getType,Constants.THREE) | 
|                         .orderByAsc(BaseParam::getSortnum); | 
|         List<BaseParam> list = baseParamMapper.selectList(baseParamQuery); | 
|         if (CollectionUtils.isEmpty(list)){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"内置数据确实"); | 
|         } | 
|   | 
|         List<PricingDetail> collect = list.stream().map(s -> { | 
|             PricingDetail put = stringPricingDetailMap.getOrDefault(s.getId(), new PricingDetail()); | 
|             put.setBikeTypeId(s.getId()); | 
|             put.setPricePramId(pricingDetail.getPricePramId()); | 
|             put.setBikeTypeName(s.getName()); | 
|             put.setSortnum(s.getSortnum()); | 
|             put.setBasePrice(Objects.nonNull(put.getBasePrice()) ? Constants.translateMoney(put.getBasePrice()) : null); | 
|             put.setHolidayBasePrice(Objects.nonNull(put.getHolidayBasePrice()) ? Constants.translateMoney(put.getHolidayBasePrice()):null); | 
|             put.setUnitPrice(Objects.nonNull(put.getUnitPrice()) ? Constants.translateMoney(put.getUnitPrice()):null); | 
|             put.setHolidayUnitPrice(Objects.nonNull(put.getHolidayUnitPrice())  ? Constants.translateMoney(put.getHolidayUnitPrice()):null); | 
|             return put; | 
|         }).collect(Collectors.toList()); | 
| //        if(result!=null){ | 
| //            for(PricingDetail model :result){ | 
| //                model.setBasePrice(Constants.translateMoney(model.getBasePrice())); | 
| //                model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice())); | 
| //                model.setUnitPrice(Constants.translateMoney(model.getUnitPrice())); | 
| //                model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice())); | 
| //            } | 
| //        } | 
|         return collect; | 
|     } | 
|   | 
|     @Override | 
|     public PageData<PricingDetail> findPage(PageWrap<PricingDetail> pageWrap) { | 
|         IPage<PricingDetail> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         QueryWrapper<PricingDetail> queryWrapper = new QueryWrapper<>(); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         if (pageWrap.getModel().getId() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getId, pageWrap.getModel().getId()); | 
|         } | 
|         if (pageWrap.getModel().getCreateDate() != null) { | 
|             queryWrapper.lambda().ge(PricingDetail::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); | 
|             queryWrapper.lambda().le(PricingDetail::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); | 
|         } | 
|         if (pageWrap.getModel().getCreator() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getCreator, pageWrap.getModel().getCreator()); | 
|         } | 
|         if (pageWrap.getModel().getEditDate() != null) { | 
|             queryWrapper.lambda().ge(PricingDetail::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); | 
|             queryWrapper.lambda().le(PricingDetail::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); | 
|         } | 
|         if (pageWrap.getModel().getEditor() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getEditor, pageWrap.getModel().getEditor()); | 
|         } | 
|         if (pageWrap.getModel().getIsdeleted() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getIsdeleted, pageWrap.getModel().getIsdeleted()); | 
|         } | 
|         if (pageWrap.getModel().getPricePramId() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getPricePramId, pageWrap.getModel().getPricePramId()); | 
|         } | 
|         if (pageWrap.getModel().getBikeTypeId() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getBikeTypeId, pageWrap.getModel().getBikeTypeId()); | 
|         } | 
|         if (pageWrap.getModel().getBaseTime() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getBaseTime, pageWrap.getModel().getBaseTime()); | 
|         } | 
|         if (pageWrap.getModel().getBasePrice() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getBasePrice, pageWrap.getModel().getBasePrice()); | 
|         } | 
|         if (pageWrap.getModel().getUnitTime() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getUnitTime, pageWrap.getModel().getUnitTime()); | 
|         } | 
|         if (pageWrap.getModel().getUnitPrice() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getUnitPrice, pageWrap.getModel().getUnitPrice()); | 
|         } | 
|         if (pageWrap.getModel().getHolidayBaseTime() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getHolidayBaseTime, pageWrap.getModel().getHolidayBaseTime()); | 
|         } | 
|         if (pageWrap.getModel().getHolidayBasePrice() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getHolidayBasePrice, pageWrap.getModel().getHolidayBasePrice()); | 
|         } | 
|         if (pageWrap.getModel().getHolidayUnitTime() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getHolidayUnitTime, pageWrap.getModel().getHolidayUnitTime()); | 
|         } | 
|         if (pageWrap.getModel().getHolidayUnitPrice() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getHolidayUnitPrice, pageWrap.getModel().getHolidayUnitPrice()); | 
|         } | 
|         if (pageWrap.getModel().getInfo() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getInfo, pageWrap.getModel().getInfo()); | 
|         } | 
|         if (pageWrap.getModel().getTitle() != null) { | 
|             queryWrapper.lambda().eq(PricingDetail::getTitle, pageWrap.getModel().getTitle()); | 
|         } | 
|         for(PageWrap.SortData sortData: pageWrap.getSorts()) { | 
|             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { | 
|                 queryWrapper.orderByDesc(sortData.getProperty()); | 
|             } else { | 
|                 queryWrapper.orderByAsc(sortData.getProperty()); | 
|             } | 
|         } | 
|         IPage<PricingDetail> result =pricingDetailMapper.selectPage(page, queryWrapper); | 
|         if(result.getRecords()!= null ){ | 
|             for(PricingDetail model : result.getRecords()){ | 
|                 model.setBasePrice(Constants.translateMoney(model.getBasePrice())); | 
|                 model.setHolidayBasePrice(Constants.translateMoney(model.getHolidayBasePrice())); | 
|                 model.setUnitPrice(Constants.translateMoney(model.getUnitPrice())); | 
|                 model.setHolidayUnitPrice(Constants.translateMoney(model.getHolidayUnitPrice())); | 
|             } | 
|         } | 
|         return PageData.from(result); | 
|     } | 
|   | 
|     @Override | 
|     public long count(PricingDetail pricingDetail) { | 
|         QueryWrapper<PricingDetail> wrapper = new QueryWrapper<>(pricingDetail); | 
|         return pricingDetailMapper.selectCount(wrapper); | 
|     } | 
| } |