From b7af1b87ab8f911e40d71657824c5c60cfbf489f Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Sat, 13 Jun 2026 15:37:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=87=E8=B4=AD=E9=9C=80=E6=B1=82=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BB=91=E5=AE=9A=E7=89=A9=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/oa/domain/OaRequirements.java | 4 + .../ruoyi/oa/domain/bo/OaRequirementsBo.java | 5 + .../ruoyi/oa/domain/vo/OaRequirementsVo.java | 16 + .../impl/OaRequirementsServiceImpl.java | 64 ++- .../impl/SysOaWarehouseServiceImpl.java | 2 + .../src/views/oa/task/requirement/index.vue | 388 +++++++++++++++--- sql/requirement_add_material.sql | 7 + 7 files changed, 430 insertions(+), 56 deletions(-) create mode 100644 sql/requirement_add_material.sql diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaRequirements.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaRequirements.java index 1a0116e..e7c7cd9 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaRequirements.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaRequirements.java @@ -45,6 +45,10 @@ public class OaRequirements extends BaseEntity { * 挂接项目 ID,可选 */ private Long projectId; + /** + * 关联物料 ID CSV -> sys_oa_warehouse.id,可选 + */ + private String materialIds; /** * 需求描述 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaRequirementsBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaRequirementsBo.java index a3f67b8..79771ba 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaRequirementsBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaRequirementsBo.java @@ -49,6 +49,11 @@ public class OaRequirementsBo extends BaseEntity { */ private Long projectId; + /** + * 关联物料 ID CSV,多个物料用逗号分隔 + */ + private String materialIds; + /** * 需求描述 */ 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 17b1923..aa0e026 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 @@ -89,6 +89,22 @@ public class OaRequirementsVo extends BaseEntity { private String ownerNickName; private String projectName; + /** 关联物料 ID CSV */ + private String materialIds; + /** 关联物料明细(service 层 enrich,列表/详情都返回) */ + private java.util.List materials; + + @Data + public static class MaterialItem implements java.io.Serializable { + private Long id; + private String name; + private String model; + private String unit; + private Long inventory; + private String brand; + private String specifications; + } + /** 附件文件列表(已联查 sys_oss,每项形如 "||",逗号分隔) */ private String accessoryFiles; 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 8c6a631..ae84c49 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 @@ -15,13 +15,19 @@ import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaRequirementsBo; import com.ruoyi.oa.domain.vo.OaRequirementsVo; import com.ruoyi.oa.domain.OaRequirements; +import com.ruoyi.oa.domain.SysOaWarehouse; import com.ruoyi.oa.mapper.OaRequirementsMapper; +import com.ruoyi.oa.mapper.SysOaWarehouseMapper; import com.ruoyi.oa.service.IOaRequirementsService; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Collection; +import java.util.stream.Collectors; /** * OA 需求Service业务层处理 @@ -37,12 +43,63 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { private final OaWarehouseAuditService auditService; + private final SysOaWarehouseMapper warehouseMapper; + /** * 查询OA 需求 */ @Override public OaRequirementsVo queryById(Long requirementId){ - return baseMapper.selectVoById(requirementId); + OaRequirementsVo vo = baseMapper.selectVoById(requirementId); + enrichMaterials(Collections.singletonList(vo)); + return vo; + } + + /** 根据 material_ids(CSV)批量补全物料明细到 VO.materials */ + private void enrichMaterials(List list) { + if (list == null || list.isEmpty()) return; + Set ids = new HashSet<>(); + for (OaRequirementsVo v : list) { + if (v == null) continue; + for (Long id : parseCsv(v.getMaterialIds())) ids.add(id); + } + if (ids.isEmpty()) return; + List wList = warehouseMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() + .in("id", ids)); + Map wMap = wList.stream() + .collect(Collectors.toMap(SysOaWarehouse::getId, w -> w, (a, b) -> a)); + for (OaRequirementsVo v : list) { + if (v == null) continue; + List mids = parseCsv(v.getMaterialIds()); + if (mids.isEmpty()) continue; + List items = new ArrayList<>(); + for (Long id : mids) { + SysOaWarehouse w = wMap.get(id); + if (w == null) continue; + OaRequirementsVo.MaterialItem it = new OaRequirementsVo.MaterialItem(); + it.setId(w.getId()); + it.setName(w.getName()); + it.setModel(w.getModel()); + it.setUnit(w.getUnit()); + it.setInventory(w.getInventory()); + it.setBrand(w.getBrand()); + it.setSpecifications(w.getSpecifications()); + items.add(it); + } + v.setMaterials(items); + } + } + + private List parseCsv(String csv) { + if (csv == null || csv.isEmpty()) return Collections.emptyList(); + List r = new ArrayList<>(); + for (String s : csv.split(",")) { + String t = s.trim(); + if (t.isEmpty()) continue; + try { r.add(Long.parseLong(t)); } catch (NumberFormatException ignored) {} + } + return r; } /** @@ -52,6 +109,7 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { public TableDataInfo queryPageList(OaRequirementsBo bo, PageQuery pageQuery) { QueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoListPage(pageQuery.build(), lqw); + enrichMaterials(result.getRecords()); return TableDataInfo.build(result); } @@ -61,7 +119,9 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService { @Override public List queryList(OaRequirementsBo bo) { QueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoListForExport(lqw); + List list = baseMapper.selectVoListForExport(lqw); + enrichMaterials(list); + return list; } private QueryWrapper buildQueryWrapper(OaRequirementsBo bo) { diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaWarehouseServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaWarehouseServiceImpl.java index baab89b..e52a354 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaWarehouseServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaWarehouseServiceImpl.java @@ -68,6 +68,8 @@ public class SysOaWarehouseServiceImpl implements ISysOaWarehouseService { .like("sow.brand", bo.getName()) .or() .like("sow.model", bo.getName()) + .or() + .like("sow.specifications", bo.getName()) ) .eq(StringUtils.isNotBlank(bo.getModel()), "sow.model", bo.getModel()) .eq(StringUtils.isNotBlank(bo.getBrand()), "sow.brand", bo.getBrand()); diff --git a/ruoyi-ui/src/views/oa/task/requirement/index.vue b/ruoyi-ui/src/views/oa/task/requirement/index.vue index 3ef94b7..cebc2f1 100644 --- a/ruoyi-ui/src/views/oa/task/requirement/index.vue +++ b/ruoyi-ui/src/views/oa/task/requirement/index.vue @@ -66,40 +66,25 @@ - - - - + + + +