package com.vincent.rsf.server.manager.controller; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.manager.schedules.AsnOrderLogSchedule; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.List; /** * 定时任务手动触发接口,仅允许本机请求(127.0.0.1 / ::1)。 */ @Slf4j @RestController @RequestMapping("/schedule") @Api(value = "定时任务触发", tags = "定时任务手动触发(仅本地)") public class ScheduleTriggerController { private static final List LOCALHOST_IPS = Arrays.asList("127.0.0.1", "0:0:0:0:0:0:0:1", "::1"); private final AsnOrderLogSchedule asnOrderLogSchedule; public ScheduleTriggerController(AsnOrderLogSchedule asnOrderLogSchedule) { this.asnOrderLogSchedule = asnOrderLogSchedule; } private static boolean isLocalRequest(HttpServletRequest request) { String remote = request.getRemoteAddr(); if (remote != null && LOCALHOST_IPS.contains(remote)) { return true; } String forwarded = request.getHeader("X-Forwarded-For"); if (forwarded != null && !forwarded.isEmpty()) { remote = forwarded.split(",")[0].trim(); } return remote != null && LOCALHOST_IPS.contains(remote); } @ApiOperation("手动执行入库转历史(InStockToLog),仅允许本地请求") @PostMapping("/trigger/inStockToLog") public ResponseEntity triggerInStockToLog(HttpServletRequest request) { if (!isLocalRequest(request)) { log.warn("拒绝非本地请求触发 InStockToLog,remote={}", request.getRemoteAddr()); return ResponseEntity.status(HttpStatus.FORBIDDEN).body(R.error("仅允许本地请求")); } try { asnOrderLogSchedule.InStockToLog(); return ResponseEntity.ok(R.ok("执行完成")); } catch (Exception e) { log.error("InStockToLog 执行失败", e); return ResponseEntity.ok(R.error(e.getMessage())); } } @ApiOperation("手动执行物理删除上上个月之前已逻辑删除的原单及明细,仅允许本地请求") @PostMapping("/trigger/physicalDeleteLogicDeletedOrders") public ResponseEntity triggerPhysicalDeleteLogicDeletedOrders(HttpServletRequest request) { if (!isLocalRequest(request)) { log.warn("拒绝非本地请求触发 physicalDeleteLogicDeletedOrders,remote={}", request.getRemoteAddr()); return ResponseEntity.status(HttpStatus.FORBIDDEN).body(R.error("仅允许本地请求")); } try { asnOrderLogSchedule.physicalDeleteLogicDeletedOrders(); return ResponseEntity.ok(R.ok("执行完成")); } catch (Exception e) { log.error("physicalDeleteLogicDeletedOrders 执行失败", e); return ResponseEntity.ok(R.error(e.getMessage())); } } }