package com.ruoyi.web.controller.api;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.ApprovalTodoListQuery;
import com.ruoyi.system.query.NotificationListQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.ApprovalFlowNodeListVO;
import com.ruoyi.system.vo.ApprovalTodoVO;
import com.ruoyi.system.vo.ContractDetailVO;
import com.ruoyi.system.vo.system.NotificationVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 审批待办表 前端控制器
*
*
* @author WuGuanFengYue
* @since 2025-09-15
*/
@RestController
@Api(tags ="待办事项")
@RequestMapping("/oa-approval-todo")
public class OaApprovalTodoController {
@Resource
private OaApprovalTodoService approvalTodoService;
@Resource
private OaApprovalFlowAuditService approvalFlowAuditService;
@Resource
private OaApprovalApplicationStorageService approvalApplicationStorageService;
@Resource
private OaApprovalApplicationPurchaseService approvalApplicationPurchaseService;
@Resource
private OaApprovalApplicationAssetItemService approvalApplicationAssetItemService;
@Resource
private TokenService tokenService;
@Resource
private OaApprovalService approvalService;
@Resource
private OaApprovalApplicationsService approvalApplicationsService;
@Resource
private OaApprovalApplicationAdvertisementService approvalApplicationAdvertisementService;
@Resource
private OaApprovalApplicationContactService approvalApplicationContactService;
@Resource
private OaApprovalApplicationPaymentService approvalApplicationPaymentService;
@Resource
private OaApprovalApplicationContractService approvalApplicationContractService;
@Resource
private OaApprovalApplicationMoneyService approvalApplicationMoneyService;
@Resource
private AssetMainService assetMainService;
@Resource
private OaApprovalApplicationReimbursementService approvalApplicationReimbursementService;
@Resource
private OaApprovalApplicationReimbursementItemService approvalApplicationReimbursementItemService;
@Resource
private OaApprovalFlowNodeService approvalFlowNodeService;
@Resource
private OaApprovalApplicationAssetService approvalApplicationAssetService;
@Resource
private ISysUserService sysUserService;
@Resource
private OaApprovalApplicationDisposeService approvalApplicationDisposeService;
@Resource
private OaApprovalApplicationChangeService approvalApplicationChangeService;
@Resource
private OaApprovalApplicationAttendanceService approvalApplicationAttendanceService;
@Resource
private TDeptService deptService;
@Resource
private OaApprovalTodoService oaApprovalTodoService;
@Resource
private OaApprovalFlowService approvalFlowService;
@ApiOperation("测试接口")
@PostMapping("/test")
public void test() {
List approvals = approvalService.list();
List list = approvalFlowService.list();
List oaApprovalFlowNodes = new ArrayList<>();
for (OaApproval approval : approvals) {
int i = 1;
for (OaApprovalFlow oaApprovalFlow : list) {
OaApprovalFlowNode oaApprovalFlowNode = new OaApprovalFlowNode();
oaApprovalFlowNode.setApprovalId(approval.getId());
oaApprovalFlowNode.setApprovalFlowId(oaApprovalFlow.getId());
oaApprovalFlowNode.setFlowName(oaApprovalFlow.getFlowName());
oaApprovalFlowNode.setSortOrder(i);
oaApprovalFlowNode.setApprovalType(0);
oaApprovalFlowNode.setStatus(true);
oaApprovalFlowNode.setSignFlag(true);
i++;
oaApprovalFlowNodes.add(oaApprovalFlowNode);
}
}
approvalFlowNodeService.saveBatch(oaApprovalFlowNodes);
}
@ApiOperation("待办事项列表")
@PostMapping("/pageList")
public R> pageList(@RequestBody ApprovalTodoListQuery query) {
List resList = new ArrayList<>();
Long userId = tokenService.getLoginUser().getUserId();
query.setUserId(userId);
PageInfo res = new PageInfo<>(query.getPageNum(), query.getPageSize());
PageInfo pageInfo = approvalTodoService.pageList(query);
List list = pageInfo.getRecords();
if (list.isEmpty()){
return R.ok(new PageInfo<>());
}
res.setTotal(pageInfo.getTotal());
List applicationIds = list.stream().map(OaApprovalTodo::getApplicationId).collect(Collectors.toList());
Map approvalApplicationReimbursementMap = approvalApplicationReimbursementService.lambdaQuery()
.in(OaApprovalApplicationReimbursement::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationReimbursement::getApprovalApplicationId, e -> e));
Map oaApprovalApplicationMoneyMap = approvalApplicationMoneyService.lambdaQuery()
.in(OaApprovalApplicationMoney::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationMoney::getApprovalApplicationId, e -> e));
Map approvalApplicationPaymentMap = approvalApplicationPaymentService.lambdaQuery()
.in(OaApprovalApplicationPayment::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationPayment::getApprovalApplicationId, e -> e));
Map applicationStorageMap = approvalApplicationStorageService.lambdaQuery()
.in(OaApprovalApplicationStorage::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationStorage::getApprovalApplicationId, e -> e));
Map approvalApplicationAssetMap = approvalApplicationAssetService.lambdaQuery()
.in(OaApprovalApplicationAsset::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationAsset::getApprovalApplicationId, e -> e));
Map approvalApplicationDisposeMap = approvalApplicationDisposeService.lambdaQuery()
.in(OaApprovalApplicationDispose::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationDispose::getApprovalApplicationId, e -> e));
Map approvalApplicationChangeMap = approvalApplicationChangeService.lambdaQuery()
.in(OaApprovalApplicationChange::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationChange::getApprovalApplicationId, e -> e));
Map approvalApplicationPurchaseMap = approvalApplicationPurchaseService.lambdaQuery()
.in(OaApprovalApplicationPurchase::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationPurchase::getApprovalApplicationId, e -> e));
Map> approvalApplicationAssetItemMap = approvalApplicationAssetItemService.lambdaQuery()
.in(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.groupingBy(OaApprovalApplicationAssetItem::getApprovalApplicationId));
Map approvalApplicationAdvertisementMap = approvalApplicationAdvertisementService.lambdaQuery()
.in(OaApprovalApplicationAdvertisement::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationAdvertisement::getApprovalApplicationId, e -> e));
Map applicationAttendanceMap = approvalApplicationAttendanceService.lambdaQuery()
.in(OaApprovalApplicationAttendance::getApprovalApplicationId, applicationIds).list()
.stream().collect(Collectors.toMap(OaApprovalApplicationAttendance::getApprovalApplicationId, e -> e));
Map assetMainMap = assetMainService.list().stream().collect(Collectors.toMap(AssetMain::getId, e -> e));
Map approvalTodoMap = list.stream().collect(Collectors.toMap(OaApprovalTodo::getApplicationId, e -> e));
Map userMap = sysUserService.selectAllList().stream().collect(Collectors.toMap(SysUser::getUserId, e -> e));
Map deptMap = deptService.list().stream().collect(Collectors.toMap(TDept::getId, e -> e));
Map approvalMap = approvalService.list().stream().collect(Collectors.toMap(OaApproval::getId, e -> e));
List approvalApplications = approvalApplicationsService.lambdaQuery().in(OaApprovalApplications::getId, applicationIds).list();
for (OaApprovalApplications approvalApplication : approvalApplications) {
ApprovalTodoVO approvalTodoVO = new ApprovalTodoVO();
approvalTodoVO.setApprovalCategory(approvalMap.get(approvalApplication.getApprovalId()).getApprovalCategory());
switch (approvalTodoVO.getApprovalCategory()){
case 1:
case 2:
case 3:
case 4:
default:
OaApprovalApplicationAttendance oaApprovalApplicationAttendance = applicationAttendanceMap.get(approvalApplication.getId());
if (oaApprovalApplicationAttendance!=null){
approvalTodoVO.setStartTime(oaApprovalApplicationAttendance.getStartTime());
approvalTodoVO.setEndTime(oaApprovalApplicationAttendance.getEndTime());
approvalTodoVO.setDuration(oaApprovalApplicationAttendance.getDuration());
}
break;
}
SysUser sysUser = userMap.get(approvalApplication.getApplicantUserId().longValue());
if (sysUser!=null){
approvalTodoVO.setApplyUserName(sysUser.getUserName());
TDept tDept = deptMap.get(Integer.parseInt(sysUser.getDeptId()));
if (tDept!=null){
approvalTodoVO.setApplyDeptName(tDept.getDeptName());
}
}
approvalTodoVO.setApplicationCode(approvalApplication.getApplicationCode());
approvalTodoVO.setCreateTime(approvalApplication.getCreateTime());
OaApprovalTodo oaApprovalTodo = approvalTodoMap.get(approvalApplication.getId());
approvalTodoVO.setId(oaApprovalTodo.getId());
approvalTodoVO.setApplicationId(approvalApplication.getId());
switch (approvalTodoVO.getApprovalCategory()){
case 5:
OaApprovalApplicationPurchase oaApprovalApplicationPurchase = approvalApplicationPurchaseMap.get(approvalApplication.getId());
if (oaApprovalApplicationPurchase!=null){
approvalTodoVO.setAmount(oaApprovalApplicationPurchase.getTotalAmount());
}
break;
case 6:
OaApprovalApplicationStorage oaApprovalApplicationStorage = applicationStorageMap.get(approvalApplication.getId());
if (oaApprovalApplicationStorage!=null){
approvalTodoVO.setStorageType(oaApprovalApplicationStorage.getStorageType());
}
break;
case 7:
StringBuilder temp = new StringBuilder();
List oaApprovalApplicationAssetItems = approvalApplicationAssetItemMap.get(approvalApplication.getId());
if (oaApprovalApplicationAssetItems!=null){
for (OaApprovalApplicationAssetItem oaApprovalApplicationAssetItem : oaApprovalApplicationAssetItems) {
AssetMain assetMain = assetMainMap.get(oaApprovalApplicationAssetItem.getAssetMainId());
if (assetMain!=null){
temp.append(assetMain.getAssetName()).append(",");
}
}
// 去除最后一位字符
if (StringUtils.hasLength(temp.toString())){
approvalTodoVO.setAssetName(temp.substring(0, temp.length() - 1));
}else{
approvalTodoVO.setAssetName("");
}
}
break;
case 8:
OaApprovalApplicationAsset oaApprovalApplicationAssetOut = approvalApplicationAssetMap.get(approvalApplication.getId());
if (oaApprovalApplicationAssetOut!=null){
approvalTodoVO.setOperateTime(oaApprovalApplicationAssetOut.getOperateTime());
}
break;
case 9:
OaApprovalApplicationAsset oaApprovalApplicationAssetBack = approvalApplicationAssetMap.get(approvalApplication.getId());
if (oaApprovalApplicationAssetBack!=null){
approvalTodoVO.setOperateTime(oaApprovalApplicationAssetBack.getExpectReturnDate());
}
break;
case 10:
OaApprovalApplicationDispose oaApprovalApplicationDispose = approvalApplicationDisposeMap.get(approvalApplication.getId());
if (oaApprovalApplicationDispose!=null){
approvalTodoVO.setDisposeType(oaApprovalApplicationDispose.getDisposeType());
}
break;
case 11:
OaApprovalApplicationChange oaApprovalApplicationChange = approvalApplicationChangeMap.get(approvalApplication.getId());
if (oaApprovalApplicationChange!=null){
Integer ownershipDeptId = oaApprovalApplicationChange.getOwnershipDeptId();
TDept tDept = deptMap.get(ownershipDeptId);
if (tDept!=null){
approvalTodoVO.setOwnershipDeptName(tDept.getDeptName());
}
}
break;
case 12:
OaApprovalApplicationReimbursement oaApprovalApplicationReimbursement = approvalApplicationReimbursementMap.get(approvalApplication.getId());
if (oaApprovalApplicationReimbursement!=null){
approvalTodoVO.setAmount(oaApprovalApplicationReimbursement.getReimbursementAmount());
}
break;
case 13:
OaApprovalApplicationMoney oaApprovalApplicationMoney = oaApprovalApplicationMoneyMap.get(approvalApplication.getId());
if (oaApprovalApplicationMoney!=null){
approvalTodoVO.setAmount(oaApprovalApplicationMoney.getApplyAmount());
approvalTodoVO.setDescription(oaApprovalApplicationMoney.getDescription());
}
break;
case 15:
OaApprovalApplicationPayment oaApprovalApplicationPayment = approvalApplicationPaymentMap.get(approvalApplication.getId());
if (oaApprovalApplicationPayment!=null){
approvalTodoVO.setAmount(oaApprovalApplicationPayment.getApplyAmount());
approvalTodoVO.setDescription(approvalApplication.getApplicationReason());
}
break;
case 17:
OaApprovalApplicationAdvertisement oaApprovalApplicationAdvertisement = approvalApplicationAdvertisementMap.get(approvalApplication.getId());
if (oaApprovalApplicationAdvertisement!=null){
approvalTodoVO.setContent(oaApprovalApplicationAdvertisement.getContent());
approvalTodoVO.setAmount(oaApprovalApplicationAdvertisement.getTotalAmount());
}
break;
}
resList.add(approvalTodoVO);
}
res.setRecords(resList);
return R.ok(res);
}
@ApiOperation(value = "合同文件审批详情")
@GetMapping(value = "/detailContract")
public R detailContract(@ApiParam("待办列表id") Integer id) {
OaApprovalTodo approvalTodo = approvalTodoService.getById(id);
OaApprovalApplications approvalApplications = approvalApplicationsService.getById(approvalTodo.getApplicationId());
OaApprovalApplicationContract approvalApplicationContract = approvalApplicationContractService.lambdaQuery()
.eq(OaApprovalApplicationContract::getApprovalApplicationId, approvalApplications.getId())
.last("limit 1").one();
List approvalFlowAudits = approvalFlowAuditService.lambdaQuery().eq(OaApprovalFlowAudit::getApprovalApplicationId, approvalApplications.getId())
.orderByAsc(OaApprovalFlowAudit::getSortOrder)
.list();
ContractDetailVO res = new ContractDetailVO();
List approvalFlowNodes = approvalFlowNodeService.lambdaQuery()
.eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.CONTRACT.getCode())
.orderByAsc(OaApprovalFlowNode::getSortOrder)
.eq(OaApprovalFlowNode::getStatus, 1).list();
List flowNodeList = getFlowNodeList(approvalApplications, res, approvalFlowAudits,approvalFlowNodes);
res.setApprovalFlowNodeListVOS(flowNodeList);
res.setApprovalApplicationId(approvalApplications.getId());
res.setContractUrl(approvalApplicationContract.getContractUrl());
res.setApplicationReason(approvalApplications.getApplicationReason());
res.setAttachmentUrl(approvalApplications.getAttachmentUrl());
return R.ok(res);
}
@ApiOperation(value = "进度款支付审批详情")
@GetMapping(value = "/detailPayment")
public R detailPayment(@ApiParam("待办列表id") Integer id) {
OaApprovalTodo approvalTodo = approvalTodoService.getById(id);
OaApprovalApplications approvalApplications = approvalApplicationsService.getById(approvalTodo.getApplicationId());
OaApprovalApplicationContract approvalApplicationContract = approvalApplicationContractService.lambdaQuery()
.eq(OaApprovalApplicationContract::getApprovalApplicationId, approvalApplications.getId())
.last("limit 1").one();
List approvalFlowAudits = approvalFlowAuditService.lambdaQuery().eq(OaApprovalFlowAudit::getApprovalApplicationId, approvalApplications.getId())
.orderByAsc(OaApprovalFlowAudit::getSortOrder)
.list();
ContractDetailVO res = new ContractDetailVO();
List approvalFlowNodes = approvalFlowNodeService.lambdaQuery()
.eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.PAYMENT.getCode())
.orderByAsc(OaApprovalFlowNode::getSortOrder)
.eq(OaApprovalFlowNode::getStatus, 1).list();
List flowNodeList = getFlowNodeList(approvalApplications, res, approvalFlowAudits,approvalFlowNodes);
res.setApprovalFlowNodeListVOS(flowNodeList);
res.setApprovalApplicationId(approvalApplications.getId());
res.setContractUrl(approvalApplicationContract.getContractUrl());
res.setApplicationReason(approvalApplications.getApplicationReason());
res.setAttachmentUrl(approvalApplications.getAttachmentUrl());
return R.ok(res);
}
private List getFlowNodeList(OaApprovalApplications approvalApplications, ContractDetailVO res, List approvalFlowAudits
,List approvalFlowNodes) {
List approvalFlowNodeListVOS = new ArrayList<>();
Map approvalFlowAuditMap = approvalFlowAudits.stream().collect(Collectors.toMap(OaApprovalFlowAudit::getFlowNodeId, e -> e));
ApprovalFlowNodeListVO approvalFlowNodeListVO = new ApprovalFlowNodeListVO();
approvalFlowNodeListVO.setFlowName("发起");
SysUser sysUser = sysUserService.selectUserById(approvalApplications.getApplicantUserId().longValue());
if (sysUser!=null){
approvalFlowNodeListVO.setUserName(sysUser.getUserName());
res.setUserName(sysUser.getUserName());
TDept dept = deptService.getById(sysUser.getDeptId());
if (dept!=null){
res.setDeptName(dept.getDeptName());
}
}
approvalFlowNodeListVOS.add(approvalFlowNodeListVO);
for (OaApprovalFlowNode approvalFlowNode : approvalFlowNodes) {
ApprovalFlowNodeListVO approvalFlowNodeVO = new ApprovalFlowNodeListVO();
OaApprovalFlowAudit approvalFlowAudit = approvalFlowAuditMap.get(approvalFlowNode.getId());
if (approvalFlowAudit!=null){
approvalFlowNodeVO.setFlowName(approvalFlowAudit.getFlowName());
approvalFlowNodeVO.setUserName(approvalFlowAudit.getUserName());
approvalFlowNodeVO.setSignPicUrl(approvalFlowAudit.getSignPicUrl());
approvalFlowNodeVO.setApprovalStatus(approvalFlowAudit.getApprovalStatus());
}else{
approvalFlowNodeVO.setFlowName(approvalFlowNode.getFlowName());
}
approvalFlowNodeListVOS.add(approvalFlowNodeVO);
}
for (OaApprovalFlowAudit approvalFlowAudit : approvalFlowAudits) {
ApprovalFlowNodeListVO approvalFlowNodeVO = new ApprovalFlowNodeListVO();
approvalFlowNodeVO.setFlowName(approvalFlowAudit.getFlowName());
approvalFlowNodeVO.setUserName(approvalFlowAudit.getUserName());
approvalFlowNodeVO.setSignPicUrl(approvalFlowAudit.getSignPicUrl());
approvalFlowNodeVO.setApprovalStatus(approvalFlowAudit.getApprovalStatus());
approvalFlowNodeListVOS.add(approvalFlowNodeVO);
}
return approvalFlowNodeListVOS;
}
}