diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaRequirementsVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaRequirementsVo.java index aa0e026..96abc16 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaRequirementsVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaRequirementsVo.java @@ -108,5 +108,10 @@ public class OaRequirementsVo extends BaseEntity { /** 附件文件列表(已联查 sys_oss,每项形如 "||",逗号分隔) */ private String accessoryFiles; + /** 审批状态:null=未提交审批,0=待审,1=通过,2=驳回,3=撤回 */ + private Integer approvalStatus; + /** 审批单 id(最新一次) */ + private Long approvalInstanceId; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaRequirementsServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaRequirementsServiceImpl.java index ae84c49..1967d06 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaRequirementsServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaRequirementsServiceImpl.java @@ -14,14 +14,19 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaRequirementsBo; import com.ruoyi.oa.domain.vo.OaRequirementsVo; +import com.ruoyi.oa.domain.OaApprovalInstance; import com.ruoyi.oa.domain.OaRequirements; import com.ruoyi.oa.domain.SysOaWarehouse; +import com.ruoyi.oa.mapper.OaApprovalInstanceMapper; import com.ruoyi.oa.mapper.OaRequirementsMapper; import com.ruoyi.oa.mapper.SysOaWarehouseMapper; +import com.ruoyi.oa.service.IOaApprovalService; import com.ruoyi.oa.service.IOaRequirementsService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -39,12 +44,18 @@ import java.util.stream.Collectors; @Service public class OaRequirementsServiceImpl implements IOaRequirementsService { + public static final String BIZ_TYPE = "purchase_req"; + private final OaRequirementsMapper baseMapper; private final OaWarehouseAuditService auditService; private final SysOaWarehouseMapper warehouseMapper; + private final IOaApprovalService approvalService; + + private final OaApprovalInstanceMapper approvalInstanceMapper; + /** * 查询OA 需求 */ @@ -52,9 +63,33 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { public OaRequirementsVo queryById(Long requirementId){ OaRequirementsVo vo = baseMapper.selectVoById(requirementId); enrichMaterials(Collections.singletonList(vo)); + enrichApproval(Collections.singletonList(vo)); return vo; } + /** 给 VO 列表注入审批状态(最新一条实例) */ + private void enrichApproval(List list) { + if (list == null || list.isEmpty()) return; + List ids = list.stream().filter(v -> v != null && v.getRequirementId() != null) + .map(OaRequirementsVo::getRequirementId).collect(Collectors.toList()); + if (ids.isEmpty()) return; + List insts = approvalInstanceMapper.selectList( + Wrappers.lambdaQuery() + .eq(OaApprovalInstance::getBusinessType, BIZ_TYPE) + .in(OaApprovalInstance::getBusinessId, ids) + .orderByAsc(OaApprovalInstance::getId)); + Map latest = new HashMap<>(); + for (OaApprovalInstance i : insts) latest.put(i.getBusinessId(), i); + for (OaRequirementsVo v : list) { + if (v == null) continue; + OaApprovalInstance i = latest.get(v.getRequirementId()); + if (i != null) { + v.setApprovalStatus(i.getStatus()); + v.setApprovalInstanceId(i.getId()); + } + } + } + /** 根据 material_ids(CSV)批量补全物料明细到 VO.materials */ private void enrichMaterials(List list) { if (list == null || list.isEmpty()) return; @@ -110,6 +145,7 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { QueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoListPage(pageQuery.build(), lqw); enrichMaterials(result.getRecords()); + enrichApproval(result.getRecords()); return TableDataInfo.build(result); } @@ -121,6 +157,7 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { QueryWrapper lqw = buildQueryWrapper(bo); List list = baseMapper.selectVoListForExport(lqw); enrichMaterials(list); + enrichApproval(list); return list; } @@ -161,6 +198,8 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { bo.setRequirementId(add.getRequirementId()); auditService.log(OpType.REQ_CREATE, OpType.REF_REQUIREMENT, add.getRequirementId(), "新建采购需求:" + add.getTitle()); + // 触发审批流 + approvalService.submit(BIZ_TYPE, add.getRequirementId(), add.getTitle()); } return flag; } @@ -172,6 +211,17 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { public Boolean updateByBo(OaRequirementsBo bo) { OaRequirements update = BeanUtil.toBean(bo, OaRequirements.class); validEntityBeforeSave(update); + // 推进到采购中/完成 前必须审批通过 + if (bo.getStatus() != null && (bo.getStatus() == 1 || bo.getStatus() == 2)) { + OaApprovalInstance i = approvalInstanceMapper.selectOne( + Wrappers.lambdaQuery() + .eq(OaApprovalInstance::getBusinessType, BIZ_TYPE) + .eq(OaApprovalInstance::getBusinessId, bo.getRequirementId()) + .orderByDesc(OaApprovalInstance::getId).last("LIMIT 1")); + if (i == null || i.getStatus() == null || i.getStatus() != 1) { + throw new com.ruoyi.common.exception.ServiceException("该采购需求尚未审批通过,无法推进状态"); + } + } boolean ok = baseMapper.updateById(update) > 0; if (ok) { String op = OpType.REQ_UPDATE; diff --git a/ruoyi-ui/src/views/oa/task/allocation/index.vue b/ruoyi-ui/src/views/oa/task/allocation/index.vue index 0b4ce30..0bddd69 100644 --- a/ruoyi-ui/src/views/oa/task/allocation/index.vue +++ b/ruoyi-ui/src/views/oa/task/allocation/index.vue @@ -42,8 +42,8 @@ 如要发放采购相关需求请移步采购需求管理(点击此处快速跳转) - - + +
-
- - 查看附件 - -
+
暂无附件...
@@ -374,6 +375,7 @@ import { addTask, delTask, getTask, listTask, updateTask } from "@/api/oa/task"; import { deptTreeSelect, selectUser } from "@/api/system/user"; import UserSelect from "@/components/UserSelect"; import ProjectSelect from "@/components/fad-service/ProjectSelect"; +import FilePreview from "@/components/FilePreview"; import OperationLogDrawer from "@/views/oa/project/operationLog/OperationLogDrawer.vue"; @@ -382,6 +384,7 @@ export default { components: { UserSelect, ProjectSelect, + FilePreview, OperationLogDrawer }, dicts: ['sys_project_type', 'sys_project_status', 'sys_work_type', 'sys_sort_grade'], @@ -426,7 +429,7 @@ export default { // 查询参数 queryParams: { pageNum: 1, - pageSize: 10, + pageSize: 20, searchTime: [], }, userList: [], @@ -765,12 +768,116 @@ export default {