package com.pj.api.open.service; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.date.DateUtil; import cn.hutool.core.img.ImgUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.pj.api.open.ResultJson; import com.pj.api.open.bo.CheckCarNumberBO; import com.pj.api.open.bo.InRecordBO; import com.pj.constants.UserTypeEnum; import com.pj.current.config.SystemObject; import com.pj.current.task.TaskService; import com.pj.project.tb_business.BusinessMessageManager; import com.pj.project.tb_business.TbBusiness; import com.pj.project.tb_business.TbBusinessService; import com.pj.project.tb_business_car.TbBusinessCar; import com.pj.project.tb_business_car.TbBusinessCarService; import com.pj.project.tb_business_item.TbBusinessItem; import com.pj.project.tb_business_item.TbBusinessItemService; import com.pj.project.tb_business_people.TbBusinessPeople; import com.pj.project.tb_business_people.TbBusinessPeopleService; import com.pj.project.tb_car.TbCar; import com.pj.project.tb_car.TbCarService; import com.pj.project.tb_car_no_color.TbCarNoColor; import com.pj.project.tb_car_no_color.TbCarNoColorService; import com.pj.project4sp.uploadfile.UploadConfig; import com.pj.utils.cache.RedisUtil; import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import sun.misc.BASE64Decoder; import javax.annotation.Resource; import javax.xml.crypto.Data; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @Service @Transactional @Slf4j public class OpenService { @Resource @Lazy private TbBusinessService tbBusinessService; @Resource @Lazy private TbBusinessCarService tbBusinessCarService; @Resource @Lazy private TbBusinessItemService tbBusinessItemService; @Resource private TbCarService tbCarService; @Resource TaskService taskService; @Resource TbCarNoColorService tbCarNoColorService; @Resource private TbBusinessPeopleService tbBusinessPeopleService; private final List CAR_LIST = StrUtil.splitTrim("浙,粤,京,津,冀,晋,蒙,辽,黑,沪,吉,苏,皖,赣,鲁,豫,鄂,湘,桂,琼,渝,川,贵,云,藏, 陕, 甘, 青, 宁", ","); public ResultJson checkCarNumber(CheckCarNumberBO checkCarNumberBO) { String carNo = checkCarNumberBO.getCarNumber(); int inOrOut = checkCarNumberBO.getInOrOut(); String image = checkCarNumberBO.getImageData(); if (inOrOut == 1) { handlerIn(carNo, checkCarNumberBO.getChannelName(), image); return ResultJson.success(); } return handlerOut(carNo, checkCarNumberBO.getChannelName(), image); } private void handlerIn(String carNo, String channel, String image) { carNo = carNo.toUpperCase(); TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo); Date now = new Date(); TbCar tbCar = tbCarService.findByCardNo(carNo); boolean bindBusiness = false; if (tbBusinessCar != null) { bindBusiness = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId()).size() > 0; } if (tbBusinessCar == null || (tbBusinessCar.getRealInTime() != null && tbBusinessCar.getRealOutTime() != null && bindBusiness) || tbBusinessCar.getPay() == 1) { tbBusinessCar = new TbBusinessCar(); tbBusinessCar.setCarNo(carNo).setPay(0).setCarSize(0D).setIsLock(0).setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时") .setInChannel(channel).setRealInTime(now).setBasePartMoney(new BigDecimal("0")).setTimeUpdate(now) .setNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + RandomUtil.randomNumbers(4)); tbBusinessCarService.save(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 1); return; } tbBusinessCar.setRealInTime(now).setInChannel(channel).setTimeUpdate(now) .setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时"); tbBusinessCarService.saveOrUpdate(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 1); if (!CAR_LIST.contains(carNo)) { TbBusiness tbBusiness = tbBusinessService.getById(tbBusinessCar.getBusinessId()); if (tbBusiness != null) { tbBusiness.setRealInTime(now).setInChannel(channel); tbBusinessService.updateById(tbBusiness); } } } private void CoverBase64ToUrl(String base64image, String carId, int inOrOut) { if (StrUtil.isEmpty(base64image)) { return; } taskService.addTask(new CoverBase64ToImageTask("=======" + carId + "", 2000, carId, base64image, inOrOut)); } private ResultJson handlerOut(String carNo, String channel, String image) { carNo = carNo.toUpperCase(); TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo); if (tbBusinessCar == null || tbBusinessCar.getRealInTime() == null || tbBusinessCar.getRealOutTime() != null) { log.error("请求返回【未查询到入场记录】:{}", carNo); return ResultJson.error("未查询到入场记录"); } Date now = new Date(); Integer businessType = tbBusinessCar.getBusinessType(); //判断是否蓝色车牌===免停车费 if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) { List freeList = tbCarNoColorService.getFreeColor(); List colorList = freeList.stream().map(f -> f.getCarNoColor().substring(0, 1)).collect(Collectors.toList()); String color = tbBusinessCar.getColor().substring(0, 1); if (colorList.contains(color)) { tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel); tbBusinessCarService.updateById(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 2); RedisUtil.del(channel); log.error("请求返回【放行】:{}", carNo); return ResultJson.success(); } } //是否行政车辆===== if (checkFree(carNo, 2, now)) { tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel); tbBusinessCarService.updateById(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 2); RedisUtil.del(channel); log.error("请求返回【放行】:{}", carNo); return ResultJson.success(); } if (tbBusinessCar.getIsLock() == 1) { RedisUtil.setByMINUTES(channel, carNo, 2); log.error("请求返回:车辆已锁定:{}", carNo); return ResultJson.error("车辆已锁定"); } String carNoStr = carNo.substring(0, 1); Date inTime = tbBusinessCar.getRealInTime(); if (tbBusinessCar.getPay() == 1 && tbBusinessCar.getRealOutTime() == null && tbBusinessCar.getPayTime() != null) { inTime = tbBusinessCar.getPayTime(); } BigDecimal price = tbBusinessService.calculationPartMoney(inTime, now); //越南车牌,整车业务免停车费 if (!CAR_LIST.contains(carNoStr) && TbBusiness.BusinessType.HOLD_CAR.getCode().equals(businessType)) { price = new BigDecimal("0"); } double dif = price.doubleValue(); if (dif > 0) { RedisUtil.setByMINUTES(channel, carNo, 1); log.error("请求返回:请缴停车费:{},{}元", carNo, dif); return ResultJson.error("请缴停车费" + dif + "元"); } //无业务费用车辆=== if (TbBusiness.BusinessType.NO_BUSINESS.getCode().equals(businessType)) { tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now); tbBusinessCarService.updateById(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 2); RedisUtil.del(channel); log.error("请求返回【放行】:{}", carNo); return ResultJson.success(); } //============业务费计算是否交完 String businessId = tbBusinessCar.getBusinessId(); List items; if (TbBusiness.BusinessType.HOLD_CAR.getCode().equals(businessType)) { items = tbBusinessItemService.findByBusinessId(businessId); } else { List businessList = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId()); items = tbBusinessItemService.findByBusinessIdList(businessList.stream().map(TbBusiness::getId).collect(Collectors.toList())); } long count = items.stream().filter(tbBusinessItem -> tbBusinessItem.getPayStatus() == 0).count(); if (count > 0) { RedisUtil.setByMINUTES(channel, carNo, 1); log.error("请求返回:请缴纳业务费用:{}", carNo); return ResultJson.error("请缴纳业务费用"); } tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now); tbBusinessCarService.updateById(tbBusinessCar); CoverBase64ToUrl(image, tbBusinessCar.getId(), 2); RedisUtil.del(channel); return ResultJson.success(); } private boolean checkFree(String carNo, int inOrOut, Date now) { TbCar tbCar = tbCarService.findByCardNo(carNo); if (tbCar != null) { if (inOrOut == 1) { tbCar.setLastInTime(now); } else { tbCar.setLastOutTime(now); } tbCarService.updateById(tbCar); } return tbCar != null && !TbCar.CarTypeEnum.BUSINESS_CAR.getType().equals(tbCar.getCarType()); } public void handlerInRecord(InRecordBO inRecordBO) { String carNo = inRecordBO.getCarNumber().trim().toUpperCase(); // 入场==>取车牌颜色 List cars = tbBusinessCarService.findByCarNo(carNo); cars.stream().filter(obj -> StrUtil.isEmpty(obj.getColor())) .forEach(tbBusinessCar -> { tbBusinessCar.setColor(inRecordBO.getCarColor()); tbBusinessCarService.updateById(tbBusinessCar); }); if (cars.isEmpty()) { //handlerIn(carNo, inRecordBO.getChannelName(), null); } } }