|  | @@ -121,6 +121,8 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |      public ReturnT<String> checkPublishPlan(String param) {
 | 
	
		
			
				|  |  |          Long todayStart = DateUtils.getTodayStart();
 | 
	
		
			
				|  |  |          List<NotPublishPlan> notPublishPlan = publishContentMapper.getNotPublishPlan(todayStart);
 | 
	
		
			
				|  |  | +        List<FeishuTableDTO.Column> columns = buildCheckPublishPlanColumns();
 | 
	
		
			
				|  |  | +        List<JSONObject> rows = new ArrayList<>();
 | 
	
		
			
				|  |  |          for (NotPublishPlan publishPlan : notPublishPlan) {
 | 
	
		
			
				|  |  |              long now = System.currentTimeMillis();
 | 
	
		
			
				|  |  |              int nowHour = DateUtils.getHourByTimestamp(now / 1000);
 | 
	
	
		
			
				|  | @@ -131,15 +133,53 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |              LocalTime time = LocalTime.parse(publishPlan.getPublishPushTime());
 | 
	
		
			
				|  |  |              int planHour = time.getHour();
 | 
	
		
			
				|  |  |              int planMinute = time.getMinute();
 | 
	
		
			
				|  |  | +            JSONObject obj = null;
 | 
	
		
			
				|  |  |              if (nowHour - planHour == 1 && nowMinute > planMinute) {
 | 
	
		
			
				|  |  | -                sendFeishuPublishPlanNotPushWarn(publishPlan);
 | 
	
		
			
				|  |  | +                obj = sendFeishuPublishPlanNotPushWarn(publishPlan);
 | 
	
		
			
				|  |  |              } else if (nowHour - planHour > 1) {
 | 
	
		
			
				|  |  | -                sendFeishuPublishPlanNotPushWarn(publishPlan);
 | 
	
		
			
				|  |  | +                obj = sendFeishuPublishPlanNotPushWarn(publishPlan);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (obj != null) {
 | 
	
		
			
				|  |  | +                rows.add(obj);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        FeishuTableDTO tableDTO = FeishuTableDTO.createTable("发布计划超1H未发送完成", columns, rows, true);
 | 
	
		
			
				|  |  | +        JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(tableDTO));
 | 
	
		
			
				|  |  | +        JSONObject bodyParam = new JSONObject();
 | 
	
		
			
				|  |  | +        bodyParam.put("msg_type", "interactive");
 | 
	
		
			
				|  |  | +        bodyParam.put("card", content);
 | 
	
		
			
				|  |  | +        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(), bodyParam);
 | 
	
		
			
				|  |  |          return ReturnT.SUCCESS;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private List<FeishuTableDTO.Column> buildCheckPublishPlanColumns() {
 | 
	
		
			
				|  |  | +        List<FeishuTableDTO.Column> columns = new ArrayList<>();
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column planIdColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "plan_id", "发布计划ID", null);
 | 
	
		
			
				|  |  | +        columns.add(planIdColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column planNameColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "plan_name", "发布计划名称", null);
 | 
	
		
			
				|  |  | +        columns.add(planNameColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column exceptCountColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "expect_count", "预计数量", null);
 | 
	
		
			
				|  |  | +        columns.add(exceptCountColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column publishCountColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "publish_count", "实际数量", null);
 | 
	
		
			
				|  |  | +        columns.add(publishCountColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column accountNamesColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "account_names", "发送失败账号", null);
 | 
	
		
			
				|  |  | +        columns.add(accountNamesColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column errorMsgColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "error_msg", "发布计划失败原因", null);
 | 
	
		
			
				|  |  | +        columns.add(errorMsgColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column publishPushTimeColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +                FieshuTableColumnDataTypeEnum.TEXT.getType(), "publish_push_time", "发布时间", null);
 | 
	
		
			
				|  |  | +        columns.add(publishPushTimeColumn);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return columns;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Getter
 | 
	
		
			
				|  |  |      @Setter
 | 
	
		
			
				|  |  |      @Accessors(chain = true)
 | 
	
	
		
			
				|  | @@ -156,20 +196,20 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |          private String errorMsg;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void sendFeishuPublishPlanNotPushWarn(NotPublishPlan publishPlan) {
 | 
	
		
			
				|  |  | +    private JSONObject sendFeishuPublishPlanNotPushWarn(NotPublishPlan publishPlan) {
 | 
	
		
			
				|  |  |          Long todayStart = DateUtils.getTodayStart();
 | 
	
		
			
				|  |  |          List<PublishAccount> publishAccounts = publishContentMapper.getPublishAccounts(publishPlan.getPlanId(), todayStart);
 | 
	
		
			
				|  |  |          List<String> accountNames;
 | 
	
		
			
				|  |  |          if (CollectionUtil.isNotEmpty(publishAccounts)) {
 | 
	
		
			
				|  |  |              accountNames = publishAccounts.stream().map(PublishAccount::getName).collect(Collectors.toList());
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          PlanErrorMsg planErrorMsg = JSONObject.parseObject(publishPlan.getErrorMsg(), PlanErrorMsg.class);
 | 
	
		
			
				|  |  |          if (planErrorMsg == null) {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  |          } else if (CollectionUtil.isEmpty(planErrorMsg.getErrorMsgDetails())) {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          Iterator<PlanErrorMsgDetail> iterator = planErrorMsg.getErrorMsgDetails().iterator();
 | 
	
		
			
				|  |  |          while (iterator.hasNext()) {
 | 
	
	
		
			
				|  | @@ -183,18 +223,17 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (CollectionUtil.isEmpty(planErrorMsg.getErrorMsgDetails())
 | 
	
		
			
				|  |  |                  || CollectionUtil.isEmpty(accountNames)) {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
 | 
	
		
			
				|  |  | -                "发布计划超1H未发送完成\n"
 | 
	
		
			
				|  |  | -                        + "发布计划ID: " + publishPlan.getPlanId() + "\n"
 | 
	
		
			
				|  |  | -                        + "发布计划名称: " + publishPlan.getPlanName() + "\n"
 | 
	
		
			
				|  |  | -                        + "预计数量: " + publishPlan.getExpectCount() + "\n"
 | 
	
		
			
				|  |  | -                        + "实际数量: " + publishPlan.getPublishCount() + "\n"
 | 
	
		
			
				|  |  | -                        + "发送失败账号: " + JSONObject.toJSONString(accountNames) + "\n"
 | 
	
		
			
				|  |  | -                        + "发布计划失败原因: " + JSONObject.toJSONString(planErrorMsg) + "\n"
 | 
	
		
			
				|  |  | -                        + "发布时间: " + publishPlan.getPublishPushTime() + "\n"
 | 
	
		
			
				|  |  | -                        + "<at user_id=\"all\">所有人</at> ");
 | 
	
		
			
				|  |  | +        JSONObject result = new JSONObject();
 | 
	
		
			
				|  |  | +        result.put("plan_id", publishPlan.getPlanId());
 | 
	
		
			
				|  |  | +        result.put("plan_name", publishPlan.getPlanName());
 | 
	
		
			
				|  |  | +        result.put("expect_count", publishPlan.getExpectCount());
 | 
	
		
			
				|  |  | +        result.put("publish_count", publishPlan.getPublishCount());
 | 
	
		
			
				|  |  | +        result.put("account_names", accountNames);
 | 
	
		
			
				|  |  | +        result.put("error_msg", JSONObject.toJSONString(planErrorMsg));
 | 
	
		
			
				|  |  | +        result.put("publish_push_time", publishPlan.getPublishPushTime());
 | 
	
		
			
				|  |  | +        return result;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @XxlJob("checkPublishPlanAccount")
 | 
	
	
		
			
				|  | @@ -220,7 +259,7 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |              row.put("account_names", accountNames);
 | 
	
		
			
				|  |  |              rows.add(row);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        FeishuTableDTO tableDTO = FeishuTableDTO.createTable("发布计划开启账号未开启计划报警", columns, rows);
 | 
	
		
			
				|  |  | +        FeishuTableDTO tableDTO = FeishuTableDTO.createTable("发布计划开启账号未开启计划报警", columns, rows, false);
 | 
	
		
			
				|  |  |          JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(tableDTO));
 | 
	
		
			
				|  |  |          // 无法自动删除 发送飞书通知 人工删除
 | 
	
		
			
				|  |  |          JSONObject bodyParam = new JSONObject();
 | 
	
	
		
			
				|  | @@ -232,15 +271,15 @@ public class XxlJobService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private List<FeishuTableDTO.Column> buildCheckPublishPlanAccountColumns() {
 | 
	
		
			
				|  |  |          List<FeishuTableDTO.Column> columns = new ArrayList<>();
 | 
	
		
			
				|  |  | -        FeishuTableDTO.Column accountNameColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column planIdColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  |                  FieshuTableColumnDataTypeEnum.TEXT.getType(), "plan_id", "发布计划ID", null);
 | 
	
		
			
				|  |  | -        columns.add(accountNameColumn);
 | 
	
		
			
				|  |  | -        FeishuTableDTO.Column accountGhIdColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +        columns.add(planIdColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column planNameColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  |                  FieshuTableColumnDataTypeEnum.TEXT.getType(), "plan_name", "发布计划名称", null);
 | 
	
		
			
				|  |  | -        columns.add(accountGhIdColumn);
 | 
	
		
			
				|  |  | -        FeishuTableDTO.Column accountTypeColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  | +        columns.add(planNameColumn);
 | 
	
		
			
				|  |  | +        FeishuTableDTO.Column accountNamesColumn = FeishuTableDTO.createFeishuColumns(
 | 
	
		
			
				|  |  |                  FieshuTableColumnDataTypeEnum.TEXT.getType(), "account_names", "开关关闭账号", null);
 | 
	
		
			
				|  |  | -        columns.add(accountTypeColumn);
 | 
	
		
			
				|  |  | +        columns.add(accountNamesColumn);
 | 
	
		
			
				|  |  |          return columns;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |