package com.yykj.sjnmtybt.controller; import com.yykj.sjnmtybt.common.ApiResponse; import com.yykj.sjnmtybt.common.PageResult; import com.yykj.sjnmtybt.dto.request.ApproveRequest; import com.yykj.sjnmtybt.dto.request.SpecialBizCreateRequest; import com.yykj.sjnmtybt.dto.response.SpecialBizVO; import com.yykj.sjnmtybt.enums.RefundProgressStageEnum; import com.yykj.sjnmtybt.enums.SpecialBizTypeEnum; import com.yykj.sjnmtybt.service.BizFlowService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.Map; @Tag(name = "06-特殊业务", description = "流程图泳道:特殊业务申请(死亡预警/暂停恢复补发/调标)") @RestController @RequestMapping("/api/special-biz") public class SpecialBizController { private final BizFlowService flow; public SpecialBizController(BizFlowService flow) { this.flow = flow; } @Operation(summary = "分页查询特殊业务", description = "含丧葬、暂停、停止、恢复、调标差额补发、下月补发、多发退款、继承人变更等。" + "调标单人员可为空,对象列为街镇;关联村批见 relatedBatchIds。") @GetMapping("/page") public ApiResponse> page( @Parameter(description = "关联统一批次号") @RequestParam(required = false) String batchNo, @Parameter(description = "业务类型") @RequestParam(required = false) SpecialBizTypeEnum bizType, @Parameter(description = "审批状态:待分管领导审批/已通过/已驳回") @RequestParam(required = false) String approveStatus, @Parameter(description = "街镇ID") @RequestParam(required = false) String townId, @Parameter(description = "页码,从 1 起") @RequestParam(required = false, defaultValue = "1") Integer pageNum, @Parameter(description = "每页条数") @RequestParam(required = false, defaultValue = "20") Integer pageSize) { return ApiResponse.ok(flow.pageSpecial(bizType, approveStatus, pageNum, pageSize, townId)); } @Operation(summary = "恢复发放补发预览", description = "按暂停月数×街镇月标估算补发金额与默认原因;创建 RESUME 前可调用。") @GetMapping("/resume-preview") public ApiResponse> resumePreview( @Parameter(description = "人员ID", required = true) @RequestParam String personnelId) { return ApiResponse.ok(flow.previewResumeSupplement(personnelId)); } @Operation(summary = "创建特殊业务(线上申请)", description = "丧葬/暂停/恢复等需选人。" + "STANDARD_ADJUST 调标差额补发:只传 townId(必填),可选 reason/fileUrls;" + "新旧土地标准与生效月从金额标准历史自动带出,不再手填;" + "按村生成业务号 YYYY99 补发批,进分管领导审批(审批以村批为准,非本单出盘)。") @PostMapping public ApiResponse create(@Validated @RequestBody SpecialBizCreateRequest req) { return ApiResponse.ok("特殊业务已创建,待分管领导审批", flow.createSpecial(req)); } @Operation(summary = "分管领导线上审批特殊业务", description = "通过→业务部门可生成特殊业务出盘文件;驳回→退回业务部门修改。" + "调标差额补发的实质审批请走 POST /api/batches/leader-approve(各村补发批)。") @PostMapping("/leader-approve") public ApiResponse leaderApprove(@Validated @RequestBody ApproveRequest req) { return ApiResponse.ok("审批完成", flow.approveSpecial(req)); } @Operation(summary = "生成特殊业务出盘文件", description = "分管领导审批通过后,业务部门导出出盘文件,进入线下签批与财政发放。" + "调标补发请用发放出盘接口且 adjustOnly=true;未通过/已出盘/调标单会返回 400。") @PostMapping("/{id}/export-disk") public ApiResponse> exportDisk( @Parameter(description = "特殊业务单ID", required = true) @PathVariable String id) { return ApiResponse.ok("特殊业务出盘文件已生成", flow.exportSpecialDisk(id)); } @Operation(summary = "推进退款进度") @PostMapping("/{id}/refund-progress") public ApiResponse advanceRefundProgress( @PathVariable String id, @RequestBody Map body) { RefundProgressStageEnum stage = RefundProgressStageEnum.valueOf(body.get("stage")); return ApiResponse.ok("进度已更新", flow.advanceRefundProgress(id, stage)); } @Operation(summary = "退款进度统计") @GetMapping("/refund-stats") public ApiResponse> refundStats() { return ApiResponse.ok(flow.refundStats()); } }