123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- 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<String> 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<TbCarNoColor> freeList = tbCarNoColorService.getFreeColor();
- List<String> 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<TbBusinessItem> items;
- if (TbBusiness.BusinessType.HOLD_CAR.getCode().equals(businessType)) {
- items = tbBusinessItemService.findByBusinessId(businessId);
- } else {
- List<TbBusiness> 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<TbBusinessCar> 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);
- }
- }
- }
|