24282 2 år sedan
förälder
incheckning
1f0efd5dd1

+ 18 - 6
hx-service-api/syringe-management-api/src/main/java/com/fjhx/entity/bom/BomDetails.java

@@ -1,16 +1,14 @@
 package com.fjhx.entity.bom;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * bom明细
@@ -30,6 +28,21 @@ public class BomDetails extends BaseEntity {
     private Long bomId;
 
     /**
+     * 工艺路线id
+     */
+    private Long workingRouteId;
+
+    /**
+     * 工序id
+     */
+    private Long workingProcedureId;
+
+    /**
+     * 工艺路线工序关联id
+     */
+    private Long workingRouteProcedureId;
+
+    /**
      * 物料id
      */
     private Long materialId;
@@ -66,5 +79,4 @@ public class BomDetails extends BaseEntity {
     @TableLogic
     private Integer delFlag;
 
-
 }

+ 19 - 0
hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/bom/BomDetailsEx.java

@@ -0,0 +1,19 @@
+package com.fjhx.params.bom;
+
+import com.fjhx.entity.bom.BomDetails;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BomDetailsEx extends BomDetails {
+
+    private String materialName;
+    private String materialCode;
+    private String materialUnit;
+
+    private String replaceMaterialName;
+    private String replaceMaterialCode;
+    private String replaceMaterialUnit;
+
+}

+ 20 - 1
hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/bom/BomVo.java

@@ -2,10 +2,12 @@ package com.fjhx.params.bom;
 
 import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.bom.Bom;
-import com.fjhx.params.FileInfoParam;
+import com.fjhx.entity.bom.BomDetails;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * bom
  *
@@ -17,8 +19,25 @@ import lombok.EqualsAndHashCode;
 public class BomVo extends Bom {
 
     /**
+     * 新增类型
+     * 1、新增产品bom
+     * 2、新建版本
+     */
+    private Integer addType;
+
+    /**
+     * bom明细
+     */
+    private List<BomDetails> bomDetailsList;
+
+    /**
      * 文件信息
      */
     private FileInfo fileInfo;
 
+    /**
+     * 删除bomId
+     */
+    private List<Long> deleteBomIdList;
+
 }

+ 15 - 19
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

@@ -230,8 +230,8 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
                 .collect(Collectors.groupingBy(item -> item.get("materialCode")));
 
         // 实际领料信息按物料编码分组
-        Map<Object, List<Map<String, Object>>> actualByCodeMap = actualList.stream().distinct()
-                .collect(Collectors.groupingBy(item -> item.get("materialCode")));
+        Map<String, List<Map<String, Object>>> actualByCodeMap = actualList.stream().distinct()
+                .collect(Collectors.groupingBy(item -> item.get("materialCode").toString()));
 
         // 工号
         String jobNo = condition.get("jobNo").toString();
@@ -248,7 +248,6 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
         // 需要添加的出库物料信息
         List<SchedulingActual> schedulingActualList = new ArrayList<>();
 
-
 //      =====================================
 //         循环推荐领料信息,与实际领料信息做比对
 //      =====================================
@@ -260,11 +259,9 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
             key:rfid
             value:详细详细
              */
-            Map<String, Map<String, Object>> actualByRfidMap = actualByCodeMap.get(k).stream()
-                    .collect(Collectors.toMap(
-                            item -> item.get("materialRfid").toString(),
-                            item -> item
-                    ));
+            List<Map<String, Object>> maps = actualByCodeMap.get(k);
+            Map<String, Map<String, Object>> actualByRfidMap = maps.stream().collect(
+                    Collectors.toMap(item -> item.get("materialRfid").toString(), item -> item));
 
             /*
             推荐领料信息rfid去匹配实际领料rfid
@@ -280,18 +277,18 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
                 Map<String, Object> map = actualByRfidMap.get(rfidCode);
 
                 // 如果不为空,则为推荐领料出库
-                if (map != null) {
-
-                    Scheduling scheduling = createScheduling(itemV, flag);
-                    schedulingList.add(scheduling);
-                    v.remove(itemV);
-                    i--;
+                if (map == null) {
+                    continue;
+                }
 
-                    SchedulingActual schedulingActual = createSchedulingActual(1, map, flag, jobNo, date);
-                    schedulingActualList.add(schedulingActual);
-                    actualByRfidMap.remove(rfidCode);
+                Scheduling scheduling = createScheduling(itemV, flag);
+                schedulingList.add(scheduling);
+                v.remove(itemV);
+                i--;
 
-                }
+                SchedulingActual schedulingActual = createSchedulingActual(1, map, flag, jobNo, date);
+                schedulingActualList.add(schedulingActual);
+                actualByRfidMap.remove(rfidCode);
             }
 
             // 添加推荐未领取
@@ -319,7 +316,6 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
 
         schedulingService.updateBatchById(schedulingList);
         schedulingActualService.saveBatch(schedulingActualList);
-
     }
 
     /**

+ 28 - 29
hx-service/syringe-management/src/main/java/com/fjhx/controller/bom/BomDetailsController.java

@@ -1,9 +1,7 @@
 package com.fjhx.controller.bom;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.params.bom.BomDetailsEx;
 import com.fjhx.service.bom.BomDetailsService;
-import com.fjhx.entity.bom.BomDetails;
-import com.fjhx.params.bom.BomDetailsVo;
 import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -11,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,35 +27,35 @@ public class BomDetailsController {
     @Autowired
     private BomDetailsService bomDetailsService;
 
-    @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
-        Page<BomDetails> result = bomDetailsService.getPage(condition);
+    @PostMapping("/list")
+    public R list(@RequestBody Map<String, Long> condition) {
+        List<BomDetailsEx> result = bomDetailsService.getList(condition);
         return R.success(result);
     }
 
-    @PostMapping("/add")
-    public R add(@RequestBody BomDetailsVo bomDetailsVo){
-        bomDetailsService.add(bomDetailsVo);
-        return R.success();
-    }
-
-    @PostMapping("/edit")
-    public R edit(@RequestBody BomDetailsVo bomDetailsVo){
-        bomDetailsService.edit(bomDetailsVo);
-        return R.success();
-    }
-
-    @PostMapping("/delete")
-    public R delete(@RequestBody BomDetailsVo bomDetailsVo){
-        bomDetailsService.delete(bomDetailsVo);
-        return R.success();
-    }
-
-    @PostMapping("/detail")
-    public R detail(@RequestBody BomDetailsVo bomDetailsVo){
-        BomDetails result = bomDetailsService.detail(bomDetailsVo);
-        return R.success(result);
-    }
+    // @PostMapping("/add")
+    // public R add(@RequestBody BomDetailsVo bomDetailsVo) {
+    //     bomDetailsService.add(bomDetailsVo);
+    //     return R.success();
+    // }
+    //
+    // @PostMapping("/edit")
+    // public R edit(@RequestBody BomDetailsVo bomDetailsVo){
+    //     bomDetailsService.edit(bomDetailsVo);
+    //     return R.success();
+    // }
+    //
+    // @PostMapping("/delete")
+    // public R delete(@RequestBody BomDetailsVo bomDetailsVo){
+    //     bomDetailsService.delete(bomDetailsVo);
+    //     return R.success();
+    // }
+    //
+    // @PostMapping("/detail")
+    // public R detail(@RequestBody BomDetailsVo bomDetailsVo){
+    //     BomDetails result = bomDetailsService.detail(bomDetailsVo);
+    //     return R.success(result);
+    // }
 
 }
 

+ 4 - 3
hx-service/syringe-management/src/main/java/com/fjhx/service/bom/BomDetailsService.java

@@ -1,10 +1,11 @@
 package com.fjhx.service.bom;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.bom.BomDetails;
+import com.fjhx.params.bom.BomDetailsEx;
 import com.fjhx.params.bom.BomDetailsVo;
-import com.fjhx.base.BaseService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,7 +18,7 @@ import java.util.Map;
  */
 public interface BomDetailsService extends BaseService<BomDetails> {
 
-    Page<BomDetails> getPage(Map<String, String> condition);
+    List<BomDetailsEx> getList(Map<String, Long> condition);
 
     void add(BomDetailsVo bomDetailsVo);
 

+ 31 - 12
hx-service/syringe-management/src/main/java/com/fjhx/service/bom/impl/BomDetailsServiceImpl.java

@@ -1,16 +1,17 @@
 package com.fjhx.service.bom.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mapper.bom.BomDetailsMapper;
-import com.fjhx.utils.WrapperUtil;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.bom.BomDetails;
+import com.fjhx.mapper.bom.BomDetailsMapper;
+import com.fjhx.params.bom.BomDetailsEx;
 import com.fjhx.params.bom.BomDetailsVo;
 import com.fjhx.service.bom.BomDetailsService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.util.MaterialAttributeAssignUtil;
+import com.fjhx.utils.Assert;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,15 +26,33 @@ import java.util.Map;
 public class BomDetailsServiceImpl extends ServiceImpl<BomDetailsMapper, BomDetails> implements BomDetailsService {
 
     @Override
-    public Page<BomDetails> getPage(Map<String, String> condition) {
+    public List<BomDetailsEx> getList(Map<String, Long> condition) {
+
+        Long bomId = condition.get("bomId");
+        Assert.notEmpty(bomId, "bomId不能为空");
+        Long linkId = condition.get("linkId");
+        Assert.notEmpty(linkId, "linkId不能为空");
+
+        List<BomDetails> bomDetailsList = list(q -> q.eq(BomDetails::getBomId, bomId).eq(BomDetails::getWorkingRouteProcedureId, linkId));
 
-        QueryWrapper<BomDetails> wrapper = Wrappers.query();
+        List<BomDetailsEx> bomDetailsExList = BeanUtil.copyToList(bomDetailsList, BomDetailsEx.class);
 
-        WrapperUtil.init(condition, wrapper)
-                .createTimeDesc();
+        // 赋值物料属性
+        MaterialAttributeAssignUtil
+                .init(bomDetailsExList)
+                .assignFun(BomDetails::getMaterialId, (entity, material) -> {
+                    entity.setMaterialCode(material.getCode());
+                    entity.setMaterialName(material.getName());
+                    entity.setMaterialUnit(material.getUnit());
+                })
+                .assignFun(BomDetails::getReplaceMaterialId, (entity, material) -> {
+                    entity.setReplaceMaterialCode(material.getCode());
+                    entity.setReplaceMaterialName(material.getName());
+                    entity.setReplaceMaterialUnit(material.getUnit());
+                })
+                .execute();
 
-        Page<BomDetails> page = page(condition, wrapper);
-        return page;
+        return bomDetailsExList;
     }
 
     @Override

+ 44 - 27
hx-service/syringe-management/src/main/java/com/fjhx/service/bom/impl/BomServiceImpl.java

@@ -1,7 +1,6 @@
 package com.fjhx.service.bom.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-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.fjhx.base.BaseEntity;
@@ -79,26 +78,46 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(BomVo bomVo) {
+        Integer addType = bomVo.getAddType();
+        Assert.notEmpty(addType, "新增类型不能为空");
 
         Long productId = bomVo.getProductId();
         Assert.notEmpty(productId, "产品id不能为空");
-        Assert.notEmpty(bomVo.getEdition(), "版本号不能为空");
 
-        // 保证一个产品只有一个bom是启用状态
-        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.BOM_EDITION_LOCK + productId,
-                () -> {
-                    long editionCount = count(q -> q.eq(Bom::getProductId, productId).eq(Bom::getEdition, bomVo.getEdition()));
-                    Assert.eqZero(editionCount, "此版本已存在");
-
-                    Long count = count(Bom::getProductId, productId);
-                    bomVo.setCurrentEdition(count == 0 ? StatusConstant.YES : StatusConstant.NO);
+        String edition = bomVo.getEdition();
+        Assert.notEmpty(edition, "版本号不能为空");
 
-                    save(bomVo);
-                    return true;
-                });
+        // 保证一个产品只有一个bom是启用状态
+        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.BOM_EDITION_LOCK + productId, () -> {
+            List<Bom> list = list(Bom::getProductId, productId);
+
+            // 新增产品逻辑
+            if (addType == 1) {
+                Assert.eqZero(list.size(), "产品已添加");
+                bomVo.setCurrentEdition(StatusConstant.YES);
+            }
+            // 新建版本逻辑
+            else {
+                Assert.gtZero(list.size(), "未添加过产品");
+
+                long count = list.stream().filter(item -> edition.equals(item.getEdition())).count();
+                Assert.eqZero(count, "此版本已存在");
+                bomVo.setCurrentEdition(StatusConstant.NO);
+            }
+
+            save(bomVo);
+            return true;
+        });
 
         Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
 
+        // bom明细
+        List<BomDetails> bomDetailsList = bomVo.getBomDetailsList();
+        if (bomDetailsList.size() > 0) {
+            bomDetailsList.forEach(item -> item.setBomId(bomVo.getId()));
+            bomDetailsService.saveBatch(bomDetailsList);
+        }
+
         // 绑定文件
         FileClientUtil.bindingFile(bomVo.getId(), bomVo.getFileInfo());
     }
@@ -106,22 +125,20 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(BomVo bomVo) {
+        Long id = bomVo.getId();
+        Assert.notEmpty(id, "bomId不能为空");
 
-        Long productId = bomVo.getProductId();
-
-        Integer currentEdition = bomVo.getCurrentEdition();
-
-        Assert.notEmpty(currentEdition, "是否启用版本不能为空");
+        // 删除bom明细
+        List<Long> deleteBomIdList = bomVo.getDeleteBomIdList();
+        if (deleteBomIdList.size() > 0) {
+            bomDetailsService.removeByIds(deleteBomIdList);
+        }
 
-        if (StatusConstant.YES.equals(currentEdition)) {
-            // 保证一个产品只有一个bom是启用状态
-            Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.BOM_EDITION_LOCK + productId,
-                    () -> {
-                        update(Wrappers.<Bom>lambdaUpdate().set(Bom::getCurrentEdition, StatusConstant.NO).eq(Bom::getProductId, productId));
-                        updateById(bomVo);
-                        return true;
-                    });
-            Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+        // 新增或编辑bom明细
+        List<BomDetails> bomDetailsList = bomVo.getBomDetailsList();
+        if (bomDetailsList.size() > 0) {
+            bomDetailsList.forEach(item -> item.setBomId(bomVo.getId()));
+            bomDetailsService.saveOrUpdateBatch(bomDetailsList);
         }
 
         // 重新绑定

+ 104 - 0
hx-service/syringe-management/src/main/java/com/fjhx/util/MaterialAttributeAssignUtil.java

@@ -0,0 +1,104 @@
+package com.fjhx.util;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.fjhx.entity.Material;
+import com.fjhx.service.MaterialService;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+/**
+ * 用户属性赋值工具类
+ */
+@AllArgsConstructor
+public class MaterialAttributeAssignUtil<T> {
+
+    /**
+     * 物料service
+     */
+    private static final MaterialService materialService = SpringUtil.getBean(MaterialService.class);
+
+    /**
+     * 初始化
+     */
+    public static <T> MaterialAttributeAssignUtil<T> init(List<T> list) {
+        return new MaterialAttributeAssignUtil<>(list);
+    }
+
+    /**
+     * 原始数据
+     */
+    private final List<T> list;
+
+    /**
+     * 赋值物料信息方法集合
+     */
+    private final List<Fun> funList = new ArrayList<>();
+
+    /**
+     * 添加物料信息方法
+     *
+     * @param getMaterialIdFun 获取物料id方法
+     * @param setAttributeFun  赋值物料属性方法
+     * @return this
+     */
+    public MaterialAttributeAssignUtil<T> assignFun(Function<T, Long> getMaterialIdFun, BiConsumer<T, Material> setAttributeFun) {
+        Fun fun = new Fun(getMaterialIdFun, setAttributeFun);
+        funList.add(fun);
+        return this;
+    }
+
+    /**
+     * 执行赋值逻辑
+     */
+    public void execute() {
+        // 获取物料id集合
+        Set<Long> materialIdList = new HashSet<>();
+        for (T t : list) {
+            for (Fun fun : funList) {
+                Long userId = fun.getAssignMaterialIdFun().apply(t);
+                if (userId != null) {
+                    materialIdList.add(userId);
+                }
+            }
+        }
+        if (materialIdList.size() == 0) {
+            return;
+        }
+
+        // 查询物料id实体Map
+        Map<Long, Material> materialByIdMap = materialService.getKEntity(Material::getId, q -> q.in(Material::getId, materialIdList));
+        if (materialByIdMap.size() == 0) {
+            return;
+        }
+
+        // 赋值用户昵称
+        for (T t : list) {
+            for (Fun fun : funList) {
+                Long userId = fun.getAssignMaterialIdFun().apply(t);
+                if (userId == null) {
+                    continue;
+                }
+
+                Material material = materialByIdMap.get(userId);
+                if (material == null) {
+                    continue;
+                }
+
+                fun.getAssignUserStrFun().accept(t, material);
+            }
+        }
+
+    }
+
+    @Getter
+    @AllArgsConstructor
+    private class Fun {
+        private Function<T, Long> assignMaterialIdFun;
+        private BiConsumer<T, Material> assignUserStrFun;
+    }
+
+}