From d61d55ffbe7f39f6415d34ab5bec5afbbf415b4c Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Wed, 8 Jul 2026 09:11:58 +0800 Subject: [PATCH] =?UTF-8?q?2026-07-07=20RoHS=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BAIFS=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E5=92=8C=E6=8F=8F=E8=BF=B0=EF=BC=8C=E5=B9=B6=E7=BB=99=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lab/service/impl/LabServiceImpl.java | 10 +- .../modules/rohs/entity/RohsEntity.java | 12 + .../modules/rohs/mapper/RohsMapper.java | 4 + .../rohs/service/impl/RohsServiceImpl.java | 102 ++++++-- src/main/resources/mapper/rohs/RohsMapper.xml | 220 +++++++++++++++++- 5 files changed, 316 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java b/src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java index 70d89a33..4dd47a48 100644 --- a/src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java +++ b/src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java @@ -76,9 +76,9 @@ public class LabServiceImpl extends ServiceImpl implements @Override public PageUtils queryPage(Map params) { - params.put("referenceNo", toLikeParam((String) params.get("referenceNo"))); - params.put("applicant", toLikeParam((String) params.get("applicant"))); - params.put("currentApprover", toLikeParam((String) params.get("currentApprover"))); + params.put("referenceNo", trimToNull((String) params.get("referenceNo"))); + params.put("applicant", trimToNull((String) params.get("applicant"))); + params.put("currentApprover", trimToNull((String) params.get("currentApprover"))); IPage page = this.baseMapper.queryPageWithNames( new Query().getPage(params), @@ -561,11 +561,11 @@ public class LabServiceImpl extends ServiceImpl implements throw new RuntimeException(e.getMessage()); } - private String toLikeParam(String value) { + private String trimToNull(String value) { if (StringUtils.isBlank(value)) { return null; } - return "%" + value.trim() + "%"; + return value.trim(); } private String convertFieldValue(Object valueObj) { diff --git a/src/main/java/com/spring/modules/rohs/entity/RohsEntity.java b/src/main/java/com/spring/modules/rohs/entity/RohsEntity.java index e501775f..1632ee86 100644 --- a/src/main/java/com/spring/modules/rohs/entity/RohsEntity.java +++ b/src/main/java/com/spring/modules/rohs/entity/RohsEntity.java @@ -412,6 +412,18 @@ public class RohsEntity implements Serializable { @TableField(exist = false) private String commGroup3Desc; + /** + * 主信息行显示的IFS物料编码(取材料信息第一条) + */ + @TableField(exist = false) + private String mainIfsPartNo; + + /** + * 主信息行显示的物料描述(取材料信息第一条) + */ + @TableField(exist = false) + private String mainPartDesc; + /** * RoHs材料明细(一对多) */ diff --git a/src/main/java/com/spring/modules/rohs/mapper/RohsMapper.java b/src/main/java/com/spring/modules/rohs/mapper/RohsMapper.java index 561238ec..b5d500a6 100644 --- a/src/main/java/com/spring/modules/rohs/mapper/RohsMapper.java +++ b/src/main/java/com/spring/modules/rohs/mapper/RohsMapper.java @@ -20,6 +20,10 @@ public interface RohsMapper extends BaseMapper { IPage queryPageWithNames(IPage page, @Param("params") Map params); + long queryPageWithNamesCount(@Param("params") Map params); + + List queryPageWithNamesData(@Param("offset") long offset, @Param("size") long size, @Param("params") Map params); + IPage queryPageWithNamesAny(IPage page, @Param("params") Map params); RohsEntity getDetailWithNames(@Param("site") String site, @Param("referenceNo") String referenceNo); diff --git a/src/main/java/com/spring/modules/rohs/service/impl/RohsServiceImpl.java b/src/main/java/com/spring/modules/rohs/service/impl/RohsServiceImpl.java index 4d983dc7..0d3e7e01 100644 --- a/src/main/java/com/spring/modules/rohs/service/impl/RohsServiceImpl.java +++ b/src/main/java/com/spring/modules/rohs/service/impl/RohsServiceImpl.java @@ -2,6 +2,8 @@ package com.spring.modules.rohs.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.spring.common.utils.Constant; import com.spring.common.utils.DateUtils; @@ -45,12 +47,14 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; import static com.spring.modules.base.utils.CommonUtils.getPropertyValue; @Service("rohsService") public class RohsServiceImpl extends ServiceImpl implements RohsService { private static final String HSF_STANDARD_CUSTOMER = "C00052"; + private static final Pattern ORDER_COLUMN_PATTERN = Pattern.compile("^[A-Za-z0-9_.]+$"); @Autowired private SysUserDao sysUserDao; @@ -75,23 +79,28 @@ public class RohsServiceImpl extends ServiceImpl impleme @Override public PageUtils queryPage(Map params) { - params.put("referenceNo", toLikeParam((String) params.get("referenceNo"))); - params.put("applicant", toLikeParam((String) params.get("applicant"))); - params.put("currentApprover", toLikeParam((String) params.get("currentApprover"))); - - IPage page = this.baseMapper.queryPageWithNames( - new Query().getPage(params), - params - ); - List records = page.getRecords(); + params.put("referenceNo", trimToNull((String) params.get("referenceNo"))); + params.put("applicant", trimToNull((String) params.get("applicant"))); + params.put("currentApprover", trimToNull((String) params.get("currentApprover"))); + params.put("ifsPartNo", trimToNull((String) params.get("ifsPartNo"))); + params.put("materialDesc", trimToNull((String) params.get("materialDesc"))); + + long currPage = parseLong(params.get(Constant.PAGE), 1L); + long pageSize = parseLong(params.get(Constant.LIMIT), 10L); + long total = this.baseMapper.queryPageWithNamesCount(params); + long offset = pageSize > 0 ? Math.max(currPage - 1, 0L) * pageSize : 0L; + + List records = this.baseMapper.queryPageWithNamesData(offset, pageSize, params); if (records != null && !records.isEmpty()) { Map userDisplayCache = new HashMap<>(); for (RohsEntity rohs : records) { fillUserDisplayFields(rohs, userDisplayCache); } } - - return new PageUtils(page); + int resultPageSize = pageSize > 0 + ? (int) pageSize + : Math.max(records == null ? 0 : records.size(), 1); + return new PageUtils(records, (int) total, resultPageSize, (int) currPage); } @Override @@ -108,10 +117,11 @@ public class RohsServiceImpl extends ServiceImpl impleme params.put("menuId", data.getMenuId()); params.put("userName", data.getUserName()); params.put("whereClause", whereClause); - params.put("orderClause", orderClause); + Page pageReq = new Page<>(data.getNo(), data.getSize()); + applyPageOrder(pageReq, orderClause); IPage page = this.baseMapper.queryPageWithNamesAny( - new com.baomidou.mybatisplus.extension.plugins.pagination.Page(data.getNo(), data.getSize()), + pageReq, params ); List records = page.getRecords(); @@ -389,9 +399,9 @@ public class RohsServiceImpl extends ServiceImpl impleme @Override public PageUtils queryProjectMaterialPage(Map params) { - params.put("finalPartNo", toLikeParam((String) params.get("finalPartNo"))); - params.put("partDesc", toLikeParam((String) params.get("partDesc"))); - params.put("partStatus", toLikeParam((String) params.get("partStatus"))); + params.put("finalPartNo", trimToNull((String) params.get("finalPartNo"))); + params.put("partDesc", trimToNull((String) params.get("partDesc"))); + params.put("partStatus", trimToNull((String) params.get("partStatus"))); IPage> page = this.baseMapper.queryProjectMaterialPage( new Query>().getPage(params), @@ -600,11 +610,67 @@ public class RohsServiceImpl extends ServiceImpl impleme throw new RuntimeException(e.getMessage()); } - private String toLikeParam(String value) { + private String trimToNull(String value) { if (StringUtils.isBlank(value)) { return null; } - return "%" + value.trim() + "%"; + return value.trim(); + } + + private long parseLong(Object value, long defaultValue) { + if (value == null) { + return defaultValue; + } + try { + return Long.parseLong(String.valueOf(value)); + } catch (Exception e) { + return defaultValue; + } + } + + private void applyPageOrder(Page page, String orderClause) { + if (page == null) { + return; + } + String normalizedOrderClause = StringUtils.trimToEmpty(orderClause); + if (StringUtils.isBlank(normalizedOrderClause)) { + page.addOrder(OrderItem.desc("reference_no")); + return; + } + boolean hasValidOrder = false; + String[] orderItems = normalizedOrderClause.split(","); + for (String orderItem : orderItems) { + String singleOrder = StringUtils.trimToEmpty(orderItem); + if (StringUtils.isBlank(singleOrder)) { + continue; + } + String orderDirection = "DESC"; + String orderColumn = singleOrder; + int lastSpaceIndex = singleOrder.lastIndexOf(" "); + if (lastSpaceIndex > 0) { + String maybeDirection = StringUtils.trimToEmpty(singleOrder.substring(lastSpaceIndex + 1)); + if ("ASC".equalsIgnoreCase(maybeDirection) || "DESC".equalsIgnoreCase(maybeDirection)) { + orderDirection = maybeDirection.toUpperCase(); + orderColumn = StringUtils.trimToEmpty(singleOrder.substring(0, lastSpaceIndex)); + } + } + if (!isSafeOrderColumn(orderColumn)) { + continue; + } + if ("ASC".equalsIgnoreCase(orderDirection)) { + page.addOrder(OrderItem.asc(orderColumn)); + } else { + page.addOrder(OrderItem.desc(orderColumn)); + } + hasValidOrder = true; + } + if (!hasValidOrder) { + page.addOrder(OrderItem.desc("reference_no")); + } + } + + private boolean isSafeOrderColumn(String orderColumn) { + return StringUtils.isNotBlank(orderColumn) && ORDER_COLUMN_PATTERN.matcher(orderColumn).matches(); } private String convertFieldValue(Object valueObj) { diff --git a/src/main/resources/mapper/rohs/RohsMapper.xml b/src/main/resources/mapper/rohs/RohsMapper.xml index 419a5d5f..01229b38 100644 --- a/src/main/resources/mapper/rohs/RohsMapper.xml +++ b/src/main/resources/mapper/rohs/RohsMapper.xml @@ -75,6 +75,8 @@ + + @@ -113,10 +115,33 @@ dbo.plm_get_project_name(a.site, a.project_id) as projectName, dbo.get_product_group_name(a.site, a.comm_group1, '1') as commGroup1Desc, dbo.get_product_group_name(a.site, a.comm_group2, '2') as commGroup2Desc, - dbo.get_product_group_name(a.site, a.comm_group3, '5') as commGroup3Desc + dbo.get_product_group_name(a.site, a.comm_group3, '5') as commGroup3Desc, + isnull(firstMaterial.final_part_no, isnull(a.ifs_part_no, '')) as mainIfsPartNo, + isnull(firstMaterial.part_desc, isnull(a.material_desc, '')) as mainPartDesc from plm_rohs a left join plm_request_header prh on a.site = prh.site and prh.menu_id = #{params.menuId} and prh.status = 'Y' left join plm_request_node d on a.site = d.site and prh.classification_no = d.classification_no and prh.workflow_id = d.workflow_id and a.step_id = d.step_id + outer apply ( + select + m.final_part_no, + m.part_desc + from plm_rohs_material m + where m.site = a.site + and m.reference_no = a.reference_no + and m.line_no = ( + select min(m2.line_no) + from plm_rohs_material m2 + where m2.site = a.site + and m2.reference_no = a.reference_no + ) + and m.id = ( + select min(m3.id) + from plm_rohs_material m3 + where m3.site = a.site + and m3.reference_no = a.reference_no + and m3.line_no = m.line_no + ) + ) firstMaterial where 1 = 1 and a.site = #{params.site} @@ -136,10 +161,147 @@ and dbo.get_plm_Approval_username(a.site, prh.workflow_id, d.node_id, a.reference_no) like #{params.currentApprover} + + and isnull(firstMaterial.final_part_no, isnull(a.ifs_part_no, '')) like #{params.ifsPartNo} + + + and isnull(firstMaterial.part_desc, isnull(a.material_desc, '')) like #{params.materialDesc} + + + and a.applicant like #{params.applicant} + + + + + +