From d8eecd5e537ba8ab7861c0babc29714630fdd396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Mon, 3 Mar 2025 19:43:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=88=90=E6=9C=AC=E5=88=86=E6=9E=90):=20?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E7=B1=BB=E5=9E=8BF=E5=92=8CE50=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/user/authority/AuthorityPowerApi.java | 5 - .../material/pojo/vo/ModelStructureVO.java | 1 - .../config/RedisTemplateConfig.java | 18 +++ .../mapper/master/MaterialMainAttrMapper.java | 7 + .../pojo/entity/MaterialMainAttrEntity.java | 77 +++++++++++ .../service/BomCostCalculateService.java | 124 ++++++++++-------- .../service/MaterialMainAttrService.java | 60 +++++++++ .../mapper/master/MaterialMainAttrMapper.xml | 4 + 8 files changed, 237 insertions(+), 59 deletions(-) create mode 100644 nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/mapper/master/MaterialMainAttrMapper.java create mode 100644 nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/MaterialMainAttrEntity.java create mode 100644 nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/MaterialMainAttrService.java create mode 100644 nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainAttrMapper.xml diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/authority/AuthorityPowerApi.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/authority/AuthorityPowerApi.java index f49a1fe9..8d2c6fb4 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/authority/AuthorityPowerApi.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/authority/AuthorityPowerApi.java @@ -1,22 +1,17 @@ package com.nflg.product.material.api.user.authority; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.mysql.cj.log.Log; import com.nflg.product.base.core.api.BaseApi; import com.nflg.product.material.mapper.master.AuthorityRolePowerMapper; import com.nflg.product.material.pojo.dto.AuthorityPowerDTO; import com.nflg.product.material.pojo.dto.SaveMemuPermissionDTO; -import com.nflg.product.material.pojo.entity.AuthorityPowerEntity; import com.nflg.product.material.pojo.query.AuthorityPowerQuery; import com.nflg.product.material.pojo.vo.AuthorityMenuVO; import com.nflg.product.material.pojo.vo.AuthorityPowerVO; import com.nflg.product.material.service.AuthorityPowerService; -import com.nflg.product.material.service.AuthorityRolePowerService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import nflg.product.common.constant.STATE; import nflg.product.common.vo.ResultVO; -import org.omg.PortableInterceptor.LOCATION_FORWARD; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/ModelStructureVO.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/ModelStructureVO.java index 97eb1420..66575783 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/ModelStructureVO.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/ModelStructureVO.java @@ -1,7 +1,6 @@ package com.nflg.product.material.pojo.vo; import lombok.Data; -import org.omg.CORBA.PRIVATE_MEMBER; /** * @decription diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/config/RedisTemplateConfig.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/config/RedisTemplateConfig.java index 1b9c527f..9b155bf2 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/config/RedisTemplateConfig.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/config/RedisTemplateConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @@ -40,4 +41,21 @@ public class RedisTemplateConfig { return template; } + @Bean + public RedisTemplate redisObjectTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + // 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值 + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + + template.afterPropertiesSet(); + return template; + } + } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/mapper/master/MaterialMainAttrMapper.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/mapper/master/MaterialMainAttrMapper.java new file mode 100644 index 00000000..0f247cd1 --- /dev/null +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/mapper/master/MaterialMainAttrMapper.java @@ -0,0 +1,7 @@ +package com.nflg.product.technology.mapper.master; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.product.technology.pojo.entity.MaterialMainAttrEntity; + +public interface MaterialMainAttrMapper extends BaseMapper { +} diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/MaterialMainAttrEntity.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/MaterialMainAttrEntity.java new file mode 100644 index 00000000..665fadef --- /dev/null +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/MaterialMainAttrEntity.java @@ -0,0 +1,77 @@ +package com.nflg.product.technology.pojo.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Accessors(chain = true) +@ApiModel(value = "com-nflg-product-technology-pojo-main-entity-MaterialMainAttrEntity") +@TableName(value = "t_material_main_attr") +public class MaterialMainAttrEntity implements Serializable { + + /** + * 行ID 雪花 + */ + @TableId(value = "row_id", type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "行ID 雪花") + private Long rowId; + + /** + * 物料编码 + */ + @TableField(value = "material_no") + @ApiModelProperty(value = "物料编码") + private String materialNo; + + @TableField(value = "factory") + @ApiModelProperty(value = "工厂") + private String factory; + + @TableField(value = "purchase_type") + @ApiModelProperty(value = "采购类型") + private String purchaseType; + + @TableField(value = "special_purchase_type") + @ApiModelProperty(value = "特殊采购类") + private String specialPurchaseType; + + @TableField(value = "plan_delivery_time") + @ApiModelProperty(value = "计划交货时间(天数)") + private Integer planDeliveryTime; + + /** + * 创建人 + */ + @TableField(value = "created_by", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @TableField(value = "created_time", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间") + private LocalDateTime createdTime; + + /** + * 更新人 + */ + @TableField(value = "updated_by", fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新人") + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间") + private LocalDateTime updatedTime; + + private static final long serialVersionUID = 1L; +} diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java index f16ac365..c6f80454 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java @@ -56,6 +56,9 @@ public class BomCostCalculateService { @Resource private ProcessRouteTaskProcessesService processRouteTaskProcessesService; + @Resource + private MaterialMainAttrService materialMainAttrService; + /** * 缓存时长 */ @@ -80,17 +83,18 @@ public class BomCostCalculateService { config.setManday(manday); config.setVirtualWorkings(virtualWorkingService.listDTO()); List result = Collections.synchronizedList(new ArrayList<>(50)); - calculateBom(pDto, datas, config, result); + calculateBom(true, pDto, datas, config, result); return result; } - private EBomCostCacheDTO calculateBom(EBomDTO dto, List datas, BomCostCalculateConfig config, List result) { + private EBomCostCacheDTO calculateBom(boolean isRoot, EBomDTO dto, List datas, BomCostCalculateConfig config, List result) { String cdata = redisTemplate.opsForValue().get(buildKey(dto)); - List children = datas.stream() - .filter(d -> StrUtil.equals(d.getParentMaterialNo(), dto.getMaterialNo())) - .collect(Collectors.toList()); - if (StrUtil.isBlank(cdata)) { - final List workingHours = processRouteTaskProcessesService.getWorkingHour(dto.getMaterialNo()); + boolean purchaseTypeIsF = materialMainAttrService.purchaseTypeIsF(dto.getMaterialNo()); + boolean purchaseTypeIsE50 = materialMainAttrService.purchaseTypeIsE50(dto.getMaterialNo()); + if ((isRoot && purchaseTypeIsE50) || StrUtil.isBlank(cdata)) { + List workingHours = isRoot + ? processRouteTaskProcessesService.getWorkingHour(dto.getParentMaterialNo()) + : (purchaseTypeIsE50 ? new ArrayList<>() : processRouteTaskProcessesService.getWorkingHour(dto.getMaterialNo())); log.debug(StrUtil.format("BOM成本计算 {} 物料工时: {}", dto.getMaterialNo(), JsonUtil.toJson(workingHours))); EBomCostCacheDTO cdto = new EBomCostCacheDTO(); cdto.setMaterialNo(dto.getMaterialNo()); @@ -105,54 +109,63 @@ public class BomCostCalculateService { cdto.setAuxiliaryDepartmentExpenses(calculateAuxiliaryDepartmentExpenses(dto, config, workingHours)); cdto.setPaintCost(calculatePaintCost(dto)); cdto.setProductionCosts(calculateProductionCosts(dto, config, workingHours)); - if (CollectionUtil.isEmpty(children)) { + if (purchaseTypeIsF) { cdto.setHasChildren(false); - // 计算自身 - cdto.setPurchasedParts(!BomConstant.STEELS_CATEGORY_CODE.contains(dto.getMaterialCategoryCode())); - if (cdto.isPurchasedParts()) { - // 外购件只计算采购成本 - cdto.setPurchasedPartsCost(calculatePurchasedPartsCost(dto)); - } else { - // 非外购件计算材料成本和制作成本 - // 计算材料成本 - cdto.setSteelsCost(calculateSteelsCost(dto)); - // 计算损耗成本 - cdto.setWasteCost(calculateWasteCost(dto)); - } + cdto.setPurchasedParts(true); + cdto.setPurchasedPartsCost(calculatePurchasedPartsCost(dto)); } else { - cdto.setHasChildren(true); - cdto.setPurchasedParts(false); - //计算子级成本 - List childrenCost = children.parallelStream() - .map(c -> calculateBom(c, datas, config, result)) + List children = datas.stream() + .filter(d -> StrUtil.equals(d.getParentMaterialNo(), dto.getMaterialNo())) .collect(Collectors.toList()); - for (EBomCostCacheDTO c : childrenCost) { - EBomDTO dto1 = children.stream().filter(cc -> StrUtil.equals(cc.getMaterialNo(), c.getMaterialNo())).findFirst().orElse(null); - cdto.setSteelsCost(cdto.getSteelsCost().add(c.getSteelsCost().multiply(dto1.getNum()))); - cdto.setSteelsCost(cdto.getSteelsCost().add(c.getWasteCost().multiply(dto1.getNum()))); - cdto.setPurchasedPartsCost(cdto.getPurchasedPartsCost().add(c.getPurchasedPartsCost().multiply(dto1.getNum()))); - cdto.setPieceRateSalary(cdto.getPieceRateSalary().add(c.getPieceRateSalary().multiply(dto1.getNum()))); - cdto.setWelfareExpenses(cdto.getWelfareExpenses().add(c.getWelfareExpenses().multiply(dto1.getNum()))); - cdto.setHydropowerCost(cdto.getHydropowerCost().add(c.getHydropowerCost().multiply(dto1.getNum()))); - cdto.setDepreciationCost(cdto.getDepreciationCost().add(c.getDepreciationCost().multiply(dto1.getNum()))); - cdto.setWorkshopManagementLaborCost(cdto.getWorkshopManagementLaborCost().add(c.getWorkshopManagementLaborCost().multiply(dto1.getNum()))); - cdto.setWorkshopOfficeExpenses(cdto.getWorkshopOfficeExpenses().add(c.getWorkshopOfficeExpenses().multiply(dto1.getNum()))); - cdto.setAuxiliaryDepartmentLaborCost(cdto.getAuxiliaryDepartmentLaborCost().add(c.getAuxiliaryDepartmentLaborCost().multiply(dto1.getNum()))); - cdto.setAuxiliaryDepartmentExpenses(cdto.getAuxiliaryDepartmentExpenses().add(c.getAuxiliaryDepartmentExpenses().multiply(dto1.getNum()))); - cdto.setPaintCost(cdto.getPaintCost().add(c.getPaintCost().multiply(dto1.getNum()))); - if (CollectionUtil.isNotEmpty(c.getProductionCosts())) { - c.getProductionCosts().forEach(pc -> { - ProductionCostDTO pdto = cdto.getProductionCosts().parallelStream() - .filter(p -> StrUtil.equals(p.getName(), pc.getName())) - .findFirst() - .orElse(null); - if (Objects.isNull(pdto)) { - pdto = new ProductionCostDTO(); - pdto.setName(pc.getName()); - cdto.getProductionCosts().add(pdto); - } - pdto.setCost(pdto.getCost().add(pc.getCost().multiply(dto1.getNum()))); - }); + if (CollectionUtil.isEmpty(children)) { + cdto.setHasChildren(false); + // 计算自身 + cdto.setPurchasedParts(!BomConstant.STEELS_CATEGORY_CODE.contains(dto.getMaterialCategoryCode())); + if (cdto.isPurchasedParts()) { + // 外购件只计算采购成本 + cdto.setPurchasedPartsCost(calculatePurchasedPartsCost(dto)); + } else { + // 非外购件计算材料成本和制作成本 + // 计算材料成本 + cdto.setSteelsCost(calculateSteelsCost(dto)); + // 计算损耗成本 + cdto.setWasteCost(calculateWasteCost(dto)); + } + } else { + cdto.setHasChildren(true); + cdto.setPurchasedParts(false); + //计算子级成本 + List childrenCost = children.parallelStream() + .map(c -> calculateBom(false, c, datas, config, result)) + .collect(Collectors.toList()); + for (EBomCostCacheDTO c : childrenCost) { + EBomDTO dto1 = children.stream().filter(cc -> StrUtil.equals(cc.getMaterialNo(), c.getMaterialNo())).findFirst().orElse(null); + cdto.setSteelsCost(cdto.getSteelsCost().add(c.getSteelsCost().multiply(dto1.getNum()))); + cdto.setSteelsCost(cdto.getSteelsCost().add(c.getWasteCost().multiply(dto1.getNum()))); + cdto.setPurchasedPartsCost(cdto.getPurchasedPartsCost().add(c.getPurchasedPartsCost().multiply(dto1.getNum()))); + cdto.setPieceRateSalary(cdto.getPieceRateSalary().add(c.getPieceRateSalary().multiply(dto1.getNum()))); + cdto.setWelfareExpenses(cdto.getWelfareExpenses().add(c.getWelfareExpenses().multiply(dto1.getNum()))); + cdto.setHydropowerCost(cdto.getHydropowerCost().add(c.getHydropowerCost().multiply(dto1.getNum()))); + cdto.setDepreciationCost(cdto.getDepreciationCost().add(c.getDepreciationCost().multiply(dto1.getNum()))); + cdto.setWorkshopManagementLaborCost(cdto.getWorkshopManagementLaborCost().add(c.getWorkshopManagementLaborCost().multiply(dto1.getNum()))); + cdto.setWorkshopOfficeExpenses(cdto.getWorkshopOfficeExpenses().add(c.getWorkshopOfficeExpenses().multiply(dto1.getNum()))); + cdto.setAuxiliaryDepartmentLaborCost(cdto.getAuxiliaryDepartmentLaborCost().add(c.getAuxiliaryDepartmentLaborCost().multiply(dto1.getNum()))); + cdto.setAuxiliaryDepartmentExpenses(cdto.getAuxiliaryDepartmentExpenses().add(c.getAuxiliaryDepartmentExpenses().multiply(dto1.getNum()))); + cdto.setPaintCost(cdto.getPaintCost().add(c.getPaintCost().multiply(dto1.getNum()))); + if (CollectionUtil.isNotEmpty(c.getProductionCosts())) { + c.getProductionCosts().forEach(pc -> { + ProductionCostDTO pdto = cdto.getProductionCosts().parallelStream() + .filter(p -> StrUtil.equals(p.getName(), pc.getName())) + .findFirst() + .orElse(null); + if (Objects.isNull(pdto)) { + pdto = new ProductionCostDTO(); + pdto.setName(pc.getName()); + cdto.getProductionCosts().add(pdto); + } + pdto.setCost(pdto.getCost().add(pc.getCost().multiply(dto1.getNum()))); + }); + } } } } @@ -167,7 +180,12 @@ public class BomCostCalculateService { //log.debug(cdata); EBomCostCacheDTO cdto = JsonUtil.fromJson(cdata, EBomCostCacheDTO.class); result.add(cdto); - children.parallelStream().forEach(c -> calculateBom(c, datas, config, result)); + if (!purchaseTypeIsF) { + List children = datas.stream() + .filter(d -> StrUtil.equals(d.getParentMaterialNo(), dto.getMaterialNo())) + .collect(Collectors.toList()); + children.parallelStream().forEach(c -> calculateBom(false, c, datas, config, result)); + } return cdto; } } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/MaterialMainAttrService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/MaterialMainAttrService.java new file mode 100644 index 00000000..f21f5437 --- /dev/null +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/MaterialMainAttrService.java @@ -0,0 +1,60 @@ +package com.nflg.product.technology.service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.product.technology.mapper.master.MaterialMainAttrMapper; +import com.nflg.product.technology.pojo.entity.MaterialMainAttrEntity; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Service +public class MaterialMainAttrService extends ServiceImpl { + + @Resource + private RedisTemplate redisTemplate; + + public boolean purchaseTypeIsF(String materialNo) { + String key = "technology:materialNo:purchaseTypeIsF"; + HashOperations hashOps = redisTemplate.opsForHash(); + Object data = hashOps.get(key, materialNo); + if (Objects.isNull(data)) { + data = lambdaQuery() + .eq(MaterialMainAttrEntity::getMaterialNo, materialNo) + .eq(MaterialMainAttrEntity::getPurchaseType, "F") + .eq(MaterialMainAttrEntity::getFactory, "1010") + .exists(); + if (hashOps.size(key) == 0) { + hashOps.put(key, materialNo, data); + redisTemplate.expire(key, 8, TimeUnit.HOURS); + } else { + hashOps.put(key, materialNo, data); + } + } + return (boolean) data; + } + + public boolean purchaseTypeIsE50(String materialNo) { + String key = "technology:materialNo:purchaseTypeIsE50"; + HashOperations hashOps = redisTemplate.opsForHash(); + Object data = hashOps.get(key, materialNo); + if (Objects.isNull(data)) { + data = lambdaQuery() + .eq(MaterialMainAttrEntity::getMaterialNo, materialNo) + .eq(MaterialMainAttrEntity::getFactory, "1010") + .eq(MaterialMainAttrEntity::getPurchaseType, "E") + .eq(MaterialMainAttrEntity::getSpecialPurchaseType, "50") + .exists(); + if (hashOps.size(key) == 0) { + hashOps.put(key, materialNo, data); + redisTemplate.expire(key, 8, TimeUnit.HOURS); + } else { + hashOps.put(key, materialNo, data); + } + } + return (boolean) data; + } +} diff --git a/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainAttrMapper.xml b/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainAttrMapper.xml new file mode 100644 index 00000000..a3077cda --- /dev/null +++ b/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainAttrMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file