Browse Source

RFQ BOM复制树数据确实问题

java8
han\hanst 2 months ago
parent
commit
cafeb1e232
  1. 21
      src/main/java/com/xujie/sys/modules/part/mapper/BomSearch3Mapper.java
  2. 107
      src/main/java/com/xujie/sys/modules/part/service/impl/BomSearch3ServiceImpl.java
  3. 150
      src/main/resources/mapper/part/BomSearch3Mapper.xml

21
src/main/java/com/xujie/sys/modules/part/mapper/BomSearch3Mapper.java

@ -6,6 +6,7 @@ import com.xujie.sys.modules.part.entity.*;
import com.xujie.sys.modules.part.vo.BomComponentVo; import com.xujie.sys.modules.part.vo.BomComponentVo;
import com.xujie.sys.modules.part.vo.BomDetailVo; import com.xujie.sys.modules.part.vo.BomDetailVo;
import com.xujie.sys.modules.part.vo.BomHeaderVo; import com.xujie.sys.modules.part.vo.BomHeaderVo;
import com.xujie.sys.modules.part.entity.PlmQuicklyBomInfoEntity;
import com.xujie.sys.modules.quote.entity.QuoteDetailRouting; import com.xujie.sys.modules.quote.entity.QuoteDetailRouting;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -72,4 +73,24 @@ public interface BomSearch3Mapper {
void saveStandardOperation(List<CopyTempRouting> collect); void saveStandardOperation(List<CopyTempRouting> collect);
void updateCopyTempBom(CopyTempBom data); void updateCopyTempBom(CopyTempBom data);
List<PlmQuicklyBomInfoEntity> queryOriginalBomNodeTree(@Param("site") String site, @Param("originalPartNo") String originalPartNo);
void batchInsertQuicklyBomInfo(@Param("list") List<PlmQuicklyBomInfoEntity> list);
void deleteBomHeaderForCopy(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void deleteBomDetailForCopy(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void deleteRoutingHeaderForCopy(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void deleteRoutingDetailForCopy(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void saveBomHeaderFromTemp(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void saveBomDetailFromTemp(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void saveRoutingHeaderFromTemp(@Param("bomId") Long bomId, @Param("createBy") String createBy);
void saveRoutingDetailFromTemp(@Param("bomId") Long bomId, @Param("createBy") String createBy);
} }

107
src/main/java/com/xujie/sys/modules/part/service/impl/BomSearch3ServiceImpl.java

@ -593,11 +593,49 @@ public class BomSearch3ServiceImpl implements BomSearch3Service {
if (!"Y".equals(bomTreeHeader.getChangeFlag())) { if (!"Y".equals(bomTreeHeader.getChangeFlag())) {
throw new RuntimeException("成品物料未变更!"); throw new RuntimeException("成品物料未变更!");
} }
// 新增BOM
log.info("=== 开始保存完整BOM数据 ===");
log.info("原BOM物料: {}, 新BOM物料: {}", data.getPartNo(), bomTreeHeader.getPartNo());
// 步骤0: 清理已存在的数据幂等性设计
log.info("步骤0: 清理已存在的BOM数据");
//bomSearch3Mapper.deleteBomHeaderForCopy(data.getBomId(), data.getCreateBy());
bomSearch3Mapper.deleteBomDetailForCopy(data.getBomId(), data.getCreateBy());
bomSearch3Mapper.deleteRoutingHeaderForCopy(data.getBomId(), data.getCreateBy());
bomSearch3Mapper.deleteRoutingDetailForCopy(data.getBomId(), data.getCreateBy());
// 1. 新增BOM header主表
log.info("步骤1: 保存BOM header");
//bomSearch3Mapper.saveBomHeaderFromTemp(data.getBomId(), data.getCreateBy());
// 2. 新增BOM detail明细表
log.info("步骤2: 保存BOM detail");
bomSearch3Mapper.saveBomDetailFromTemp(data.getBomId(), data.getCreateBy());
// 3. 新增BOM component子物料
log.info("步骤3: 保存BOM component");
bomSearch3Mapper.saveBomComponentFromTemp(data.getBomId(), data.getCreateBy()); bomSearch3Mapper.saveBomComponentFromTemp(data.getBomId(), data.getCreateBy());
// 新增Routing
// 4. 新增Routing header主表
log.info("步骤4: 保存Routing header");
bomSearch3Mapper.saveRoutingHeaderFromTemp(data.getBomId(), data.getCreateBy());
// 5. 新增Routing detail明细表
log.info("步骤5: 保存Routing detail");
bomSearch3Mapper.saveRoutingDetailFromTemp(data.getBomId(), data.getCreateBy());
// 6. 新增Routing component工艺路线
log.info("步骤6: 保存Routing component");
bomSearch3Mapper.saveRoutingComponentFromTemp(data.getBomId(), data.getCreateBy()); bomSearch3Mapper.saveRoutingComponentFromTemp(data.getBomId(), data.getCreateBy());
// 新增物料属性
// 7. 新增BOM节点树到快速创建BOM表
log.info("步骤7: 保存BOM节点树");
// data.getPartNo() = 原BOM的物料编码, bomTreeHeader.getPartNo() = 新BOM的物料编码
saveQuicklyBomInfoFromTemp(data.getSite(), data.getPartNo(), bomTreeHeader.getPartNo(), data.getCreateBy());
log.info("=== 完整BOM数据保存完成 ===");
// 8. 新增物料属性
List<CopyTempItemValue> itemValues = copyTempItemValueMapper.selectList(new LambdaQueryWrapper<CopyTempItemValue>().eq(CopyTempItemValue::getTreeId, bomTreeHeader.getId())); List<CopyTempItemValue> itemValues = copyTempItemValueMapper.selectList(new LambdaQueryWrapper<CopyTempItemValue>().eq(CopyTempItemValue::getTreeId, bomTreeHeader.getId()));
if (!itemValues.isEmpty()) { if (!itemValues.isEmpty()) {
for (CopyTempBomTree bomTree : bomTrees) { for (CopyTempBomTree bomTree : bomTrees) {
@ -630,6 +668,69 @@ public class BomSearch3ServiceImpl implements BomSearch3Service {
.eq(CopyTempItemValue::getCreateBy, data.getCreateBy())); .eq(CopyTempItemValue::getCreateBy, data.getCreateBy()));
} }
/**
* 复制原BOM的节点树到新的mainPart下
* @param site 站点
* @param originalPartNo 原BOM物料编码被复制的
* @param newPartNo 新BOM物料编码复制目标
* @param createBy 创建人
*/
private void saveQuicklyBomInfoFromTemp(String site, String originalPartNo, String newPartNo, String createBy) {
log.info("=== 开始复制BOM节点树到快速创建表 ===");
log.info("site: {}, 原BOM物料: {}, 新BOM物料: {}, 创建人: {}", site, originalPartNo, newPartNo, createBy);
// 查询原BOM的节点树结构
List<PlmQuicklyBomInfoEntity> originalNodes = bomSearch3Mapper.queryOriginalBomNodeTree(site, originalPartNo);
if (originalNodes.isEmpty()) {
log.warn("原BOM没有节点树数据,不执行复制。originalPartNo: {}", originalPartNo);
log.warn("这可能是因为原BOM不是通过快速创建BOM功能创建的");
return;
}
log.info("找到原BOM节点树,共{}个节点", originalNodes.size());
// 复制节点树修改mainPart和part_no根节点
List<PlmQuicklyBomInfoEntity> newNodes = new ArrayList<>();
for (PlmQuicklyBomInfoEntity originalNode : originalNodes) {
PlmQuicklyBomInfoEntity newNode = new PlmQuicklyBomInfoEntity();
// 复制所有字段保留原节点结构
newNode.setSite(originalNode.getSite());
newNode.setTemplateNo(originalNode.getTemplateNo());
newNode.setNodeId(originalNode.getNodeId());
newNode.setNodeName(originalNode.getNodeName());
newNode.setId(originalNode.getId());
newNode.setpId(originalNode.getpId());
newNode.setEngChgLevel(originalNode.getEngChgLevel());
newNode.setRoutingRevision(originalNode.getRoutingRevision());
newNode.setCreateBy(createBy);
// 修改mainPart为新物料编码
newNode.setMainPart(newPartNo);
// 如果是根节点p_id = '0'修改part_no为新物料编码
if ("0".equals(originalNode.getpId())) {
newNode.setPartNo(newPartNo);
log.info("复制根节点: id={}, 原partNo={} → 新partNo={}",
originalNode.getId(), originalNode.getPartNo(), newPartNo);
} else {
// 子节点保持原来的part_no
newNode.setPartNo(originalNode.getPartNo());
log.debug("复制子节点: id={}, partNo={}", originalNode.getId(), originalNode.getPartNo());
}
newNodes.add(newNode);
}
// 批量插入
if (!newNodes.isEmpty()) {
bomSearch3Mapper.batchInsertQuicklyBomInfo(newNodes);
log.info("=== BOM节点树复制完成!共复制{}个节点 ===", newNodes.size());
log.info("新BOM物料编码: {}, 可在quicklyCreateBom页面查看", newPartNo);
}
}
@Override @Override
@Transactional @Transactional
public void saveStandardOperationByCopy(CopyTempRouting data) { public void saveStandardOperationByCopy(CopyTempRouting data) {

150
src/main/resources/mapper/part/BomSearch3Mapper.xml

@ -637,6 +637,156 @@
where tree_id = #{treeId} where tree_id = #{treeId}
</insert> </insert>
<!-- 删除已存在的BOM header(用于复制前清理)-->
<delete id="deleteBomHeaderForCopy">
delete from plm_bom_header
where site = (select top 1 site from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bu_no = (select top 1 bu_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and part_no = (select top 1 part_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and eng_chg_level = (select top 1 eng_chg_level from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bom_type = (select top 1 bom_type from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
</delete>
<!-- 从临时表保存BOM header -->
<insert id="saveBomHeaderFromTemp">
insert into plm_bom_header
(site, bu_no, part_no, eng_chg_level, bom_type, note_text, eff_phase_in_date, eng_revision, type_flag, net_weight, create_date, create_by, process_unit)
select distinct
site,
bu_no,
part_no,
eng_chg_level,
bom_type,
null as note_text,
getDate() as eff_phase_in_date,
1 as eng_revision,
null as type_flag,
0 as net_weight,
getDate() as create_date,
#{createBy} as create_by,
null as process_unit
from plm_copy_temp_bom_tree
where bom_id = #{bomId} and username = #{createBy} and change_flag = 'Y' and level = 0
</insert>
<!-- 删除已存在的BOM detail(用于复制前清理)-->
<delete id="deleteBomDetailForCopy">
delete from plm_bom_detail
where site = (select top 1 site from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bu_no = (select top 1 bu_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and part_no = (select top 1 part_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and eng_chg_level = (select top 1 eng_chg_level from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bom_type = (select top 1 bom_type from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
</delete>
<!-- 从临时表保存BOM detail -->
<insert id="saveBomDetailFromTemp">
insert into plm_bom_detail
(site, bu_no, part_no, eng_chg_level, bom_type, alternative_no, alternative_description, status, min_lot_qty, default_flag, note_text, create_date, create_by)
select distinct
site,
bu_no,
part_no,
eng_chg_level,
bom_type,
alternative_no,
'*' as alternative_description,
'Released' as status,
1 as min_lot_qty,
'Y' as default_flag,
null as note_text,
getDate() as create_date,
#{createBy} as create_by
from plm_copy_temp_bom_tree
where bom_id = #{bomId} and username = #{createBy} and change_flag = 'Y' and level = 0
</insert>
<!-- 删除已存在的Routing header(用于复制前清理)-->
<delete id="deleteRoutingHeaderForCopy">
delete from plm_routing_header
where site = (select top 1 site from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bu_no = (select top 1 bu_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and part_no = (select top 1 part_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and routing_revision = (select top 1 eng_chg_level from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and routing_type = (select top 1 bom_type from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
</delete>
<!-- 从临时表保存Routing header -->
<insert id="saveRoutingHeaderFromTemp">
insert into plm_routing_header
(site, bu_no, part_no, routing_revision, routing_type, note_text, phase_in_date, create_date, create_by)
select distinct
site,
bu_no,
part_no,
eng_chg_level as routing_revision,
bom_type as routing_type,
null as note_text,
getDate() as phase_in_date,
getDate() as create_date,
#{createBy} as create_by
from plm_copy_temp_bom_tree
where bom_id = #{bomId} and username = #{createBy} and change_flag = 'Y' and level = 0
</insert>
<!-- 删除已存在的Routing detail(用于复制前清理)-->
<delete id="deleteRoutingDetailForCopy">
delete from plm_routing_detail
where site = (select top 1 site from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and bu_no = (select top 1 bu_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and part_no = (select top 1 part_no from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and routing_revision = (select top 1 eng_chg_level from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
and routing_type = (select top 1 bom_type from plm_copy_temp_bom_tree where bom_id = #{bomId} and username = #{createBy} and level = 0)
</delete>
<!-- 从临时表保存Routing detail -->
<insert id="saveRoutingDetailFromTemp">
insert into plm_routing_detail
(site, bu_no, part_no, routing_revision, routing_type, alternative_no, status, create_date, create_by)
select distinct
site,
bu_no,
part_no,
eng_chg_level as routing_revision,
bom_type as routing_type,
alternative_no,
'Released' as status,
getDate() as create_date,
#{createBy} as create_by
from plm_copy_temp_bom_tree
where bom_id = #{bomId} and username = #{createBy} and change_flag = 'Y' and level = 0
</insert>
<!-- 查询原BOM的节点树结构(用于复制)-->
<select id="queryOriginalBomNodeTree" resultType="com.xujie.sys.modules.part.entity.PlmQuicklyBomInfoEntity">
SELECT
site,
template_no,
node_id,
node_name,
part_no,
id,
p_id,
eng_chg_level,
routing_revision
FROM plm_quickly_bom_Info
WHERE site = #{site}
AND main_part = #{originalPartNo}
ORDER BY id
</select>
<!-- 批量插入快速BOM节点 -->
<insert id="batchInsertQuicklyBomInfo">
INSERT INTO plm_quickly_bom_Info
(site, template_no, node_id, main_part, part_no, id, p_id, create_date, create_by, node_name, eng_chg_level, routing_revision)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.site}, #{item.templateNo}, #{item.nodeId}, #{item.mainPart}, #{item.partNo},
#{item.id}, #{item.pId}, getDate(), #{item.createBy}, #{item.nodeName},
#{item.engChgLevel}, #{item.routingRevision})
</foreach>
</insert>
<update id="updateComponentPartNo"> <update id="updateComponentPartNo">
update plm_copy_temp_bom update plm_copy_temp_bom
set component_part = #{newPartNo} set component_part = #{newPartNo}

Loading…
Cancel
Save