变更通知单

This commit is contained in:
10001392 2024-08-02 09:22:13 +08:00
parent ae38289524
commit fd94ef194b
7 changed files with 556 additions and 204 deletions

View File

@ -0,0 +1,11 @@
package com.nflg.product.bomnew.mapper.master;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity;
/**
* @author makejava
*/
public interface BomNewNoticeNumDetail2Mapper extends BaseMapper<BomNewNoticeNumDetail2Entity> {
}

View File

@ -0,0 +1,77 @@
package com.nflg.product.bomnew.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* t_bom_new_notice_num_detail2
* 变更通知单明细表2
*
* @author makejava
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "com-nflg-product-bomnew-pojo-main-entity-BomNewNoticeNumDetail2Entity")
@TableName(value = "t_bom_new_notice_num_detail2")
public class BomNewNoticeNumDetail2Entity implements Serializable {
/**
* 行ID 雪花
*/
@TableId(value = "row_id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "行ID 雪花")
private Long rowId;
/**
* 行ID 雪花抬头行ID
*/
@ApiModelProperty(value = "header_row_id")
private Long headerRowId;
/**
* 父级编码
*/
@TableField(value = "parent_material_no")
@ApiModelProperty(value = "父级编码")
private String parentMaterialNo;
/**
* BOM行编号
*/
@TableField(value = "order_num")
@ApiModelProperty(value = "BOM行编号")
private String orderNum;
/**
* 物料编码
*/
@TableField(value = "material_no")
@ApiModelProperty(value = "物料编码")
private String materialNo;
/**
* 变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更
*/
@TableField(value = "change_type")
@ApiModelProperty(value = "变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更")
private Integer changeType;
/**
* 变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更
*/
@TableField(value = "change_content")
@ApiModelProperty(value = "变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更")
private String changeContent;
private static final long serialVersionUID = 1L;
}

View File

@ -115,6 +115,8 @@ public class BomNewEbomParentService extends ServiceImpl<BomNewEbomParentMapper,
private BomNewNoticeNumService bomNewNoticeNumService;
@Resource
private BomNewNoticeNumDetailService bomNewNoticeNumDetailService;
@Resource
private BomNewNoticeNumDetail2Service bomNewNoticeNumDetail2Service;
public List<BomNewEbomParentVO> getParentChild( Long rowId) {
@ -2978,126 +2980,241 @@ public class BomNewEbomParentService extends ServiceImpl<BomNewEbomParentMapper,
saveEntity.setChangeDesc(param.getChangeDesc());
saveEntity.setNoticeContent(newestParent.getMaterialDesc() + "BOM变更由EBOM发起详见下方明细");
saveEntity.setNoticeTitle("关于" + newestParent.getMaterialDesc() + "BOM变更的通知");
saveEntity.setNoticeTitle(param.getChangeDesc());
saveEntity.setOaStatus(1); // 待提交
saveEntity.setCreatedName(SessionUtil.getRealName());
saveEntity.setCreatedBy(SessionUtil.getUserCode());
saveEntity.setCreatedTime(LocalDateTime.now());
String autoCode = null;
// 关联已有通知单
if (param.getNumType() == 2) {
saveEntity.setNoticeNum(param.getNoticeNums());
} else {
saveEntity.setNoticeNum(bomNewNoticeNumService.generateNoticeNum());
autoCode = bomNewNoticeNumService.generateNoticeNum();
saveEntity.setNoticeNum(autoCode);
}
bomNewNoticeNumService.save(saveEntity);
// 正式表回写通知单号升版说明
BomNewEbomParentFormalEntity updateFormalParent = new BomNewEbomParentFormalEntity();
updateFormalParent.setRowId(versionList.get(0).getRowId());
if (param.getNumType() == 2) {
updateFormalParent.setNoticeNums(param.getNoticeNums());
} else {
updateFormalParent.setNoticeNums(autoCode);
}
updateFormalParent.setChangeDesc(param.getChangeDesc());
bomNewEbomParentFormalService.updateById(updateFormalParent);
// 工作表最新版回写通知单号升版说明因为正式表标签页查询的也是工作表最新版的数据
BomNewEbomParentEntity updateParent = new BomNewEbomParentEntity();
updateParent.setRowId(versionList.get(0).getRowId());
if (param.getNumType() == 2) {
updateParent.setNoticeNums(param.getNoticeNums());
} else {
updateParent.setNoticeNums(autoCode);
}
updateParent.setChangeDesc(param.getChangeDesc());
this.updateById(updateParent);
// 新建通知单
if (param.getNumType() == 1) {
List<BomNewEbomChildFormalEntity> newestChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list();
List<BomNewEbomChildFormalEntity> lastChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list();
List<String> newestMaterialNos = newestChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
List<String> lastMaterialNos = lastChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
// BOM明细集合1如果某父级A的任一子级相对于上一版本有变更变更判断优先顺序物料增加>物料减少>物料替代>改物料数量>改物料项目类别则记录父级A到集合1
List<BomNewNoticeNumDetailEntity> noticeNumDetailEntityList = new ArrayList<>();
// BOM明细集合2如果某父级A的子级相对于上一版本有变更5种情况都得考虑则记录变更的子级到集合2
List<BomNewNoticeNumDetail2Entity> noticeNumDetailEntity2List = new ArrayList<>();
// 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7]
// 旧版和新版的交集 -> [3,4,5]
List<String> intersection =new ArrayList<>(lastMaterialNos);
intersection.retainAll(newestMaterialNos);
// 旧版相对于新版的差集 -> [1,2]
List<String> difference = new ArrayList<>(lastMaterialNos);
difference.removeAll(newestMaterialNos);
// 新版相对于旧版的差集 -> [6,7]
List<String> difference2 = new ArrayList<>(newestMaterialNos);
difference2.removeAll(lastMaterialNos);
long start = System.currentTimeMillis();
// 递归调用
buildNoticeNumDetailList(saveEntity.getRowId(), noticeNumDetailEntityList, noticeNumDetailEntity2List, newestParent, lastParent);
long end = System.currentTimeMillis();
log.info("【EBOM {} 生成变更通知单】递归调用耗时(ms){}", newestParent.getMaterialNo(), (end - start));
List<BomNewNoticeNumDetailEntity> saveDetailList = new ArrayList<>();
// 物料变更的场景有5种物料增加物料减少物料替代改物料数量改物料项目类别
// 两个差集元素的个数不等则认为 difference2 的物料是增加difference 的物料是减少
if (difference.size() != difference2.size()) {
difference.forEach(remove -> {
BomNewEbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(removeEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(removeEntity.getMaterialNo());
saveDetail.setDrawingNo(removeEntity.getDrawingNo());
saveDetail.setMaterialName(removeEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(2);
saveDetail.setChangeContent("BOM物料减少");
saveDetailList.add(saveDetail);
}
});
difference2.forEach(add -> {
BomNewEbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(addEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(addEntity.getMaterialNo());
saveDetail.setDrawingNo(addEntity.getDrawingNo());
saveDetail.setMaterialName(addEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(1);
saveDetail.setChangeContent("BOM物料增加");
saveDetailList.add(saveDetail);
}
});
} else {
// 个数相等则认为 difference2 difference 的替代物料
if (CollectionUtil.isNotEmpty(difference2)) {
difference2.forEach(replace -> {
BomNewEbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(replaceEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(replaceEntity.getMaterialNo());
saveDetail.setDrawingNo(replaceEntity.getDrawingNo());
saveDetail.setMaterialName(replaceEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(3);
saveDetail.setChangeContent("BOM物料替换");
saveDetailList.add(saveDetail);
}
});
}
if (CollectionUtil.isNotEmpty(noticeNumDetailEntityList)) {
bomNewNoticeNumDetailService.saveBatch(noticeNumDetailEntityList);
}
// 遍历交集如果旧版和新版物料的数量不等则认为是改物料数量如果旧版和新版物料的项目类别不一致则认为是改物料项目类别
intersection.forEach(entity -> {
BomNewEbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
BomNewEbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(newestChild.getMaterialNo());
saveDetail.setDrawingNo(newestChild.getDrawingNo());
saveDetail.setMaterialName(newestChild.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(4);
saveDetail.setChangeContent("BOM物料数量变更");
saveDetailList.add(saveDetail);
}
if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(newestChild.getMaterialNo());
saveDetail.setDrawingNo(newestChild.getDrawingNo());
saveDetail.setMaterialName(newestChild.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(5);
saveDetail.setChangeContent("BOM项目类别变更");
saveDetailList.add(saveDetail);
}
});
bomNewNoticeNumDetailService.saveBatch(saveDetailList);
bomNewNoticeNumService.sync2Oa(saveEntity, saveDetailList);
if (CollectionUtil.isNotEmpty(noticeNumDetailEntity2List)) {
bomNewNoticeNumDetail2Service.saveBatch(noticeNumDetailEntity2List);
}
bomNewNoticeNumService.sync2Oa(saveEntity, noticeNumDetailEntityList, noticeNumDetailEntity2List);
}
}
}
private void buildNoticeNumDetailList(Long noticeNumRowId, List<BomNewNoticeNumDetailEntity> noticeNumDetailEntityList, List<BomNewNoticeNumDetail2Entity> noticeNumDetailEntity2List,
BomNewEbomParentFormalEntity newestParent, BomNewEbomParentFormalEntity lastParent) {
if (ObjectUtil.isEmpty(newestParent) || ObjectUtil.isEmpty(lastParent)) {
return;
}
List<BomNewEbomChildFormalEntity> newestChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list();
List<BomNewEbomChildFormalEntity> lastChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list();
if (CollectionUtil.isEmpty(newestChildList) || CollectionUtil.isEmpty(lastChildList)) {
return;
}
List<String> newestMaterialNos = newestChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
List<String> lastMaterialNos = lastChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
// Bom明细1 是否已经添加过该父级只需添加一次
boolean noticeNumDetailEntityListAdded = false;
// 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7]
// 旧版和新版的交集 -> [3,4,5]
List<String> intersection = new ArrayList<>(lastMaterialNos);
intersection.retainAll(newestMaterialNos);
// 旧版相对于新版的差集 -> [1,2]
List<String> difference = new ArrayList<>(lastMaterialNos);
difference.removeAll(newestMaterialNos);
// 新版相对于旧版的差集 -> [6,7]
List<String> difference2 = new ArrayList<>(newestMaterialNos);
difference2.removeAll(lastMaterialNos);
// 物料变更的场景有5种物料增加物料减少物料替代改物料数量改物料项目类别
// 两个差集元素的个数不等则认为 difference2 的物料是增加difference 的物料是减少
if (difference.size() != difference2.size()) {
for (String add : difference2) {
BomNewEbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(addEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(1);
saveDetail.setChangeContent("BOM物料增加");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(addEntity.getOrderNumber());
saveDetail2.setMaterialNo(addEntity.getMaterialNo());
saveDetail2.setChangeType(1);
saveDetail2.setChangeContent("BOM物料增加");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
for (String remove : difference) {
BomNewEbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(removeEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(2);
saveDetail.setChangeContent("BOM物料减少");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(lastParent.getMaterialNo());
saveDetail2.setOrderNum(removeEntity.getOrderNumber());
saveDetail2.setMaterialNo(removeEntity.getMaterialNo());
saveDetail2.setChangeType(2);
saveDetail2.setChangeContent("BOM物料减少");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
} else {
// 个数相等则认为 difference2 difference 的替代物料
if (CollectionUtil.isNotEmpty(difference2)) {
for (String replace : difference2) {
BomNewEbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(replaceEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(3);
saveDetail.setChangeContent("BOM物料替换");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(replaceEntity.getOrderNumber());
saveDetail2.setMaterialNo(replaceEntity.getMaterialNo());
saveDetail2.setChangeType(3);
saveDetail2.setChangeContent("BOM物料替换");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
}
}
// 遍历交集如果旧版和新版物料的数量不等则认为是改物料数量如果旧版和新版物料的项目类别不一致则认为是改物料项目类别
for (String entity : intersection) {
BomNewEbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
BomNewEbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(4);
saveDetail.setChangeContent("BOM物料数量变更");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(newestChild.getOrderNumber());
saveDetail2.setMaterialNo(newestChild.getMaterialNo());
saveDetail2.setChangeType(4);
saveDetail2.setChangeContent("BOM物料数量变更:" + lastChild.getNum() + "->" + newestChild.getNum());
noticeNumDetailEntity2List.add(saveDetail2);
}
if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(5);
saveDetail.setChangeContent("BOM项目类别变更");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(newestChild.getOrderNumber());
saveDetail2.setMaterialNo(newestChild.getMaterialNo());
saveDetail2.setChangeType(5);
saveDetail2.setChangeContent("BOM项目类别变更:" + lastChild.getProjectType() + "->" + newestChild.getProjectType());
noticeNumDetailEntity2List.add(saveDetail2);
}
BomNewEbomParentFormalEntity newestP = bomNewEbomParentFormalService.lambdaQuery().eq(BomNewEbomParentFormalEntity::getRowId, newestChild.getBomVersionRowId()).one();
BomNewEbomParentFormalEntity lastP = bomNewEbomParentFormalService.lambdaQuery().eq(BomNewEbomParentFormalEntity::getRowId, lastChild.getBomVersionRowId()).one();
buildNoticeNumDetailList(noticeNumRowId, noticeNumDetailEntityList, noticeNumDetailEntity2List, newestP, lastP);
}
}
}

View File

@ -0,0 +1,15 @@
package com.nflg.product.bomnew.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.product.bomnew.mapper.master.BomNewNoticeNumDetail2Mapper;
import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity;
import org.springframework.stereotype.Service;
/**
* @author makejava
*/
@Service
public class BomNewNoticeNumDetail2Service extends ServiceImpl<BomNewNoticeNumDetail2Mapper, BomNewNoticeNumDetail2Entity> {
}

View File

@ -14,6 +14,7 @@ import com.nflg.product.bomnew.config.NacosConfig;
import com.nflg.product.bomnew.mapper.master.BomNewNoticeNumMapper;
import com.nflg.product.bomnew.pojo.dto.OaNoticeNumParamDto;
import com.nflg.product.bomnew.pojo.dto.OaResult;
import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity;
import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetailEntity;
import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumEntity;
import com.nflg.product.bomnew.util.HttpUtils;
@ -61,8 +62,8 @@ public class BomNewNoticeNumService extends ServiceImpl<BomNewNoticeNumMapper, B
return "MJT" + today + "01";
}
public void sync2Oa(BomNewNoticeNumEntity saveEntity, List<BomNewNoticeNumDetailEntity> saveDetailList) {
if (CollectionUtil.isEmpty(saveDetailList)) {
public void sync2Oa(BomNewNoticeNumEntity saveEntity, List<BomNewNoticeNumDetailEntity> saveDetailList, List<BomNewNoticeNumDetail2Entity> saveDetail2List) {
if (CollectionUtil.isEmpty(saveDetailList) && CollectionUtil.isEmpty(saveDetail2List)) {
return;
}
String employeeNo = SessionUtil.getUserCode();
@ -85,6 +86,16 @@ public class BomNewNoticeNumService extends ServiceImpl<BomNewNoticeNumMapper, B
bomList.add(bom);
});
main.put("bomList", bomList);
List<Map<String, Object>> bomList2 = new ArrayList<>(saveDetail2List.size());
saveDetail2List.forEach(saveDetail2 -> {
Map<String, Object> bom = new HashMap<>();
bom.put("parentMaterialNo", saveDetail2.getParentMaterialNo()); // 父级编码
bom.put("orderNum", saveDetail2.getOrderNum()); // BOM行编号
bom.put("materialNo", saveDetail2.getMaterialNo()); // 编码
bom.put("changeContent", saveDetail2.getChangeContent()); // 变更内容
bomList2.add(bom);
});
main.put("bomList2", bomList2);
log.info("发起变更通知单-JSON" + JSONArray.toJSONString(main));
HttpUtils httpUtils = new HttpUtils();
try {

View File

@ -120,6 +120,8 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
private BomNewNoticeNumService bomNewNoticeNumService;
@Resource
private BomNewNoticeNumDetailService bomNewNoticeNumDetailService;
@Resource
private BomNewNoticeNumDetail2Service bomNewNoticeNumDetail2Service;
/**
* pbom-工作列表
@ -1541,126 +1543,241 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
saveEntity.setChangeDesc(param.getChangeDesc());
saveEntity.setNoticeContent(newestParent.getMaterialDesc() + "BOM变更由PBOM发起详见下方明细");
saveEntity.setNoticeTitle("关于" + newestParent.getMaterialDesc() + "BOM变更的通知");
saveEntity.setNoticeTitle(param.getChangeDesc());
saveEntity.setOaStatus(1); // 待提交
saveEntity.setCreatedName(SessionUtil.getRealName());
saveEntity.setCreatedBy(SessionUtil.getUserCode());
saveEntity.setCreatedTime(LocalDateTime.now());
String autoCode = null;
// 关联已有通知单
if (param.getNumType() == 2) {
saveEntity.setNoticeNum(param.getNoticeNums());
} else {
saveEntity.setNoticeNum(bomNewNoticeNumService.generateNoticeNum());
autoCode = bomNewNoticeNumService.generateNoticeNum();
saveEntity.setNoticeNum(autoCode);
}
bomNewNoticeNumService.save(saveEntity);
// 正式表回写通知单号升版说明
BomNewPbomParentFormalEntity updateFormalParent = new BomNewPbomParentFormalEntity();
updateFormalParent.setRowId(versionList.get(0).getRowId());
if (param.getNumType() == 2) {
updateFormalParent.setNoticeNums(param.getNoticeNums());
} else {
updateFormalParent.setNoticeNums(autoCode);
}
updateFormalParent.setChangeDesc(param.getChangeDesc());
bomNewPbomParentFormalService.updateById(updateFormalParent);
// 工作表最新版回写通知单号升版说明因为正式表标签页查询的也是工作表最新版的数据
BomNewPbomParentEntity updateParent = new BomNewPbomParentEntity();
updateParent.setRowId(versionList.get(0).getRowId());
if (param.getNumType() == 2) {
updateParent.setNoticeNums(param.getNoticeNums());
} else {
updateParent.setNoticeNums(autoCode);
}
updateParent.setChangeDesc(param.getChangeDesc());
this.updateById(updateParent);
// 新建通知单
if (param.getNumType() == 1) {
List<BomNewPbomChildFormalEntity> newestChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list();
List<BomNewPbomChildFormalEntity> lastChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list();
List<String> newestMaterialNos = newestChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
List<String> lastMaterialNos = lastChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
// BOM明细集合1如果某父级A的任一子级相对于上一版本有变更变更判断优先顺序物料增加>物料减少>物料替代>改物料数量>改物料项目类别则记录父级A到集合1
List<BomNewNoticeNumDetailEntity> noticeNumDetailEntityList = new ArrayList<>();
// BOM明细集合2如果某父级A的子级相对于上一版本有变更5种情况都得考虑则记录变更的子级到集合2
List<BomNewNoticeNumDetail2Entity> noticeNumDetailEntity2List = new ArrayList<>();
// 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7]
// 旧版和新版的交集 -> [3,4,5]
List<String> intersection =new ArrayList<>(lastMaterialNos);
intersection.retainAll(newestMaterialNos);
// 旧版相对于新版的差集 -> [1,2]
List<String> difference = new ArrayList<>(lastMaterialNos);
difference.removeAll(newestMaterialNos);
// 新版相对于旧版的差集 -> [6,7]
List<String> difference2 = new ArrayList<>(newestMaterialNos);
difference2.removeAll(lastMaterialNos);
long start = System.currentTimeMillis();
// 递归调用
buildNoticeNumDetailList(saveEntity.getRowId(), noticeNumDetailEntityList, noticeNumDetailEntity2List, newestParent, lastParent);
long end = System.currentTimeMillis();
log.info("【PBOM {} 生成变更通知单】递归调用耗时(ms){}", newestParent.getMaterialNo(), (end - start));
List<BomNewNoticeNumDetailEntity> saveDetailList = new ArrayList<>();
// 物料变更的场景有5种物料增加物料减少物料替代改物料数量改物料项目类别
// 两个差集元素的个数不等则认为 difference2 的物料是增加difference 的物料是减少
if (difference.size() != difference2.size()) {
difference.forEach(remove -> {
BomNewPbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(removeEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(removeEntity.getMaterialNo());
saveDetail.setDrawingNo(removeEntity.getDrawingNo());
saveDetail.setMaterialName(removeEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(2);
saveDetail.setChangeContent("BOM物料减少");
saveDetailList.add(saveDetail);
}
});
difference2.forEach(add -> {
BomNewPbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(addEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(addEntity.getMaterialNo());
saveDetail.setDrawingNo(addEntity.getDrawingNo());
saveDetail.setMaterialName(addEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(1);
saveDetail.setChangeContent("BOM物料增加");
saveDetailList.add(saveDetail);
}
});
} else {
// 个数相等则认为 difference2 difference 的替代物料
if (CollectionUtil.isNotEmpty(difference2)) {
difference2.forEach(replace -> {
BomNewPbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(replaceEntity)) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(replaceEntity.getMaterialNo());
saveDetail.setDrawingNo(replaceEntity.getDrawingNo());
saveDetail.setMaterialName(replaceEntity.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(3);
saveDetail.setChangeContent("BOM物料替换");
saveDetailList.add(saveDetail);
}
});
}
if (CollectionUtil.isNotEmpty(noticeNumDetailEntityList)) {
bomNewNoticeNumDetailService.saveBatch(noticeNumDetailEntityList);
}
// 遍历交集如果旧版和新版物料的数量不等则认为是改物料数量如果旧版和新版物料的项目类别不一致则认为是改物料项目类别
intersection.forEach(entity -> {
BomNewPbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
BomNewPbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(newestChild.getMaterialNo());
saveDetail.setDrawingNo(newestChild.getDrawingNo());
saveDetail.setMaterialName(newestChild.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(4);
saveDetail.setChangeContent("BOM物料数量变更");
saveDetailList.add(saveDetail);
}
if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(saveEntity.getRowId());
saveDetail.setMaterialNo(newestChild.getMaterialNo());
saveDetail.setDrawingNo(newestChild.getDrawingNo());
saveDetail.setMaterialName(newestChild.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(5);
saveDetail.setChangeContent("BOM项目类别变更");
saveDetailList.add(saveDetail);
}
});
bomNewNoticeNumDetailService.saveBatch(saveDetailList);
bomNewNoticeNumService.sync2Oa(saveEntity, saveDetailList);
if (CollectionUtil.isNotEmpty(noticeNumDetailEntity2List)) {
bomNewNoticeNumDetail2Service.saveBatch(noticeNumDetailEntity2List);
}
bomNewNoticeNumService.sync2Oa(saveEntity, noticeNumDetailEntityList, noticeNumDetailEntity2List);
}
}
}
private void buildNoticeNumDetailList(Long noticeNumRowId, List<BomNewNoticeNumDetailEntity> noticeNumDetailEntityList, List<BomNewNoticeNumDetail2Entity> noticeNumDetailEntity2List,
BomNewPbomParentFormalEntity newestParent, BomNewPbomParentFormalEntity lastParent) {
if (ObjectUtil.isEmpty(newestParent) || ObjectUtil.isEmpty(lastParent)) {
return;
}
List<BomNewPbomChildFormalEntity> newestChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list();
List<BomNewPbomChildFormalEntity> lastChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list();
if (CollectionUtil.isEmpty(newestChildList) || CollectionUtil.isEmpty(lastChildList)) {
return;
}
List<String> newestMaterialNos = newestChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
List<String> lastMaterialNos = lastChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList());
// Bom明细1 是否已经添加过该父级只需添加一次
boolean noticeNumDetailEntityListAdded = false;
// 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7]
// 旧版和新版的交集 -> [3,4,5]
List<String> intersection = new ArrayList<>(lastMaterialNos);
intersection.retainAll(newestMaterialNos);
// 旧版相对于新版的差集 -> [1,2]
List<String> difference = new ArrayList<>(lastMaterialNos);
difference.removeAll(newestMaterialNos);
// 新版相对于旧版的差集 -> [6,7]
List<String> difference2 = new ArrayList<>(newestMaterialNos);
difference2.removeAll(lastMaterialNos);
// 物料变更的场景有5种物料增加物料减少物料替代改物料数量改物料项目类别
// 两个差集元素的个数不等则认为 difference2 的物料是增加difference 的物料是减少
if (difference.size() != difference2.size()) {
for (String add : difference2) {
BomNewPbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(addEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(1);
saveDetail.setChangeContent("BOM物料增加");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(addEntity.getOrderNumber());
saveDetail2.setMaterialNo(addEntity.getMaterialNo());
saveDetail2.setChangeType(1);
saveDetail2.setChangeContent("BOM物料增加");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
for (String remove : difference) {
BomNewPbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(removeEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(2);
saveDetail.setChangeContent("BOM物料减少");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(lastParent.getMaterialNo());
saveDetail2.setOrderNum(removeEntity.getOrderNumber());
saveDetail2.setMaterialNo(removeEntity.getMaterialNo());
saveDetail2.setChangeType(2);
saveDetail2.setChangeContent("BOM物料减少");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
} else {
// 个数相等则认为 difference2 difference 的替代物料
if (CollectionUtil.isNotEmpty(difference2)) {
for (String replace : difference2) {
BomNewPbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(replaceEntity)) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(3);
saveDetail.setChangeContent("BOM物料替换");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(replaceEntity.getOrderNumber());
saveDetail2.setMaterialNo(replaceEntity.getMaterialNo());
saveDetail2.setChangeType(3);
saveDetail2.setChangeContent("BOM物料替换");
noticeNumDetailEntity2List.add(saveDetail2);
}
}
}
}
// 遍历交集如果旧版和新版物料的数量不等则认为是改物料数量如果旧版和新版物料的项目类别不一致则认为是改物料项目类别
for (String entity : intersection) {
BomNewPbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
BomNewPbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(4);
saveDetail.setChangeContent("BOM物料数量变更");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(newestChild.getOrderNumber());
saveDetail2.setMaterialNo(newestChild.getMaterialNo());
saveDetail2.setChangeType(4);
saveDetail2.setChangeContent("BOM物料数量变更:" + lastChild.getNum() + "->" + newestChild.getNum());
noticeNumDetailEntity2List.add(saveDetail2);
}
if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) {
if (!noticeNumDetailEntityListAdded) {
BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity();
saveDetail.setRowId(IdWorker.getId());
saveDetail.setHeaderRowId(noticeNumRowId);
saveDetail.setMaterialNo(newestParent.getMaterialNo());
saveDetail.setDrawingNo(newestParent.getDrawingNo());
saveDetail.setMaterialName(newestParent.getMaterialName());
saveDetail.setParentMaterialNo("");
saveDetail.setChangeType(5);
saveDetail.setChangeContent("BOM项目类别变更");
noticeNumDetailEntityList.add(saveDetail);
noticeNumDetailEntityListAdded = true;
}
BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity();
saveDetail2.setRowId(IdWorker.getId());
saveDetail2.setHeaderRowId(noticeNumRowId);
saveDetail2.setParentMaterialNo(newestParent.getMaterialNo());
saveDetail2.setOrderNum(newestChild.getOrderNumber());
saveDetail2.setMaterialNo(newestChild.getMaterialNo());
saveDetail2.setChangeType(5);
saveDetail2.setChangeContent("BOM项目类别变更:" + lastChild.getProjectType() + "->" + newestChild.getProjectType());
noticeNumDetailEntity2List.add(saveDetail2);
}
BomNewPbomParentFormalEntity newestP = bomNewPbomParentFormalService.lambdaQuery().eq(BomNewPbomParentFormalEntity::getRowId, newestChild.getBomVersionRowId()).one();
BomNewPbomParentFormalEntity lastP = bomNewPbomParentFormalService.lambdaQuery().eq(BomNewPbomParentFormalEntity::getRowId, lastChild.getBomVersionRowId()).one();
buildNoticeNumDetailList(noticeNumRowId, noticeNumDetailEntityList, noticeNumDetailEntity2List, newestP, lastP);
}
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.product.bomnew.mapper.master.BomNewNoticeNumDetail2Mapper">
</mapper>