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<SysInvoice> list = sysInvoiceService.selectSysInvoiceList(sysInvoice);
|
return getDataTable(list);
|
}
|
|
/**
|
* App端查询我的发票申请列表
|
*/
|
@GetMapping("/myList")
|
public TableDataInfo myList(SysInvoice sysInvoice)
|
{
|
sysInvoice.setApplyUserId(SecurityUtils.getUserId());
|
startPage();
|
List<Map<String, Object>> 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<SysInvoice> list = sysInvoiceService.selectSysInvoiceList(sysInvoice);
|
ExcelUtil<SysInvoice> util = new ExcelUtil<SysInvoice>(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<SysInvoice> list = sysInvoiceService.selectSysInvoiceList(query);
|
|
if (list != null && !list.isEmpty()) {
|
// 只返回最新的一条记录
|
SysInvoice invoice = list.get(0);
|
Map<String, Object> 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));
|
}
|
}
|