|
@@ -0,0 +1,204 @@
|
|
|
+package com.usky.dxtop.service.job;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.annotation.TableField;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.usky.dxtop.common.exception.CustomException;
|
|
|
+import com.usky.dxtop.common.utils.DateUtils;
|
|
|
+import com.usky.dxtop.model.CallApiLog;
|
|
|
+import com.usky.dxtop.model.MsgLog;
|
|
|
+import com.usky.dxtop.model.Order;
|
|
|
+import com.usky.dxtop.model.ProductOrder;
|
|
|
+import com.usky.dxtop.service.CallApiLogService;
|
|
|
+import com.usky.dxtop.service.ProductOrderService;
|
|
|
+import com.usky.dxtop.service.api.FpApi;
|
|
|
+import com.usky.dxtop.service.emun.OrderStatus;
|
|
|
+import com.usky.dxtop.service.emun.ProductOrderStatus;
|
|
|
+import com.usky.dxtop.service.impl.ProductOrderServiceImpl;
|
|
|
+import com.usky.dxtop.service.vo.FpDoorVO;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.sql.SQLTransactionRollbackException;
|
|
|
+import java.time.LocalTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author yq
|
|
|
+ * @date 2022/7/6 16:17
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component("fpJob")
|
|
|
+public class FpJob {
|
|
|
+
|
|
|
+
|
|
|
+ private TreeMap<String,Integer> treeMap = new TreeMap<>();
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CallApiLogService callApiLogService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProductOrderService productOrderService;
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void execute(String param){
|
|
|
+ List<FpDoorVO> doorList = getDoorList();
|
|
|
+ if (CollectionUtils.isNotEmpty(doorList)){
|
|
|
+ List<CallApiLog> logs = new ArrayList<>();
|
|
|
+ //处理需要开权限的订单
|
|
|
+ List<ProductOrder> addPerList = getData(ProductOrderStatus.TAKE.getCode());
|
|
|
+ addPerList.forEach(productOrder -> {
|
|
|
+ List<FpDoorVO> listByDeviceId = getListByDeviceId(productOrder.getFpDeviceId(), doorList);
|
|
|
+ if (isAddPermission(productOrder)){
|
|
|
+ logs.add(sendPermission(listByDeviceId, productOrder, "1",ProductOrderStatus.SET_PERMISSION_ERROR.getCode()));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ //处理需要关闭权限的订单
|
|
|
+ List<ProductOrder> delPerList = getData(ProductOrderStatus.RUN.getCode());
|
|
|
+ delPerList.forEach(productOrder -> {
|
|
|
+ List<FpDoorVO> listByDeviceId = getListByDeviceId(productOrder.getFpDeviceId(), doorList);
|
|
|
+ if (isDelPermission(productOrder)){
|
|
|
+ logs.add(sendPermission(listByDeviceId, productOrder, "1",ProductOrderStatus.DEL_PERMISSION_ERROR.getCode()));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ try {
|
|
|
+ productOrderService.updateBatchById(addPerList);
|
|
|
+ productOrderService.updateBatchById(delPerList);
|
|
|
+ callApiLogService.saveBatch(logs);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("费浦定时任务-----数据库异常:"+e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("---fpJob---处理完成");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否重试
|
|
|
+ * @param productOrder
|
|
|
+ */
|
|
|
+ public boolean isRetry(ProductOrder productOrder){
|
|
|
+ String orderNumber = productOrder.getOrderNumber();
|
|
|
+ if (treeMap.containsKey(orderNumber)){
|
|
|
+ Integer count = treeMap.get(orderNumber);
|
|
|
+ if (count >= 3){
|
|
|
+ treeMap.remove(orderNumber);
|
|
|
+ return false;
|
|
|
+ }else {
|
|
|
+ treeMap.put(orderNumber,count+1);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ treeMap.put(orderNumber,1);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<FpDoorVO> getListByDeviceId(String deviceId,List<FpDoorVO> list){
|
|
|
+ return list.stream()
|
|
|
+ .filter(fpDoorVO -> fpDoorVO.getDeviceId().equals(deviceId)).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取全部门禁设备
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<FpDoorVO> getDoorList(){
|
|
|
+ AtomicReference<List<FpDoorVO>> doorVOS = new AtomicReference<>();
|
|
|
+ try {
|
|
|
+ FpApi.commonResult(FpApi.DOOR_LIST_URL,null,jsonObject -> {
|
|
|
+ if ("1".equals(jsonObject.get("result").toString())){
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ JSONArray content = data.getJSONArray("data");
|
|
|
+ doorVOS.set(content.toJavaList(FpDoorVO.class));
|
|
|
+ }else {
|
|
|
+ log.error("获取全部门禁里列表异常:"+jsonObject.get("msg"));
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("获取全部门禁里列表异常:"+e.getMessage());
|
|
|
+ }
|
|
|
+ return doorVOS.get();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 权限管理
|
|
|
+ * @param list 门禁列表
|
|
|
+ * @param productOrder 订单
|
|
|
+ * @param permission 权限标识
|
|
|
+ * @param orderFlag 达到最大重试次数以后的订单状态
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public CallApiLog sendPermission(List<FpDoorVO> list, ProductOrder productOrder,String permission,Integer orderFlag){
|
|
|
+ Map<String, Object> map = FpApi.generateDoorPermissionParam(productOrder.getUserCode(), list, permission);
|
|
|
+ String result;
|
|
|
+ try {
|
|
|
+ result = FpApi.commonResult(FpApi.DEVICE_PERMISSION_OPERATE_URL,null,jsonObject -> {
|
|
|
+ if ("1".equals(jsonObject.get("result").toString())){
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.RUN.getCode());
|
|
|
+ }else {
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.SET_PERMISSION_ERROR.getCode());
|
|
|
+ log.error("设置门禁权限异常:"+jsonObject.get("msg"));
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ treeMap.remove(productOrder.getOrderNumber());
|
|
|
+ }catch (Exception e){
|
|
|
+ if (isRetry(productOrder)){
|
|
|
+ productOrder.setOrderFlag(orderFlag);
|
|
|
+ }
|
|
|
+ result = e.getMessage();
|
|
|
+ log.error("设置门禁权限异常:"+e.getMessage());
|
|
|
+ }
|
|
|
+ return callApiLogService.getApiLog(productOrder.getOrderNumber(),
|
|
|
+ ProductOrderServiceImpl.FP_SET_PERMISSION,
|
|
|
+ FpApi.DEVICE_PERMISSION_OPERATE_URL,
|
|
|
+ JSONObject.toJSONString(map),
|
|
|
+ result);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public boolean isAddPermission(ProductOrder productOrder){
|
|
|
+ Date now = new Date();
|
|
|
+ Date startDate = getTimeByOrder(productOrder.getAppointmentTime(), productOrder.getStartTime());
|
|
|
+ Date endDate = getTimeByOrder(productOrder.getAppointmentTime(), productOrder.getEndTime());
|
|
|
+ Date date = DateUtils.addMinutes(startDate, -30);
|
|
|
+ if ((now.before(startDate) && now.after(date)) || now.before(endDate)){
|
|
|
+ return true;
|
|
|
+ }else if (now.after(endDate)){
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.SUCCESS.getCode());
|
|
|
+ return false;
|
|
|
+ }else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isDelPermission(ProductOrder productOrder){
|
|
|
+ Date now = new Date();
|
|
|
+ Date startDate = getTimeByOrder(productOrder.getAppointmentTime(), productOrder.getEndTime());
|
|
|
+ return now.before(startDate);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public Date getTimeByOrder(Date date, LocalTime addDate){
|
|
|
+ date = DateUtils.addHours(date, addDate.getHour());
|
|
|
+ date = DateUtils.addMinutes(date, addDate.getMinute());
|
|
|
+ date = DateUtils.addSeconds(date, addDate.getSecond());
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<ProductOrder> getData(Integer orderFlag){
|
|
|
+ LambdaQueryWrapper<ProductOrder> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.eq(ProductOrder::getOrderFlag, orderFlag);
|
|
|
+ return productOrderService.list(queryWrapper);
|
|
|
+ }
|
|
|
+}
|