diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/PbomSourceStatusEnum.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/PbomSourceStatusEnum.java new file mode 100644 index 00000000..0d3e8841 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/PbomSourceStatusEnum.java @@ -0,0 +1,20 @@ +package com.nflg.product.bomnew.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author luohj + * @date 2024/8/9 09:25:44 + */ +@AllArgsConstructor +@Getter +public enum PbomSourceStatusEnum implements ValueEnum { + + EBOM(1, "EBOM导入"), + PBOM(2, "PBOM创建"), + E_P(3, "E->P修改"); + + private final Integer value; + private final String description; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java index f11d21f0..6b4e1858 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java @@ -239,6 +239,10 @@ public class BomNewPbomChildEntity implements Serializable { @ApiModelProperty(value = "来源 1-ebom转换 2-dqbom转换 3-从SAP导入") private Integer source; + @TableField(value = "source_status") + @ApiModelProperty(value = "来源状态:1-EBOM导入、2-PBOM创建、3-E->P修改") + private Integer sourceStatus; + private static final long serialVersionUID = -76633783850936076L; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java index d8335599..943e8717 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java @@ -370,6 +370,10 @@ public class BomNewPbomParentEntity implements Serializable { @ApiModelProperty(value = "来源 1-ebom转换 2-dqbom转换 3-从SAP导入 4-复制") private Integer source; + @TableField(value = "source_status") + @ApiModelProperty(value = "来源状态:1-EBOM导入、2-PBOM创建、3-E->P修改") + private Integer sourceStatus; + private static final long serialVersionUID = -31999878274445137L; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java index 8aee4eff..03d20c54 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java @@ -293,6 +293,12 @@ public class BomNewPbomParentVO extends BaseMaterialVO implements Serializable { @ApiModelProperty("所有父级的rowId") private Set allParentRowIds = new HashSet<>(); + @ApiModelProperty(value = "来源状态:1-EBOM导入、2-PBOM创建、3-E->P修改") + private Integer sourceStatus; + + @ApiModelProperty(value = "来源状态:1-EBOM导入、2-PBOM创建、3-E->P修改") + private String sourceStatusName; + private String materialNoAndProjectType; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java index 93b21c19..9622d64c 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java @@ -5,18 +5,17 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.mzt.logapi.context.LogRecordContext; import com.nflg.product.base.core.conmon.util.SessionUtil; @@ -356,6 +355,8 @@ public class BomNewPbomParentService extends ServiceImpl childList = Convert.toList(BomNewPbomChildEntity.class, paramDTO.getChildList()); - childList.forEach(u -> u.setParentRowId(paramDTO.getBomRowId())); + List childIds = paramDTO.getChildList().stream().map(BomNewPbomParentVO::getRowId).collect(Collectors.toList()); + List pChildList = Lists.newArrayList(); + if(!childIds.isEmpty()){ + pChildList = pbomChildService.list(Wrappers.lambdaQuery().in(BomNewPbomChildEntity::getRowId,childIds)); + } + Map childMap = pChildList.stream().collect(Collectors.toMap(BomNewPbomChildEntity::getRowId,Function.identity())); + + List fieldList = Lists.newArrayList("projectType","materialNo","drawingNo","num","unitWeight","remark"); + childList.forEach(u -> { + u.setParentRowId(paramDTO.getBomRowId()); + if(u.getRowId() == null){ + u.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue()); + }else{ + BomNewPbomChildEntity oChild = childMap.get(u.getRowId()); + //判断是否有变更记录 + String re = new CompareUtils().compare(oChild,u,fieldList,false); + //修改记录如果原先是 EBOM导入 状态,变更为E->P修改 + if(Objects.equals(PbomSourceStatusEnum.EBOM.getValue(),oChild.getSourceStatus()) && StrUtil.isNotBlank(re)){ + u.setSourceStatus(PbomSourceStatusEnum.E_P.getValue()); + } + } + }); pbomChildService.saveOrUpdateBatch(childList); parent.setBomExist(1); } else { diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBomFor31.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBomFor31.java index a491ebb6..e23163b3 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBomFor31.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBomFor31.java @@ -132,6 +132,7 @@ public class EBomToPBomFor31 extends EBomToPbomBase { childEnt.setFacCode(facCode); childEnt.setIdentityNo(StrUtil.join("-", parentEnt.getMaterialNo(), eb.getMaterialNo())); childEnt.setSource(PbomSourceEnum.FROM_EBOM.getValue()); + childEnt.setSourceStatus(PbomSourceStatusEnum.EBOM.getValue()); this.pBomChildResult.add(childEnt); } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPbomBase.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPbomBase.java index 0819b4b1..fd4517e1 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPbomBase.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPbomBase.java @@ -221,6 +221,7 @@ public abstract class EBomToPbomBase { pBomParent.setDeptRowId(SessionUtil.getDepartRowId()); pBomParent.setCreatedBy(SessionUtil.getUserCode()); pBomParent.setSource(PbomSourceEnum.FROM_EBOM.getValue()); + pBomParent.setSourceStatus(PbomSourceStatusEnum.EBOM.getValue()); if (Objects.nonNull(oldParent)) { oldParent.setExpireEndTime(LocalDateTime.now()); oldParent.setLastVersionIs(0); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomUpgrade.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomUpgrade.java index 44cd55dc..a2a96724 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomUpgrade.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomUpgrade.java @@ -6,10 +6,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.nflg.product.base.core.conmon.util.SessionUtil; -import com.nflg.product.bomnew.constant.PBomEditStatusEnum; -import com.nflg.product.bomnew.constant.PBomStatusEnum; -import com.nflg.product.bomnew.constant.PbomSourceEnum; -import com.nflg.product.bomnew.constant.UserJobEnum; +import com.nflg.product.bomnew.constant.*; import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; @@ -101,6 +98,7 @@ public class PBomUpgrade { pbomParent.setTechnologyUserCode(SessionUtil.getUserCode()); pbomParent.setRemark(""); pbomParent.setSource(PbomSourceEnum.FROM_CHANGE.getValue()); + pbomParent.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue()); pbomParent.setReleaseTime(null); pbomParent.setReleaseUserName(null); pbomParent.setSapState(1); @@ -137,6 +135,7 @@ public class PBomUpgrade { child.setCreatedBy(SessionUtil.getUserCode()); child.setModifyTime(null); child.setSource(PbomSourceEnum.FROM_CHANGE.getValue()); + child.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue()); child.setRemark(""); this.childResult.add(child); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareNode.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareNode.java new file mode 100644 index 00000000..54a27152 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareNode.java @@ -0,0 +1,63 @@ +package com.nflg.product.bomnew.util; + +/** + * packageName com.nflg.product.bomnew.util + * + * @author luohj + * @className CompareNode + * @date 2024/8/9 0009 + * @description TODO + */ +public class CompareNode { + /** + * 字段 + */ + private String fieldKey; + + /** + * 字段值 + */ + private Object fieldValue; + + /** + * 字段名称 + */ + private String fieldName; + + /** + * 字段类型 + */ + private String type; + + public String getFieldKey() { + return fieldKey; + } + + public void setFieldKey(String fieldKey) { + this.fieldKey = fieldKey; + } + + public Object getFieldValue() { + return fieldValue; + } + + public void setFieldValue(Object fieldValue) { + this.fieldValue = fieldValue; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} \ No newline at end of file diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareUtils.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareUtils.java new file mode 100644 index 00000000..cb7e45ef --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/CompareUtils.java @@ -0,0 +1,181 @@ +package com.nflg.product.bomnew.util; + +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; +import com.google.common.collect.Lists; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.*; + +/** + * packageName com.nflg.product.bomnew.util + * + * @author luohj + * @className CompareUtils + * @date 2024/8/9 0009 + * @description TODO + */ +public class CompareUtils { + + private static final String COMMA = ","; + + /** + * 属性比较 + * + * @param source 源数据对象 + * @param target 目标数据对象 + * @return 对应属性值的比较变化 + */ + public String compare(T source, T target) { + return compare(source, target, null,true); + } + + + /** + * 属性比较 + * + * @param source 源数据对象 + * @param target 目标数据对象 + * @param ignoreCompareFields 忽略比较的字段 + * @param isIgnore true是要忽略的字段 false仅对比的字段值 + * @return 对应属性值的比较变化 + */ + public String compare(T source, T target, List ignoreCompareFields,boolean isIgnore) { + if (Objects.isNull(source) && Objects.isNull(target)) { + return ""; + } + Map sourceMap = this.getFiledValueMap(source); + Map targetMap = this.getFiledValueMap(target); + if (sourceMap.isEmpty() && targetMap.isEmpty()) { + return ""; + } + // 如果源数据为空,则只显示目标数据,不显示属性变化情况 + if (sourceMap.isEmpty()) { + return doEmpty(targetMap, ignoreCompareFields,isIgnore); + } + // 如果源数据为空,则显示属性变化情况 + String s = doCompare(sourceMap, targetMap, ignoreCompareFields,isIgnore); + if (!s.endsWith(COMMA)) { + return s; + } + return s.substring(0, s.length() - 1); + } + + private String doEmpty(Map targetMap, List ignoreCompareFields,boolean isIgnore) { + StringBuilder sb = new StringBuilder(); + Collection values = targetMap.values(); + int size = values.size(); + int current = 0; + for (CompareNode node : values) { + current++; + Object o = Optional.ofNullable(node.getFieldValue()).orElse(""); + if (Objects.nonNull(ignoreCompareFields)) { + if(isIgnore){ + if(ignoreCompareFields.contains(node.getFieldKey())){ + continue; + } + }else{ + if(!ignoreCompareFields.contains(node.getFieldKey())){ + continue; + } + } + } + if (o.toString().length() > 0) { + sb.append("[" + node.getFieldName() + ":" + o + "]"); + if (current < size) { + sb.append(COMMA); + } + } + } + return sb.toString(); + } + + private String doCompare(Map sourceMap, Map targetMap, List ignoreCompareFields,boolean isIgnore) { + StringBuilder sb = new StringBuilder(); + Set keys = sourceMap.keySet(); + int size = keys.size(); + int current = 0; + BigDecimal zero = new BigDecimal(0); + for (String key : keys) { + current++; + CompareNode sn = sourceMap.get(key); + CompareNode tn = targetMap.get(key); + if (Objects.nonNull(ignoreCompareFields)) { + if(isIgnore){ + if(ignoreCompareFields.contains(sn.getFieldKey())){ + continue; + } + }else{ + if(!ignoreCompareFields.contains(sn.getFieldKey())){ + continue; + } + } + } + String sv = Optional.ofNullable(sn.getFieldValue()).orElse("").toString(); + String tv = Optional.ofNullable(tn.getFieldValue()).orElse("").toString(); + + if(Objects.equals("java.math.BigDecimal",sn.getType())){ + if(Convert.toBigDecimal(sv,zero).compareTo(Convert.toBigDecimal(tv,zero)) != 0){ + sb.append(String.format("[%s:%s -> %s]", sn.getFieldName(), sv, tv)); + if (current < size) { + sb.append(COMMA); + } + } + }else{ + // 只有两者属性值不一致时, 才显示变化情况 + if (!sv.equals(tv)) { + sb.append(String.format("[%s:%s -> %s]", sn.getFieldName(), sv, tv)); + if (current < size) { + sb.append(COMMA); + } + } + } + + + } + return sb.toString(); + } + + private Map getFiledValueMap(T t) { + if (Objects.isNull(t)) { + return Collections.emptyMap(); + } + Field[] fields = t.getClass().getDeclaredFields(); + if (Objects.isNull(fields) || fields.length == 0) { + return Collections.emptyMap(); + } + Map map = new LinkedHashMap(); + for (Field field : fields) { + field.setAccessible(true); + try { + String fieldKey = field.getName(); + CompareNode node = new CompareNode(); + node.setFieldKey(fieldKey); + node.setFieldValue(field.get(t)); + node.setFieldName(fieldKey); + node.setType(field.getType().getName()); + map.put(field.getName(), node); + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return map; + } + + public static void main(String[] args) { + BomNewPbomChildEntity p1 = new BomNewPbomChildEntity(); + p1.setRowId(1l); + p1.setSourceStatus(2); + + BomNewPbomChildEntity p2 = new BomNewPbomChildEntity(); + p2.setRowId(1l); + p2.setSourceStatus(2); + String re = new CompareUtils().compare(p1,p2,Lists.newArrayList("rowId","sourceStatus","identityNo"),false); + + System.out.println("re:"+re); + + } + +}