OpenService.java 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 org.springframework.context.annotation.Lazy;
  33. import org.springframework.stereotype.Service;
  34. import org.springframework.transaction.annotation.Transactional;
  35. import sun.misc.BASE64Decoder;
  36. import javax.annotation.Resource;
  37. import javax.xml.crypto.Data;
  38. import java.io.File;
  39. import java.io.FileOutputStream;
  40. import java.io.OutputStream;
  41. import java.math.BigDecimal;
  42. import java.time.LocalDateTime;
  43. import java.time.format.DateTimeFormatter;
  44. import java.util.Date;
  45. import java.util.List;
  46. import java.util.stream.Collectors;
  47. @Service
  48. @Transactional
  49. public class OpenService {
  50. @Resource
  51. @Lazy
  52. private TbBusinessService tbBusinessService;
  53. @Resource
  54. @Lazy
  55. private TbBusinessCarService tbBusinessCarService;
  56. @Resource
  57. @Lazy
  58. private TbBusinessItemService tbBusinessItemService;
  59. @Resource
  60. private TbCarService tbCarService;
  61. @Resource
  62. TaskService taskService;
  63. @Resource
  64. TbCarNoColorService tbCarNoColorService;
  65. @Resource
  66. private TbBusinessPeopleService tbBusinessPeopleService;
  67. private final List<String> CAR_LIST = StrUtil.splitTrim("浙,粤,京,津,冀,晋,蒙,辽,黑,沪,吉,苏,皖,赣,鲁,豫,鄂,湘,桂,琼,渝,川,贵,云,藏, 陕, 甘, 青, 宁", ",");
  68. public ResultJson checkCarNumber(CheckCarNumberBO checkCarNumberBO) {
  69. String carNo = checkCarNumberBO.getCarNumber();
  70. int inOrOut = checkCarNumberBO.getInOrOut();
  71. String image = checkCarNumberBO.getImageData();
  72. if (inOrOut == 1) {
  73. handlerIn(carNo, checkCarNumberBO.getChannelName(), image);
  74. return ResultJson.success();
  75. }
  76. return handlerOut(carNo, checkCarNumberBO.getChannelName(), image);
  77. }
  78. private void handlerIn(String carNo, String channel, String image) {
  79. carNo = carNo.toUpperCase();
  80. TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
  81. Date now = new Date();
  82. TbCar tbCar = tbCarService.findByCardNo(carNo);
  83. if (tbBusinessCar == null || (tbBusinessCar.getRealInTime() != null && tbBusinessCar.getRealOutTime() != null)||tbBusinessCar.getPay()==1) {
  84. tbBusinessCar = new TbBusinessCar();
  85. tbBusinessCar.setCarNo(carNo).setPay(0).setCarSize(0D).setIsLock(0).setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时")
  86. .setInChannel(channel).setRealInTime(now).setBasePartMoney(new BigDecimal("0")).setTimeUpdate(now)
  87. .setNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + RandomUtil.randomNumbers(4));
  88. tbBusinessCarService.save(tbBusinessCar);
  89. CoverBase64ToUrl(image, tbBusinessCar.getId(), 1);
  90. return;
  91. }
  92. tbBusinessCar.setRealInTime(now).setInChannel(channel).setTimeUpdate(now)
  93. .setCarCompany(tbCar != null ? tbCar.getCustomerName() : "临时");
  94. tbBusinessCarService.saveOrUpdate(tbBusinessCar);
  95. CoverBase64ToUrl(image, tbBusinessCar.getId(), 1);
  96. if (!CAR_LIST.contains(carNo)) {
  97. TbBusiness tbBusiness = tbBusinessService.getById(tbBusinessCar.getBusinessId());
  98. if (tbBusiness != null) {
  99. tbBusiness.setRealInTime(now).setInChannel(channel);
  100. tbBusinessService.updateById(tbBusiness);
  101. }
  102. }
  103. }
  104. private void CoverBase64ToUrl(String base64image, String carId, int inOrOut) {
  105. if (StrUtil.isEmpty(base64image)) {
  106. return;
  107. }
  108. taskService.addTask(new CoverBase64ToImageTask("=======" + carId + "", 2000, carId, base64image, inOrOut));
  109. }
  110. private ResultJson handlerOut(String carNo, String channel, String image) {
  111. carNo = carNo.toUpperCase();
  112. TbBusinessCar tbBusinessCar = tbBusinessCarService.findTheLastRecord(carNo);
  113. if (tbBusinessCar == null) {
  114. return ResultJson.error("未查询到入场记录");
  115. }
  116. Date now = new Date();
  117. if (StrUtil.isNotEmpty(tbBusinessCar.getColor())) {
  118. List<TbCarNoColor> freeList = tbCarNoColorService.getFreeColor();
  119. List<String> colorList = freeList.stream().map(f -> f.getCarNoColor().substring(0, 1)).collect(Collectors.toList());
  120. String color = tbBusinessCar.getColor().substring(0, 1);
  121. if (colorList.contains(color)) {
  122. tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel);
  123. tbBusinessCarService.updateById(tbBusinessCar);
  124. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  125. RedisUtil.del(channel);
  126. return ResultJson.success();
  127. }
  128. }
  129. if (checkFree(carNo, 2, now)) {
  130. tbBusinessCar.setRealOutTime(now).setTimeUpdate(now).setOutChannel(channel);
  131. tbBusinessCarService.updateById(tbBusinessCar);
  132. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  133. RedisUtil.del(channel);
  134. return ResultJson.success();
  135. }
  136. if (tbBusinessCar.getIsLock() == 1) {
  137. RedisUtil.setByMINUTES(channel, carNo,2);
  138. return ResultJson.error("车辆已锁定");
  139. }
  140. String businessId = tbBusinessCar.getBusinessId();
  141. BigDecimal price = new BigDecimal("0");
  142. if (CAR_LIST.contains(carNo.substring(0, 1))) {
  143. Date inTime=tbBusinessCar.getRealInTime();
  144. if (tbBusinessCar.getPay()==1){
  145. inTime=tbBusinessCar.getPayTime();
  146. }
  147. price = tbBusinessService.calculationPartMoney(inTime, now);
  148. }
  149. // double dif = price.subtract(tbBusinessCar.getMoney()).doubleValue();
  150. double dif = price.doubleValue();
  151. if (dif > 0) {
  152. RedisUtil.setByMINUTES(channel, carNo,1);
  153. return ResultJson.error("请缴停车费" + dif + "元");
  154. }
  155. if (StrUtil.isEmpty(businessId)) {
  156. tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now);
  157. tbBusinessCarService.updateById(tbBusinessCar);
  158. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  159. RedisUtil.del(channel);
  160. return ResultJson.success();
  161. }
  162. TbBusiness business = tbBusinessService.getById(businessId);
  163. List<TbBusinessItem> items = tbBusinessItemService.findByBusinessId(businessId)
  164. .stream().filter(tbBusinessItem -> tbBusinessItem.getPayStatus() == 1).collect(Collectors.toList());
  165. BigDecimal itemPayPrice = new BigDecimal("0");
  166. for (TbBusinessItem tbBusinessItem : items) {
  167. itemPayPrice = itemPayPrice.add(tbBusinessItem.getItemPrice().multiply(new BigDecimal(tbBusinessItem.getNum())));
  168. }
  169. if (!CAR_LIST.contains(StrUtil.sub(carNo, 0, 1))) {
  170. if (!business.getItemPrice().equals(itemPayPrice) && business.getCustomerType() != 2) {
  171. RedisUtil.setByMINUTES(channel, carNo,2);
  172. return ResultJson.error("请缴纳业务费用");
  173. }
  174. }
  175. if (TbBusiness.BusinessType.CAR_DISINCLE.getCode().equals(business.getBusinessType()) && !business.getItemPrice().equals(itemPayPrice)) {
  176. RedisUtil.setByMINUTES(channel, carNo,1);
  177. return ResultJson.error("请缴纳业务费用");
  178. }
  179. tbBusinessCar.setRealOutTime(now).setOutChannel(channel).setTimeUpdate(now);
  180. tbBusinessCarService.updateById(tbBusinessCar);
  181. CoverBase64ToUrl(image, tbBusinessCar.getId(), 2);
  182. RedisUtil.del(channel);
  183. return ResultJson.success();
  184. }
  185. private boolean checkFree(String carNo, int inOrOut, Date now) {
  186. TbCar tbCar = tbCarService.findByCardNo(carNo);
  187. if (tbCar != null) {
  188. if (inOrOut == 1) {
  189. tbCar.setLastInTime(now);
  190. } else {
  191. tbCar.setLastOutTime(now);
  192. }
  193. tbCarService.updateById(tbCar);
  194. }
  195. return tbCar != null && !TbCar.CarTypeEnum.BUSINESS_CAR.getType().equals(tbCar.getCarType());
  196. }
  197. public void handlerInRecord(InRecordBO inRecordBO) {
  198. String carNo = inRecordBO.getCarNumber().trim().toUpperCase();
  199. // 入场==>取车牌颜色
  200. List<TbBusinessCar> cars = tbBusinessCarService.findByCarNo(carNo);
  201. cars.stream().filter(obj -> StrUtil.isEmpty(obj.getColor()))
  202. .forEach(tbBusinessCar -> {
  203. tbBusinessCar.setColor(inRecordBO.getCarColor());
  204. tbBusinessCarService.updateById(tbBusinessCar);
  205. });
  206. if (cars.isEmpty()) {
  207. //handlerIn(carNo, inRecordBO.getChannelName(), null);
  208. }
  209. }
  210. }