OpenService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package com.pj.api.open.service;
  2. import cn.hutool.cache.CacheUtil;
  3. import cn.hutool.cache.impl.TimedCache;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.img.ImgUtil;
  6. import cn.hutool.core.io.FileUtil;
  7. import cn.hutool.core.util.RandomUtil;
  8. import cn.hutool.core.util.RandomUtil;
  9. import cn.hutool.core.util.StrUtil;
  10. import com.pj.api.open.ResultJson;
  11. import com.pj.api.open.bo.CheckCarNumberBO;
  12. import com.pj.api.open.bo.InRecordBO;
  13. import com.pj.constants.UserTypeEnum;
  14. import com.pj.current.config.SystemObject;
  15. import com.pj.current.task.TaskService;
  16. import com.pj.project.tb_business.BusinessMessageManager;
  17. import com.pj.project.tb_business.TbBusiness;
  18. import com.pj.project.tb_business.TbBusinessService;
  19. import com.pj.project.tb_business_car.TbBusinessCar;
  20. import com.pj.project.tb_business_car.TbBusinessCarService;
  21. import com.pj.project.tb_business_item.TbBusinessItem;
  22. import com.pj.project.tb_business_item.TbBusinessItemService;
  23. import com.pj.project.tb_business_people.TbBusinessPeople;
  24. import com.pj.project.tb_business_people.TbBusinessPeopleService;
  25. import com.pj.project.tb_car.TbCar;
  26. import com.pj.project.tb_car.TbCarService;
  27. import com.pj.project.tb_car_no_color.TbCarNoColor;
  28. import com.pj.project.tb_car_no_color.TbCarNoColorService;
  29. import com.pj.project4sp.uploadfile.UploadConfig;
  30. import com.pj.utils.cache.RedisUtil;
  31. import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
  32. import lombok.extern.slf4j.Slf4j;
  33. import org.springframework.context.annotation.Lazy;
  34. import org.springframework.stereotype.Service;
  35. import org.springframework.transaction.annotation.Transactional;
  36. import sun.misc.BASE64Decoder;
  37. import javax.annotation.Resource;
  38. import javax.xml.crypto.Data;
  39. import java.io.File;
  40. import java.io.FileOutputStream;
  41. import java.io.OutputStream;
  42. import java.math.BigDecimal;
  43. import java.time.LocalDateTime;
  44. import java.time.format.DateTimeFormatter;
  45. import java.util.Collections;
  46. import java.util.Date;
  47. import java.util.List;
  48. import java.util.Objects;
  49. import java.util.stream.Collectors;
  50. @Service
  51. @Transactional
  52. @Slf4j
  53. public class OpenService {
  54. @Resource
  55. @Lazy
  56. private TbBusinessService tbBusinessService;
  57. @Resource
  58. @Lazy
  59. private TbBusinessCarService tbBusinessCarService;
  60. @Resource
  61. @Lazy
  62. private TbBusinessItemService tbBusinessItemService;
  63. @Resource
  64. private TbCarService tbCarService;
  65. @Resource
  66. TaskService taskService;
  67. @Resource
  68. TbCarNoColorService tbCarNoColorService;
  69. @Resource
  70. private TbBusinessPeopleService tbBusinessPeopleService;
  71. private final List<String> CAR_LIST = StrUtil.splitTrim("浙,粤,京,津,冀,晋,蒙,辽,黑,沪,吉,苏,皖,赣,鲁,豫,鄂,湘,桂,琼,渝,川,贵,云,藏, 陕, 甘, 青, 宁", ",");
  72. public ResultJson checkCarNumber(CheckCarNumberBO checkCarNumberBO) {
  73. String carNo = checkCarNumberBO.getCarNumber();
  74. int inOrOut = checkCarNumberBO.getInOrOut();
  75. String image = checkCarNumberBO.getImageData();
  76. if (inOrOut == 1) {
  77. handlerIn(carNo, checkCarNumberBO.getChannelName(), image);
  78. return ResultJson.success();
  79. }
  80. return handlerOut(carNo, checkCarNumberBO.getChannelName(), image);
  81. }
  82. private void handlerIn(String carNo, String channel, String image) {
  83. carNo = carNo.toUpperCase();
  84. TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
  85. Date now = new Date();
  86. TbCar tbCar = tbCarService.findByCardNo(carNo);
  87. boolean bindBusiness = false;
  88. if (tbBusinessCar != null) {
  89. bindBusiness = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId()).size() > 0;
  90. }
  91. if (tbBusinessCar == null || (tbBusinessCar.getRealInTime() != null && tbBusinessCar.getRealOutTime() != null && bindBusiness) || tbBusinessCar.getPay() == 1) {
  92. tbBusinessCar = new TbBusinessCar();
  93. tbBusinessCar.setCarNo(carNo).setPay(0).setCarSize(0D).setIsLock(0).setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时")
  94. .setInChannel(channel).setRealInTime(now).setBasePartMoney(new BigDecimal("0")).setTimeUpdate(now)
  95. .setNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + RandomUtil.randomNumbers(4));
  96. tbBusinessCarService.save(tbBusinessCar);
  97. CoverBase64ToUrl(image, tbBusinessCar.getId(), 1);
  98. return;
  99. }
  100. tbBusinessCar.setRealInTime(now).setInChannel(channel).setTimeUpdate(now)
  101. .setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时");
  102. tbBusinessCarService.saveOrUpdate(tbBusinessCar);
  103. CoverBase64ToUrl(image, tbBusinessCar.getId(), 1);
  104. if (!CAR_LIST.contains(carNo)) {
  105. TbBusiness tbBusiness = tbBusinessService.getById(tbBusinessCar.getBusinessId());
  106. if (tbBusiness != null) {
  107. tbBusiness.setRealInTime(now).setInChannel(channel);
  108. tbBusinessService.updateById(tbBusiness);
  109. }
  110. }
  111. }
  112. private void CoverBase64ToUrl(String base64image, String carId, int inOrOut) {
  113. if (StrUtil.isEmpty(base64image)) {
  114. return;
  115. }
  116. taskService.addTask(new CoverBase64ToImageTask("=======" + carId + "", 2000, carId, base64image, inOrOut));
  117. }
  118. private ResultJson handlerOut(String carNo, String channel, String image) {
  119. carNo = carNo.toUpperCase();
  120. TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
  121. if (tbBusinessCar == null || tbBusinessCar.getRealInTime() == null || tbBusinessCar.getRealOutTime() != null) {
  122. log.error("请求返回【未查询到入场记录】:{}", carNo);
  123. return ResultJson.error("未查询到入场记录");
  124. }
  125. Date now = new Date();
  126. Integer businessType = tbBusinessCar.getBusinessType();
  127. //判断是否蓝色车牌===免停车费
  128. if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) {
  129. List<TbCarNoColor> freeList = tbCarNoColorService.getFreeColor();
  130. List<String> colorList = freeList.stream().map(f -> f.getCarNoColor().substring(0, 1)).collect(Collectors.toList());
  131. String color = tbBusinessCar.getColor().substring(0, 1);
  132. if (colorList.contains(color)) {
  133. tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel);
  134. tbBusinessCarService.updateById(tbBusinessCar);
  135. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  136. RedisUtil.del(channel);
  137. log.error("请求返回【放行】:{}", carNo);
  138. return ResultJson.success();
  139. }
  140. }
  141. //是否行政车辆=====
  142. if (checkFree(carNo, 2, now)) {
  143. tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel);
  144. tbBusinessCarService.updateById(tbBusinessCar);
  145. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  146. RedisUtil.del(channel);
  147. log.error("请求返回【放行】:{}", carNo);
  148. return ResultJson.success();
  149. }
  150. if (tbBusinessCar.getIsLock() == 1) {
  151. RedisUtil.setByMINUTES(channel, carNo, 2);
  152. log.error("请求返回:车辆已锁定:{}", carNo);
  153. return ResultJson.error("车辆已锁定");
  154. }
  155. String carNoStr = carNo.substring(0, 1);
  156. Date inTime = tbBusinessCar.getRealInTime();
  157. if (tbBusinessCar.getPay() == 1 && tbBusinessCar.getRealOutTime() == null && tbBusinessCar.getPayTime() != null) {
  158. inTime = tbBusinessCar.getPayTime();
  159. }
  160. BigDecimal price = tbBusinessService.calculationPartMoney(inTime, now);
  161. //越南车牌,整车业务免停车费
  162. if (!CAR_LIST.contains(carNoStr) && TbBusiness.BusinessType.HOLD_CAR.getCode().equals(businessType)) {
  163. price = new BigDecimal("0");
  164. }
  165. double dif = price.doubleValue();
  166. if (dif > 0) {
  167. RedisUtil.setByMINUTES(channel, carNo, 1);
  168. log.error("请求返回:请缴停车费:{},{}元", carNo, dif);
  169. return ResultJson.error("请缴停车费" + dif + "元");
  170. }
  171. //无业务费用车辆===
  172. if (TbBusiness.BusinessType.NO_BUSINESS.getCode().equals(businessType)) {
  173. tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now);
  174. tbBusinessCarService.updateById(tbBusinessCar);
  175. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  176. RedisUtil.del(channel);
  177. log.error("请求返回【放行】:{}", carNo);
  178. return ResultJson.success();
  179. }
  180. //============业务费计算是否交完
  181. String businessId = tbBusinessCar.getBusinessId();
  182. List<TbBusinessItem> items;
  183. if (TbBusiness.BusinessType.HOLD_CAR.getCode().equals(businessType)) {
  184. items = tbBusinessItemService.findByBusinessId(businessId);
  185. } else {
  186. List<TbBusiness> businessList = tbBusinessService.findOtherBusinessByCarId(tbBusinessCar.getId());
  187. items = tbBusinessItemService.findByBusinessIdList(businessList.stream().map(TbBusiness::getId).collect(Collectors.toList()));
  188. }
  189. long count = items.stream().filter(tbBusinessItem -> tbBusinessItem.getPayStatus() == 0).count();
  190. if (count > 0) {
  191. RedisUtil.setByMINUTES(channel, carNo, 1);
  192. log.error("请求返回:请缴纳业务费用:{}", carNo);
  193. return ResultJson.error("请缴纳业务费用");
  194. }
  195. tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now);
  196. tbBusinessCarService.updateById(tbBusinessCar);
  197. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  198. RedisUtil.del(channel);
  199. return ResultJson.success();
  200. }
  201. private boolean checkFree(String carNo, int inOrOut, Date now) {
  202. TbCar tbCar = tbCarService.findByCardNo(carNo);
  203. if (tbCar != null) {
  204. if (inOrOut == 1) {
  205. tbCar.setLastInTime(now);
  206. } else {
  207. tbCar.setLastOutTime(now);
  208. }
  209. tbCarService.updateById(tbCar);
  210. }
  211. return tbCar != null && !TbCar.CarTypeEnum.BUSINESS_CAR.getType().equals(tbCar.getCarType());
  212. }
  213. public void handlerInRecord(InRecordBO inRecordBO) {
  214. String carNo = inRecordBO.getCarNumber().trim().toUpperCase();
  215. // 入场==>取车牌颜色
  216. List<TbBusinessCar> cars = tbBusinessCarService.findByCarNo(carNo);
  217. cars.stream().filter(obj -> StrUtil.isEmpty(obj.getColor()))
  218. .forEach(tbBusinessCar -> {
  219. tbBusinessCar.setColor(inRecordBO.getCarColor());
  220. tbBusinessCarService.updateById(tbBusinessCar);
  221. });
  222. if (cars.isEmpty()) {
  223. //handlerIn(carNo, inRecordBO.getChannelName(), null);
  224. }
  225. }
  226. }