package com.ruoyi.web.controller.system; import java.util.List; import java.util.Map; import java.util.HashMap; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.LongUtil; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.service.ISysTaskEmergencyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysInvoice; import com.ruoyi.system.service.ISysInvoiceService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.SecurityUtils; /** * 发票申请Controller * * @author ruoyi * @date 2026-02-02 */ @RestController @RequestMapping("/system/invoice") public class SysInvoiceController extends BaseController { private static final Logger log = LoggerFactory.getLogger(SysInvoiceController.class); @Autowired private ISysInvoiceService sysInvoiceService; @Autowired private ISysDeptService sysDeptService; @Autowired private ISysTaskEmergencyService sysTaskEmergencyService; /** * 查询发票申请列表 */ @PreAuthorize("@ss.hasPermi('system:invoice:list')") @GetMapping("/list") public TableDataInfo list(SysInvoice sysInvoice) { startPage(); List list = sysInvoiceService.selectSysInvoiceList(sysInvoice); return getDataTable(list); } /** * App端查询我的发票申请列表 */ @GetMapping("/myList") public TableDataInfo myList(SysInvoice sysInvoice) { sysInvoice.setApplyUserId(SecurityUtils.getUserId()); startPage(); List> list = sysInvoiceService.selectMyInvoiceList(sysInvoice); return getDataTable(list); } /** * 导出发票申请列表 */ @PreAuthorize("@ss.hasPermi('system:invoice:export')") @Log(title = "发票申请", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SysInvoice sysInvoice) { List list = sysInvoiceService.selectSysInvoiceList(sysInvoice); ExcelUtil util = new ExcelUtil(SysInvoice.class); util.exportExcel(response, list, "发票申请数据"); } /** * 获取发票申请详细信息 */ @PreAuthorize("@ss.hasAnyPermi('system:invoice:query, system:invoice:edit')") @GetMapping(value = "/{invoiceId}") public AjaxResult getInfo(@PathVariable("invoiceId") Long invoiceId) { return AjaxResult.success(sysInvoiceService.selectSysInvoiceByInvoiceId(invoiceId)); } /** * 新增发票申请 */ @Log(title = "发票申请", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody SysInvoice sysInvoice) { sysInvoice.setApplyUserId(SecurityUtils.getUserId()); return toAjax(sysInvoiceService.insertSysInvoice(sysInvoice)); } /** * 修改发票申请 */ @PreAuthorize("@ss.hasPermi('system:invoice:edit')") @Log(title = "发票申请", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody SysInvoice sysInvoice) { return toAjax(sysInvoiceService.updateSysInvoice(sysInvoice)); } /** * 删除发票申请 */ @PreAuthorize("@ss.hasPermi('system:invoice:remove')") @Log(title = "发票申请", businessType = BusinessType.DELETE) @DeleteMapping("/{invoiceIds}") public AjaxResult remove(@PathVariable Long[] invoiceIds) { return toAjax(sysInvoiceService.deleteSysInvoiceByInvoiceIds(invoiceIds)); } /** * 手动触发同步 (仅限管理员) */ @PreAuthorize("@ss.hasRole('admin')") @GetMapping("/syncStatus") public AjaxResult syncStatus() { sysInvoiceService.syncStatusFromLegacySystem(); return AjaxResult.success("同步任务已触发"); } /** * 同步单个发票到旧系统 * @param invoiceId 发票ID */ @PreAuthorize("@ss.hasPermi('system:invoice:edit')") @Log(title = "发票申请", businessType = BusinessType.UPDATE) @PostMapping("/syncToLegacy/{invoiceId}") public AjaxResult syncToLegacy(@PathVariable Long invoiceId) { SysInvoice invoice = sysInvoiceService.selectSysInvoiceByInvoiceId(invoiceId); if (invoice == null) { return AjaxResult.error("发票不存在"); } if (invoice.getStatus() != 1) { return AjaxResult.error("只有审核通过的发票才能同步"); } try { sysInvoiceService.syncToLegacySystem(invoice.getInvoiceId()); return AjaxResult.success("同步成功"); } catch (Exception e) { return AjaxResult.error("同步失败: " + e.getMessage()); } } /** * 检查任务是否已申请发票 * @param taskId 任务ID */ @GetMapping("/checkTaskInvoice/{taskId}") public AjaxResult checkTaskInvoice(@PathVariable Long taskId) { SysInvoice query = new SysInvoice(); query.setServiceOrderId(taskId); List list = sysInvoiceService.selectSysInvoiceList(query); if (list != null && !list.isEmpty()) { // 只返回最新的一条记录 SysInvoice invoice = list.get(0); Map result = new HashMap<>(); result.put("hasApplied", true); result.put("status", invoice.getStatus()); result.put("invoiceId", invoice.getInvoiceId()); return AjaxResult.success(result); } return AjaxResult.success(null); } /** * App端查看我的某条发票详情(无需后台权限,但只能查看自己的发票) */ @GetMapping("/myDetail/{invoiceId}") public AjaxResult myDetail(@PathVariable("invoiceId") Long invoiceId) { Long currentUserId = SecurityUtils.getUserId(); SysInvoice invoice = sysInvoiceService.selectSysInvoiceByInvoiceId(invoiceId); if (invoice == null) { return AjaxResult.error("发票不存在"); } if (!currentUserId.equals(invoice.getApplyUserId())) { return AjaxResult.error("无权限查看该发票"); } return AjaxResult.success(invoice); } /** * App端用户编辑自己的发票申请(仅待审核/已驳回可编辑,不可更改关联任务) */ @Log(title = "发票申请自助修改", businessType = BusinessType.UPDATE) @PutMapping("/myEdit") public AjaxResult myEdit(@RequestBody SysInvoice sysInvoice) { Long currentUserId = SecurityUtils.getUserId(); if (sysInvoice.getInvoiceId() == null) { return AjaxResult.error("发票ID不能为空"); } SysInvoice exist = sysInvoiceService.selectSysInvoiceByInvoiceId(sysInvoice.getInvoiceId()); if (exist == null) { return AjaxResult.error("发票不存在"); } if (!currentUserId.equals(exist.getApplyUserId())) { return AjaxResult.error("无权限修改该发票"); } if (exist.getStatus() != 0 && exist.getStatus() != 2) { return AjaxResult.error("只有待审核或已驳回的发票可以修改"); } Long taskId = exist.getServiceOrderId(); Long legacyServiceOrdId = exist.getLegacyServiceOrderId(); if(LongUtil.isNotEmpty(taskId) && LongUtil.isEmpty(legacyServiceOrdId)){ SysTaskEmergency taskEmergency= sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if(taskEmergency!=null){ legacyServiceOrdId=taskEmergency.getLegacyServiceOrdId(); } } // 保持关联任务信息不变,只更新发票内容字段 sysInvoice.setServiceOrderId(exist.getServiceOrderId()); sysInvoice.setLegacyServiceOrderId(legacyServiceOrdId); sysInvoice.setApplyUserId(exist.getApplyUserId()); sysInvoice.setApplyTime(exist.getApplyTime()); sysInvoice.setStatus(0); // 重新置为待审核 int rows = sysInvoiceService.updateSysInvoice(sysInvoice); if (rows > 0) { // 异步同步到旧系统,失败不影响主流程 try { sysInvoiceService.syncUpdateToLegacySystem(sysInvoice.getInvoiceId()); } catch (Exception e) { log.warn("发票编辑同步旧系统失败,不影响保存结果: {}", e.getMessage()); } } return toAjax(rows); } /** * 获取可申请发票的任务列表 * @param searchKeyword 搜索关键词(支持taskCode、serviceCode、legacyServiceOrdNo) * @param serviceOrdClass 分公司代码(可选,默认使用用户所属分公司) */ @GetMapping("/selectableTasks") public AjaxResult getSelectableTasks( @RequestParam(required = false) String searchKeyword, @RequestParam(required = false) String serviceOrdClass ) { Long userId = SecurityUtils.getUserId(); // 去除搜索关键词的空格 if (StringUtils.isNotBlank(searchKeyword)) { searchKeyword = searchKeyword.trim(); } // 如果未指定分公司,自动获取用户所属分公司 if (StringUtils.isBlank(serviceOrdClass)) { try { Long deptId = SecurityUtils.getLoginUser().getUser().getDeptId(); if (deptId != null) { SysDept dept = sysDeptService.selectDeptById(deptId); if (dept != null) { // 判断是否为分公司(parent_id = 100) if (dept.getParentId() != null && dept.getParentId() == 100) { serviceOrdClass = dept.getServiceOrderClass(); } else if (dept.getAncestors() != null) { // 从 ancestors 解析分公司ID String[] ancestorIds = dept.getAncestors().split(","); for (int i = 0; i < ancestorIds.length; i++) { if ("100".equals(ancestorIds[i]) && i + 1 < ancestorIds.length) { Long branchId = Long.parseLong(ancestorIds[i + 1]); SysDept branchDept = sysDeptService.selectDeptById(branchId); if (branchDept != null) { serviceOrdClass = branchDept.getServiceOrderClass(); } break; } } } } } } catch (Exception e) { // 获取失败不影响查询,只是不过滤分公司 } } return AjaxResult.success(sysInvoiceService.selectSelectableTasks(userId, searchKeyword, serviceOrdClass)); } }