ezhizao_zx 11 月之前
父節點
當前提交
7dd490cf9b

+ 423 - 69
src/main/java/cn/ezhizao/project/business/controller/Inc10100Controller.java

@@ -20,8 +20,10 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * mrp10201Controller
@@ -261,6 +263,9 @@ public class Inc10100Controller extends BaseController {
         }
 
         List<Sfc10401> sfc10401List = sfc10401Service.getList(sfc10401QueryWrapper);
+        QueryWrapper<Sfc10401> sfc10401AllQueryWrapper = new QueryWrapper<>();
+        sfc10401AllQueryWrapper.in("concat(rtrim(cpart), rtrim(prver))", sfc10401List.isEmpty() ? Collections.singletonList("0") : sfc10401List.stream().map(v -> v.getCpart().trim() + v.getPrver().trim()).collect(Collectors.toList()));
+        List<Sfc10401> all10401List = sfc10401Service.getList(sfc10401AllQueryWrapper);
         List<BizProcess> bases = processService.list();
         List<BizTechnologicalProcessDetail> processDetails = technologicalProcessDetailService.query().list();
         List<BizTechnologicalProcess> processes = technologicalProcessService.list();
@@ -271,82 +276,133 @@ public class Inc10100Controller extends BaseController {
         List<BizTechnologicalProcessDetail> updateProcessDetail = new ArrayList<>();
         sfc10401List.forEach(l -> {
             // 判断是否有对应的technologicalProcessDetail
-            BizTechnologicalProcessDetail old = processDetails.stream().filter(v -> v.getTechnologyVersion().equals(l.getPrver().trim()) && v.getProductCode().equals(l.getCpart().trim()) && v.getProcessStepNumber().equals(l.getPrseq().trim()) && v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
-            if (old != null) {
-                old.setProcessKey(l.getFinkey());
-                old.setProcessAlias(l.getPrna());
-                old.setProductShaftCategory(l.getZtype());
-                old.setProductShaftCategoryName(l.getZtydm());
-                old.setProductDescription(l.getDescr());
-                old.setTenantId(Long.parseLong(l.getFacno()));
-                updateProcessDetail.add(old);
-            } else {
-                BizTechnologicalProcessDetail newProcess = new BizTechnologicalProcessDetail();
-                newProcess.setTechnologyVersion(l.getPrver().trim());
-                newProcess.setProductCode(l.getCpart().trim());
-                newProcess.setProcessCode(l.getPrcode().trim());
-                newProcess.setProcessStepNumber(l.getPrseq());
-                newProcess.setProcessKey(l.getFinkey());
-                newProcess.setProcessAlias(l.getPrna());
-                newProcess.setProductShaftCategory(l.getZtype());
-                newProcess.setProductShaftCategoryName(l.getZtydm());
-                newProcess.setProductDescription(l.getDescr());
-                newProcess.setTenantId(Long.parseLong(l.getFacno()));
-                if (newProcess.getProductCode() != null && !newProcess.getProductCode().isEmpty()) {
-                    BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().equals(l.getCpart().trim())).findFirst().orElse(null);
-                    if (bizProduct != null) {
-                        newProcess.setProductId(bizProduct.getId());
-                    }
-                    bizProduct = newProducts.stream().filter(v -> v.getProductCode().equals(l.getCpart().trim())).findFirst().orElse(null);
-                    if (bizProduct != null && newProcess.getProductId() == null) {
-                        newProcess.setProductId(bizProduct.getId());
-                    }
-                }
-                if (newProcess.getProcessCode() != null && !newProcess.getProcessCode().isEmpty()) {
-                    BizProcess bizProcess = bases.stream().filter(v -> v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
-                    newProcess.setProcessId(bizProcess == null ? null : bizProcess.getId());
-                }
-                // 判断下是否有对用工艺
+            // 判断是工序序号的变化还是新增还是其他。
+            // 获取对应
+            Sfc10400 sfc10400 = sfc10400List.stream().filter(v -> v.getPrver().trim().equals(l.getPrver().trim()) && v.getCpart().trim().equals(l.getCpart().trim())).findFirst().orElse(new Sfc10400());
+            BizTechnologicalProcess oldTech = processes.stream().filter(v -> v.getTechnologyVersion().trim().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim()) && v.getIsHistory().equals(0)).findFirst().orElse(null);
 
-                Sfc10400 sfc10400 = sfc10400List.stream().filter(v -> v.getPrver().trim().equals(l.getPrver().trim()) && v.getCpart().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
-                BizTechnologicalProcess oldTech = processes.stream().filter(v -> v.getTechnologyVersion().trim().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
-                if (oldTech != null) {
-                    if (sfc10400 != null) {
-                        oldTech.setProductShaftCategory(sfc10400.getZtype());
-                        oldTech.setProductShaftCategoryName(sfc10400.getZtydm());
-                        oldTech.setProductSpecification(sfc10400.getSpec());
-                        oldTech.setProductDrawingNumber(sfc10400.getDraw());
-                        oldTech.setProductDescription(sfc10400.getDescr());
-                        updateProcess.add(oldTech);
-                        newProcess.setTechnologicalProcessId(oldTech.getId());
+            BizTechnologicalProcessDetail old = processDetails.stream().filter(v -> v.getTechnologyVersion().equals(l.getPrver().trim()) && v.getProductCode().equals(l.getCpart().trim()) && v.getProcessCode().equals(l.getPrcode().trim()) && v.getTechnologicalProcessId().equals(oldTech.getId())).findFirst().orElse(null);
+            // 假设旧工序存在则判断是否序号相同 假设不同添加新的工艺信息
+            if (oldTech == null) {
+                // 假设旧的工艺版本不存在新增一个新的工艺版本。然后新增一个工艺
+                if (saveProcess.stream().anyMatch(v -> v.getTechnologyVersion().trim().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim()))) {
+                    // 判断工艺版本是否已新增过假设已新增过只新增新工艺。
+                    BizTechnologicalProcess newTech = saveProcess.stream().filter(v -> v.getTechnologyVersion().trim().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim())).findFirst().orElse(new BizTechnologicalProcess());
+                    BizTechnologicalProcessDetail newProcess = new BizTechnologicalProcessDetail();
+                    newProcess.setTechnologyVersion(l.getPrver().trim());
+                    newProcess.setProductCode(l.getCpart().trim());
+                    newProcess.setProcessCode(l.getPrcode().trim());
+                    newProcess.setProcessStepNumber(l.getPrseq());
+                    newProcess.setProcessKey(l.getFinkey());
+                    newProcess.setProcessAlias(l.getPrna());
+                    newProcess.setProductShaftCategory(l.getZtype());
+                    newProcess.setProductShaftCategoryName(l.getZtydm());
+                    newProcess.setProductDescription(l.getDescr());
+                    newProcess.setTenantId(Long.parseLong(l.getFacno()));
+                    newProcess.setTechnologicalProcessId(newTech.getId());
+                    if (newProcess.getProcessCode() != null && !newProcess.getProcessCode().isEmpty()) {
+                        BizProcess bizProcess = bases.stream().filter(v -> v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
+                        newProcess.setProcessId(bizProcess == null ? null : bizProcess.getId());
                     }
+                    if (newTech.getProductCode() != null && !newTech.getProductCode().isEmpty()) {
+                        BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                        if (bizProduct != null) {
+                            newProcess.setProductId(bizProduct.getId());
+                        }
+                        bizProduct = newProducts.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                        if (bizProduct != null && newProcess.getProductId() == null) {
+                            newProcess.setProductId(bizProduct.getId());
+                        }
+                    }
+                    saveProcessDetail.add(newProcess);
                 } else {
-                    if (sfc10400 != null) {
-                        BizTechnologicalProcess newTech = new BizTechnologicalProcess();
-                        newTech.setProductCode(sfc10400.getCpart());
-                        newTech.setTechnologyVersion(l.getPrver());
-                        newTech.setTenantId(1L);
-                        if (newTech.getProductCode() != null && !newTech.getProductCode().isEmpty()) {
-                            BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().equals(sfc10400.getCpart())).findFirst().orElse(null);
-                            if (bizProduct != null) {
-                                newProcess.setProductId(bizProduct.getId());
-                            }
-                            bizProduct = newProducts.stream().filter(v -> v.getProductCode().equals(sfc10400.getCpart())).findFirst().orElse(null);
-                            if (bizProduct != null && newProcess.getProductId() == null) {
-                                newProcess.setProductId(bizProduct.getId());
-                            }
+                    // 判断工艺版本未新增过则既新增工艺又新增工序
+                    BizTechnologicalProcess newTech = new BizTechnologicalProcess();
+                    newTech.setProductCode(sfc10400.getCpart().trim());
+                    newTech.setTechnologyVersion(l.getPrver());
+                    newTech.setTenantId(1L);
+                    BizTechnologicalProcessDetail newProcess = new BizTechnologicalProcessDetail();
+
+                    newProcess.setTechnologyVersion(l.getPrver().trim());
+                    newProcess.setProductCode(l.getCpart().trim());
+                    newProcess.setProcessCode(l.getPrcode().trim());
+                    newProcess.setProcessStepNumber(l.getPrseq());
+                    newProcess.setProcessKey(l.getFinkey());
+                    newProcess.setProcessAlias(l.getPrna());
+                    newProcess.setProductShaftCategory(l.getZtype());
+                    newProcess.setProductShaftCategoryName(l.getZtydm());
+                    newProcess.setProductDescription(l.getDescr());
+                    newProcess.setTenantId(Long.parseLong(l.getFacno()));
+                    if (newTech.getProductCode() != null && !newTech.getProductCode().isEmpty()) {
+                        BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                        if (bizProduct != null) {
+                            newProcess.setProductId(bizProduct.getId());
+                            newTech.setProductId(bizProduct.getId());
                         }
-                        newTech.setProductShaftCategory(sfc10400.getZtype());
-                        newTech.setProductShaftCategoryName(sfc10400.getZtydm());
-                        newTech.setProductSpecification(sfc10400.getSpec());
-                        newTech.setProductDrawingNumber(sfc10400.getDraw());
-                        newTech.setProductDescription(sfc10400.getDescr());
+                        bizProduct = newProducts.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                        if (bizProduct != null && newProcess.getProductId() == null) {
+                            newProcess.setProductId(bizProduct.getId());
+                            newTech.setProductId(bizProduct.getId());
+                        };
+                    }
+                    if (newProcess.getProcessCode() != null && !newProcess.getProcessCode().isEmpty()) {
+                        BizProcess bizProcess = bases.stream().filter(v -> v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
+                        newProcess.setProcessId(bizProcess == null ? null : bizProcess.getId());
+                    }
+                    newTech.setProductShaftCategory(sfc10400.getZtype());
+                    newTech.setProductShaftCategoryName(sfc10400.getZtydm());
+                    newTech.setProductSpecification(sfc10400.getSpec());
+                    newTech.setProductDrawingNumber(sfc10400.getDraw());
+                    newTech.setProductDescription(sfc10400.getDescr());
+                    newTech.setId(snowflakeIdWorker.nextId());
+                    saveProcess.add(newTech);
+                    newProcess.setTechnologicalProcessId(newTech.getId());
+
+                    saveProcessDetail.add(newProcess);
+                }
+            } else {
+                if (old == null || !old.getProcessStepNumber().trim().equals(l.getPrseq().trim())) {
+                    // 假设旧工艺不存在,或新的工艺序号和旧的不同则将旧工艺版本isHistory置为1
+                    oldTech.setIsHistory(1);
+                    updateProcess.add(oldTech);
+                    BizTechnologicalProcess newTech;
+                    // 判断是否已加过对应工艺
+                    if(!saveProcess.stream().anyMatch(v -> v.getProductCode().trim().equals(l.getCpart().trim()) && v.getTechnologyVersion().trim().equals(l.getPrver()))) {
+                        newTech = new BizTechnologicalProcess(oldTech);
+                        newTech.setIsHistory(0);
                         newTech.setId(snowflakeIdWorker.nextId());
                         saveProcess.add(newTech);
-                        newProcess.setTechnologicalProcessId(newTech.getId());
+                        // 添加所有工艺明细
+                        List<Sfc10401> itemProcesses = all10401List.stream().filter(v -> v.getCpart().trim().equals(l.getCpart().trim()) && v.getPrver().trim().equals(l.getPrver().trim())).collect(Collectors.toList());
+                        itemProcesses.forEach(e -> {
+                            BizTechnologicalProcessDetail newItem = new BizTechnologicalProcessDetail(e);
+                            newItem.setTechnologicalProcessId(newTech.getId());
+                            if (newTech.getProductCode() != null && !newTech.getProductCode().isEmpty()) {
+                                BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                                if (bizProduct != null) {
+                                    newItem.setProductId(bizProduct.getId());
+                                }
+                                bizProduct = newProducts.stream().filter(v -> v.getProductCode().trim().equals(sfc10400.getCpart().trim())).findFirst().orElse(null);
+                                if (bizProduct != null && newItem.getProductId() == null) {
+                                    newItem.setProductId(bizProduct.getId());
+                                }
+                            }
+                            if (newItem.getProcessCode() != null && !newItem.getProcessCode().isEmpty()) {
+                                BizProcess bizProcess = bases.stream().filter(v -> v.getProcessCode().equals(e.getPrcode().trim())).findFirst().orElse(null);
+                                newItem.setProcessId(bizProcess == null ? null : bizProcess.getId());
+                            }
+                            saveProcessDetail.add(newItem);
+                        });
                     }
+                } else {
+                    // 假设工艺存在则更新工艺信息
+                    old.setProcessKey(l.getFinkey());
+                    old.setProcessAlias(l.getPrna());
+                    old.setProductShaftCategory(l.getZtype());
+                    old.setProductShaftCategoryName(l.getZtydm());
+                    old.setProductDescription(l.getDescr());
+                    updateProcessDetail.add(old);
                 }
-                saveProcessDetail.add(newProcess);
             }
         });
         if ((saveProcess.isEmpty() || technologicalProcessService.saveBatch(saveProcess)) && (updateProcess.isEmpty() || technologicalProcessService.updateBatchById(updateProcess)) && (saveProcessDetail.isEmpty() || technologicalProcessDetailService.saveBatch(saveProcessDetail)) && (updateProcessDetail.isEmpty() || technologicalProcessDetailService.updateBatchById(updateProcessDetail))) {
@@ -360,7 +416,6 @@ public class Inc10100Controller extends BaseController {
         } else {
             result = false;
         }
-
         return toAjax(result);
     }
 
@@ -465,4 +520,303 @@ public class Inc10100Controller extends BaseController {
     public BizShaftCategory getShaftCode(String code) {
         return bizShaftCategoryService.query().eq("sub_category_code", code).one();
     }
+
+    /**
+     * 获取inc10100详细信息
+     * 获取 inc10100 信息传到 biz_product
+     * 20270716 之前 旧版本
+     */
+    @PreAuthorize("@ss.hasPermi('business:product:sync')")
+    @GetMapping(value = "/getP2ProductV0")
+    public AjaxResult getP2ProductV0() {
+        boolean result;
+//        result = true;
+        result = getP2Process();
+        // 先从新系统中的 biz_pull_p2_time 中获取最新数据
+        BizPullP2Time pullDetail = new BizPullP2Time();
+        pullDetail.setType("product");
+        List<BizPullP2Time> pullDetails = pullP2TimeService.getList(pullDetail);
+        /*
+         * 如果 pullDetails 不为空,则获取最后一条数据,做为查询P2的生产计划明细的条件。
+         * 这里有个细节,每次从P2中获取生产计划明细,不能都从头开始,否则随着数据量增加,将会重复拉取大量的数据,性能很差
+         * 拉取数据后,存入新系统中,每次拉取前,将新系统中 biz_pull_p2_time 的最后一条数据记录的时间,做为条件传递过去
+         * P2中,获取领料时间大于上一次拉取时间的新数据,再存入新系统中。
+         */
+        BizPullP2Time lastPullDetail = null;
+        if (pullDetails.size() > 0) {
+            int lastIndex = pullDetails.size() - 1;
+            lastPullDetail = pullDetails.get(lastIndex);
+        }
+
+        QueryWrapper<Inc10100> queryWrapper = new QueryWrapper<>();
+        if (lastPullDetail != null) {
+            Date newCondition = lastPullDetail.getPullTime();
+            /*
+             * 这里应该根据新系统中记录的最大的拉取日期
+             * modate:P2中的修改日期,为了避免重复拉取,需要做条件判断。modate必须大于上一次拉取时间
+             */
+            queryWrapper.apply("modate IS NOT NULL  AND modate > {0}", newCondition);
+        }
+        List<Inc10100> inc10100List = IInc10100Service.getList(queryWrapper);
+        List<BizProduct> products = productService.query().list();
+        List<BizProduct> newProducts = new ArrayList<>();
+        List<BizProduct> changeProducts = new ArrayList<>();
+        List<SysUser> userList = sysUserService.getList();
+        SysDictData conditions = new SysDictData();
+        conditions.setDictType("product_status_code");
+        List<SysDictData> dictList = sysDictDataService.selectDictDataList(conditions);
+        List<BizShaftCategory> categories = bizShaftCategoryService.query().list();
+        inc10100List.forEach(l -> {
+            if (products.stream().anyMatch(v -> v.getProductCode().equals(l.getPart().trim()) && v.getPreStock().equals(l.getPrloc().trim()))) {
+                // 已插入产品
+                BizProduct old = products.stream().filter(v -> v.getProductCode().equals(l.getPart().trim()) && v.getPreStock().equals(l.getPrloc().trim())).findFirst().orElse(null);
+                if (old != null) {
+                    old.setType(l.getType());
+                    old.setShaftBroadCategoryCode(l.getDtype());
+                    old.setShaftCategoryCode(l.getZtype());
+                    if (old.getShaftCategoryCode() != null) {
+                        BizShaftCategory bizShaftCategory = categories.stream().filter(v -> v.getSubCategoryCode().equals(old.getShaftCategoryCode())).findFirst().orElse(null);
+                        old.setShaftCategoryId(bizShaftCategory != null ? bizShaftCategory.getId() : null);
+                    }
+                    if (old.getShaftBroadCategoryCode() != null) {
+
+                    }
+                    old.setSpecification(l.getSpec());
+                    old.setDrawingNumber(l.getDraw());
+                    old.setCompanyAlias(l.getKhjc());
+                    old.setCompanyCode(l.getCust());
+                    old.setDescription(l.getDescr());
+                    old.setProductionTenantId(l.getSfacno() != null ? Long.parseLong(l.getSfacno()) : null);
+                    old.setDiameter(l.getDzj());
+                    old.setLenght(l.getLenght());
+                    old.setThickness(BigDecimal.valueOf(l.getAbbr()));
+                    old.setDensity(l.getDensity());
+                    old.setSalesmanCode(l.getXsyno());
+                    if (old.getSalesmanCode() != null) {
+                        SysUser user = userList.stream().filter(v -> v.getUserName().equals(old.getSalesmanCode())).findFirst().orElse(null);
+                        old.setSalesmanId(user != null ? user.getUserId() : null);
+                    }
+                    old.setStockKeeperCode(l.getBgyno());
+                    if (old.getStockKeeperCode() != null) {
+                        SysUser bgy = userList.stream().filter(v -> v.getUserName().equals(old.getStockKeeperCode())).findFirst().orElse(null);
+                        old.setStockKeeperId(bgy != null ? bgy.getUserId() : null);
+                    }
+                    old.setDispatcherCode(l.getDdyno());
+                    if (old.getDispatcherCode() != null) {
+                        SysUser ddy = userList.stream().filter(v -> v.getUserName().equals(old.getDispatcherCode())).findFirst().orElse(null);
+                        old.setDispatcherId(ddy != null ? ddy.getUserId() : null);
+                    }
+                    old.setMaterialCode(l.getPhcode());
+                    if (old.getMaterialCode() != null) {
+                        // 目前没有材料表
+                    }
+                    old.setProductStatusCode(l.getStatus());
+                    if (old.getProductStatusCode() != null) {
+                        SysDictData dictData = dictList.stream().filter(v -> v.getDictValue().equals(old.getProductStatusCode())).findFirst().orElse(null);
+                        old.setProductStatusId(dictData != null ? dictData.getDictCode() : null);
+                    }
+                    old.setTechnicianCode(l.getJsyno());
+                    if (old.getTechnicianCode() != null) {
+                        SysUser jsy = userList.stream().filter(v -> v.getUserName().equals(old.getTechnicianCode())).findFirst().orElse(null);
+                        old.setTechnicianId(jsy != null ? jsy.getUserId() : null);
+                    }
+                    old.setRemark(l.getRemark());
+                    changeProducts.add(old);
+                }
+            } else {
+                // 新产品
+                BizProduct newProduct = new BizProduct();
+                newProduct.setProductCode(l.getPart());
+                newProduct.setPreStock(l.getPrloc());
+                newProduct.setType(l.getType());
+                newProduct.setShaftBroadCategoryCode(l.getDtype());
+                newProduct.setShaftCategoryCode(l.getZtype());
+                if (newProduct.getShaftCategoryCode() != null) {
+                    BizShaftCategory bizShaftCategory = categories.stream().filter(v -> v.getSubCategoryCode().equals(newProduct.getShaftCategoryCode())).findFirst().orElse(null);
+                    newProduct.setShaftCategoryId(bizShaftCategory != null ? bizShaftCategory.getId() : null);
+                }
+                if (newProduct.getShaftBroadCategoryCode() != null) {
+
+                }
+                newProduct.setSpecification(l.getSpec());
+                newProduct.setDrawingNumber(l.getDraw());
+                newProduct.setCompanyAlias(l.getKhjc());
+                newProduct.setCompanyCode(l.getCust());
+                newProduct.setDescription(l.getDescr());
+                newProduct.setProductionTenantId(l.getSfacno() != null ? Long.parseLong(l.getSfacno()) : null);
+                newProduct.setDiameter(l.getDzj());
+                newProduct.setLenght(l.getLenght());
+                newProduct.setThickness(BigDecimal.valueOf(l.getAbbr()));
+                newProduct.setDensity(l.getDensity());
+                newProduct.setSalesmanCode(l.getXsyno());
+                if (newProduct.getSalesmanCode() != null) {
+                    SysUser user = userList.stream().filter(v -> v.getUserName().equals(newProduct.getSalesmanCode())).findFirst().orElse(null);
+                    newProduct.setSalesmanId(user != null ? user.getUserId() : null);
+                }
+                newProduct.setStockKeeperCode(l.getBgyno());
+                if (newProduct.getStockKeeperCode() != null) {
+                    SysUser user = userList.stream().filter(v -> v.getUserName().equals(newProduct.getStockKeeperCode())).findFirst().orElse(null);
+                    newProduct.setStockKeeperId(user != null ? user.getUserId() : null);
+                }
+                newProduct.setDispatcherCode(l.getDdyno());
+                if (newProduct.getDispatcherCode() != null) {
+                    SysUser user = userList.stream().filter(v -> v.getUserName().equals(newProduct.getDispatcherCode())).findFirst().orElse(null);
+                    newProduct.setDispatcherId(user != null ? user.getUserId() : null);
+                }
+                newProduct.setMaterialCode(l.getPhcode());
+                if (newProduct.getMaterialCode() != null) {
+                    // 目前没有材料表
+                }
+                newProduct.setProductStatusCode(l.getStatus());
+                if (newProduct.getProductStatusCode() != null) {
+                    SysDictData dictData = dictList.stream().filter(v -> v.getDictValue().equals(newProduct.getProductStatusCode())).findFirst().orElse(null);
+                    newProduct.setProductStatusId(dictData != null ? dictData.getDictCode() : null);
+                }
+                newProduct.setTechnicianCode(l.getJsyno());
+                if (newProduct.getTechnicianCode() != null) {
+                    SysUser jsy = userList.stream().filter(v -> v.getUserName().equals(newProduct.getTechnicianCode())).findFirst().orElse(null);
+                    newProduct.setTechnicianId(jsy != null ? jsy.getUserId() : null);
+                }
+                newProduct.setRemark(l.getRemark());
+                newProducts.add(newProduct);
+            }
+        });
+        if ((newProducts.isEmpty() || productService.saveBatch(newProducts)) && (changeProducts.isEmpty() || productService.updateBatchById(changeProducts))) {
+            BizPullP2Time bizPullP2Time = new BizPullP2Time();
+            // 将当前时间赋值给 pullTime 属性
+            bizPullP2Time.setPullTime(new Date());
+            bizPullP2Time.setType("product");
+            // 保存数据
+            pullP2TimeService.saveOrUpdate(bizPullP2Time);
+            result = result && pullP2TimeService.saveOrUpdate(bizPullP2Time);
+        } else {
+            result = false;
+        }
+        // 先从新系统中的 biz_pull_p2_time 中获取最新数据
+        BizPullP2Time pullProcess = new BizPullP2Time();
+        pullProcess.setType("productProcess");
+        List<BizPullP2Time> pullProcesses = pullP2TimeService.getList(pullProcess);
+        /*
+         * 如果 pullDetails 不为空,则获取最后一条数据,做为查询P2的生产计划明细的条件。
+         * 这里有个细节,每次从P2中获取生产计划明细,不能都从头开始,否则随着数据量增加,将会重复拉取大量的数据,性能很差
+         * 拉取数据后,存入新系统中,每次拉取前,将新系统中 biz_pull_p2_time 的最后一条数据记录的时间,做为条件传递过去
+         * P2中,获取领料时间大于上一次拉取时间的新数据,再存入新系统中。
+         */
+        BizPullP2Time lastPullProcess = null;
+        if (pullProcesses.size() > 0) {
+            int lastIndex = pullProcesses.size() - 1;
+            lastPullProcess = pullProcesses.get(lastIndex);
+        }
+        QueryWrapper<Sfc10401> sfc10401QueryWrapper = new QueryWrapper<>();
+        if (lastPullProcess != null) {
+            Date newCondition = lastPullProcess.getPullTime();
+            /*
+             * 这里应该根据新系统中记录的最大的拉取日期
+             * modate:P2中的修改日期,为了避免重复拉取,需要做条件判断。modate必须大于上一次拉取时间
+             */
+            sfc10401QueryWrapper.apply("modate IS NOT NULL  AND modate > {0}", newCondition);
+        }
+
+        List<Sfc10401> sfc10401List = sfc10401Service.getList(sfc10401QueryWrapper);
+        List<BizProcess> bases = processService.list();
+        List<BizTechnologicalProcessDetail> processDetails = technologicalProcessDetailService.query().list();
+        List<BizTechnologicalProcess> processes = technologicalProcessService.list();
+        List<Sfc10400> sfc10400List = sfc10400Service.getList(new QueryWrapper<>());
+        List<BizTechnologicalProcess> saveProcess = new ArrayList<>();
+        List<BizTechnologicalProcess> updateProcess = new ArrayList<>();
+        List<BizTechnologicalProcessDetail> saveProcessDetail = new ArrayList<>();
+        List<BizTechnologicalProcessDetail> updateProcessDetail = new ArrayList<>();
+        sfc10401List.forEach(l -> {
+            // 判断是否有对应的technologicalProcessDetail
+            BizTechnologicalProcessDetail old = processDetails.stream().filter(v -> v.getTechnologyVersion().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim()) && v.getProcessStepNumber().equals(l.getPrseq().trim()) && v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
+            if (old != null) {
+                old.setProcessKey(l.getFinkey());
+                old.setProcessAlias(l.getPrna());
+                old.setProductShaftCategory(l.getZtype());
+                old.setProductShaftCategoryName(l.getZtydm());
+                old.setProductDescription(l.getDescr());
+                updateProcessDetail.add(old);
+            } else {
+                BizTechnologicalProcessDetail newProcess = new BizTechnologicalProcessDetail();
+                newProcess.setTechnologyVersion(l.getPrver().trim());
+                newProcess.setProductCode(l.getCpart().trim());
+                newProcess.setProcessCode(l.getPrcode().trim());
+                newProcess.setProcessStepNumber(l.getPrseq());
+                newProcess.setProcessKey(l.getFinkey());
+                newProcess.setProcessAlias(l.getPrna());
+                newProcess.setProductShaftCategory(l.getZtype());
+                newProcess.setProductShaftCategoryName(l.getZtydm());
+                newProcess.setProductDescription(l.getDescr());
+                newProcess.setTenantId(1L);
+                if (newProcess.getProductCode() != null && !newProcess.getProductCode().isEmpty()) {
+                    BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
+                    if (bizProduct != null) {
+                        newProcess.setProductId(bizProduct.getId());
+                    }
+                    bizProduct = newProducts.stream().filter(v -> v.getProductCode().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
+                    if (bizProduct != null && newProcess.getProductId() == null) {
+                        newProcess.setProductId(bizProduct.getId());
+                    }
+                }
+                if (newProcess.getProcessCode() != null && !newProcess.getProcessCode().isEmpty()) {
+                    BizProcess bizProcess = bases.stream().filter(v -> v.getProcessCode().equals(l.getPrcode().trim())).findFirst().orElse(null);
+                    newProcess.setProcessId(bizProcess == null ? null : bizProcess.getId());
+                }
+                // 判断下是否有对用工艺
+
+                Sfc10400 sfc10400 = sfc10400List.stream().filter(v -> v.getPrver().trim().equals(l.getPrver().trim()) && v.getCpart().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
+                BizTechnologicalProcess oldTech = processes.stream().filter(v -> v.getTechnologyVersion().trim().equals(l.getPrver().trim()) && v.getProductCode().trim().equals(l.getCpart().trim())).findFirst().orElse(null);
+                if (oldTech != null) {
+                    if (sfc10400 != null) {
+                        oldTech.setProductShaftCategory(sfc10400.getZtype());
+                        oldTech.setProductShaftCategoryName(sfc10400.getZtydm());
+                        oldTech.setProductSpecification(sfc10400.getSpec());
+                        oldTech.setProductDrawingNumber(sfc10400.getDraw());
+                        oldTech.setProductDescription(sfc10400.getDescr());
+                        updateProcess.add(oldTech);
+                        newProcess.setTechnologicalProcessId(oldTech.getId());
+                    }
+                } else {
+                    if (sfc10400 != null) {
+                        BizTechnologicalProcess newTech = new BizTechnologicalProcess();
+                        newTech.setProductCode(sfc10400.getCpart());
+                        newTech.setTechnologyVersion(l.getPrver());
+                        newTech.setTenantId(1L);
+                        if (newTech.getProductCode() != null && !newTech.getProductCode().isEmpty()) {
+                            BizProduct bizProduct = products.stream().filter(v -> v.getProductCode().equals(sfc10400.getCpart())).findFirst().orElse(null);
+                            if (bizProduct != null) {
+                                newProcess.setProductId(bizProduct.getId());
+                            }
+                            bizProduct = newProducts.stream().filter(v -> v.getProductCode().equals(sfc10400.getCpart())).findFirst().orElse(null);
+                            if (bizProduct != null && newProcess.getProductId() == null) {
+                                newProcess.setProductId(bizProduct.getId());
+                            }
+                        }
+                        newTech.setProductShaftCategory(sfc10400.getZtype());
+                        newTech.setProductShaftCategoryName(sfc10400.getZtydm());
+                        newTech.setProductSpecification(sfc10400.getSpec());
+                        newTech.setProductDrawingNumber(sfc10400.getDraw());
+                        newTech.setProductDescription(sfc10400.getDescr());
+                        newTech.setId(snowflakeIdWorker.nextId());
+                        saveProcess.add(newTech);
+                        newProcess.setTechnologicalProcessId(newTech.getId());
+                    }
+                }
+                saveProcessDetail.add(newProcess);
+            }
+        });
+        if ((saveProcess.isEmpty() || technologicalProcessService.saveBatch(saveProcess)) && (updateProcess.isEmpty() || technologicalProcessService.updateBatchById(updateProcess)) && (saveProcessDetail.isEmpty() || technologicalProcessDetailService.saveBatch(saveProcessDetail)) && (updateProcessDetail.isEmpty() || technologicalProcessDetailService.updateBatchById(updateProcessDetail))) {
+            BizPullP2Time bizPullP2Time = new BizPullP2Time();
+            // 将当前时间赋值给 pullTime 属性
+            bizPullP2Time.setPullTime(new Date());
+            bizPullP2Time.setType("productProcess");
+            // 保存数据
+            pullP2TimeService.saveOrUpdate(bizPullP2Time);
+            result = result && pullP2TimeService.saveOrUpdate(bizPullP2Time);
+        } else {
+            result = false;
+        }
+
+        return toAjax(result);
+    }
 }

+ 25 - 4
src/main/java/cn/ezhizao/project/business/controller/OutsourceBalanceController.java

@@ -5,6 +5,7 @@ import cn.ezhizao.framework.web.domain.AjaxResult;
 import cn.ezhizao.project.business.domain.*;
 import cn.ezhizao.project.business.domain.vo.OutsourceOrderDetailBalance;
 import cn.ezhizao.project.business.service.*;
+import com.alibaba.nacos.client.naming.core.Balancer;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -135,7 +136,7 @@ public class OutsourceBalanceController extends BaseController {
              * 这里应该根据新系统中记录的最大的拉取日期
              * modate:P2中的修改日期,为了避免重复拉取,需要做条件判断。modate必须大于上一次拉取时间
              */
-            queryWrapper.apply("modate IS NOT NULL AND modate > {0}", newCondition);
+            queryWrapper.apply("modifydate IS NOT NULL AND modifydate > {0}", newCondition);
         }
         List<Inv10100> inv10100List = inv10100Service.getList(queryWrapper);
         List<BizMaterialBase> machineCenters = bizMaterialBaseService.query().list();
@@ -224,6 +225,8 @@ public class OutsourceBalanceController extends BaseController {
     public AjaxResult settlement() {
         // 获取所有已收回的外协发出单,是否已经结算过目前没有标识方法。目前不考虑
         List<BizOutsourcedOrderDetail> orderDetails = bizOutsourcedOrderDetailService.query().exists("(select 1 from biz_return_receipt_detail t where t.outsource_detail_id = biz_outsourced_order_detail.id and t.deleted = 0 and status = 1)").list();
+        // 按支结算
+        // 按炉结算
         List<BizReturnReceiptDetail> returnReceiptDetails = bizReturnReceiptDetailService.query().eq("status", 1).list();
         List<BizFurnaceNoInfo> furnaceNoInfos = bizFurnaceNoInfoService.query().in("daywork_id", orderDetails.isEmpty() ? Collections.singletonList(0L) : orderDetails.stream().map(BizOutsourcedOrderDetail::getDayworkId).collect(Collectors.toList())).list();
 
@@ -254,6 +257,9 @@ public class OutsourceBalanceController extends BaseController {
             balance.setFormDate(l.getFormDate());
             balance.setSupplierCode(l.getSupplierCode());
             balance.setSupplierName(l.getSupplierName());
+            balance.setSupplierId(l.getSupplierId());
+            balance.setOutsourceOrderId(l.getMasterId());
+            balance.setOutsourceOrderDetailId(l.getId());
             BizSupplier supplier = suppliers.stream().filter(v -> v.getId().equals(l.getSupplierId())).findFirst().orElse(null);
             List<BizReturnReceiptDetail> currentReturn = returnReceiptDetails.stream().filter(v -> v.getOutsourceDetailId().equals(l.getId())).collect(Collectors.toList());
             BizFurnaceNoInfo furnaceNoInfo = furnaceNoInfos.stream().filter(v -> v.getDayworkId().equals(l.getDayworkId())).findFirst().orElse(new BizFurnaceNoInfo());
@@ -340,10 +346,10 @@ public class OutsourceBalanceController extends BaseController {
                     if(supplier.getCode().equals("99024")) {
                         l.getProcesses().forEach(t -> {
                             if (t.getProcessCode().equals("99000")) {
-                                // 应得金额=round(合格数量 * 加工单价 * (1.00 + 税率 /100.00 )    ,4)
+                                // 应得金额 = round(合格数量 * 加工单价 * (1.00 + 税率 /100.00 )    ,4)
                                 planAmount.set(planAmount.get().add(BigDecimal.valueOf(t.getQualifiedNum()).multiply(supplier.getFreightPrice()).multiply(BigDecimal.ONE.add(BigDecimal.valueOf(supplier.getTaxRatio()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP)));
                             } else {
-                                // 应得金额=round(发出数量 * 加工单价 * (1.00 + 税率 /100.00 )    ,4)
+                                // 应得金额 = round(发出数量 * 加工单价 * (1.00 + 税率 /100.00 )    ,4)
                                 planAmount.set(planAmount.get().add(BigDecimal.valueOf(l.getProductNum()).multiply(supplier.getFreightPrice()).multiply(BigDecimal.ONE.add(BigDecimal.valueOf(supplier.getTaxRatio()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP)));
 
                             }
@@ -357,7 +363,7 @@ public class OutsourceBalanceController extends BaseController {
                     balance.setPlanAmount(planAmount.get());
                 } else if (supplier.getSettlementType().equals("2")) {
                     // 按炉结算
-                    // 暂时先放着
+                    // 应得金额=round(炉数【发出单数】 * 加工单价 * (1.00 + 税率 /100.00 ) ,4)
                 }
             } else if (supplier != null && supplier.getSurfaceTreatment().equals("Y")) {
                 // 废品加工单价
@@ -397,11 +403,26 @@ public class OutsourceBalanceController extends BaseController {
                     balance.setPlanAmount(planAmount.get());
                 } else if (supplier.getSettlementType().equals("2")) {
                     // 按炉结算
+                    // 应得金额=round(炉数【发出单数】 * 加工单价 * (1.00 + 税率 /100.00 )    ,4)
                 }
             }
             balance.setFreightPrice(supplier != null ? supplier.getFreightDeductUnitPrice().multiply(BigDecimal.valueOf(l.getNewCarrierCount())).setScale(4, RoundingMode.HALF_UP) : null);
             balances.add(balance);
         });
+        balances.stream().filter(v -> v.getSettlementType().equals("按炉结算")).forEach(l -> {
+            // 判断之前是否已经计算过这个值
+            if (balances.stream().allMatch(v -> v.getSupplierId().equals(l.getSupplierId()) && v.getPlanAmount() == null)) {
+                // 按炉结算
+                // 炉数
+                Long num = orderDetails.stream().filter(v -> v.getSupplierId().equals(l.getSupplierId())).map(v -> v.getMasterId()).distinct().count();
+                // 客户
+                BizSupplier supplier = suppliers.stream().filter(v -> v.getId().equals(l.getSupplierId())).findFirst().orElse(null);
+                // 加工单价
+                BigDecimal freightPrice = supplier.getFreightPrice();
+                l.setPlanAmount(BigDecimal.valueOf(num).multiply(freightPrice).multiply(BigDecimal.ONE.add(BigDecimal.valueOf(supplier.getTaxRatio()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+            }
+
+        });
         return success(balances);
     }
 }

+ 20 - 0
src/main/java/cn/ezhizao/project/business/domain/BizTechnologicalProcess.java

@@ -69,4 +69,24 @@ public class BizTechnologicalProcess extends BaseEntity
     @ApiModelProperty(value = "修改者编码")
     private String updaterCode;
 
+    @ApiModelProperty("历史版本")
+    private Integer isHistory;
+
+    public BizTechnologicalProcess() {
+    }
+
+    public BizTechnologicalProcess(BizTechnologicalProcess technologicalProcess) {
+        this.tenantId = technologicalProcess.getTenantId();
+        this.technologyVersion = technologicalProcess.getTechnologyVersion();
+        this.productId = technologicalProcess.getProductId();
+        this.productCode = technologicalProcess.getProductCode();
+        this.productShaftCategory = technologicalProcess.getProductShaftCategory();
+        this.productShaftCategoryName = technologicalProcess.getProductShaftCategoryName();
+        this.productSpecification = technologicalProcess.getProductSpecification();
+        this.productDrawingNumber = technologicalProcess.getProductDrawingNumber();
+        this.productDescription = technologicalProcess.getProductDescription();
+        this.creatorCode = technologicalProcess.getCreatorCode();
+        this.updaterCode = technologicalProcess.getUpdaterCode();
+        this.isHistory = technologicalProcess.getIsHistory();
+    }
 }

+ 16 - 0
src/main/java/cn/ezhizao/project/business/domain/BizTechnologicalProcessDetail.java

@@ -108,4 +108,20 @@ public class BizTechnologicalProcessDetail extends BaseEntity {
     /** 工序key */
     @ApiModelProperty("${comment}")
     private String processKey;
+
+    public BizTechnologicalProcessDetail() {
+    }
+
+    public BizTechnologicalProcessDetail(Sfc10401 e) {
+        this.processCode = e.getPrcode().trim();
+        this.productCode = e.getCpart().trim();
+        this.processAlias = e.getPrna().trim();
+        this.processStepNumber = e.getPrseq().trim();
+        this.processKey = e.getFinkey().trim();
+        this.technologyVersion = e.getPrver().trim();
+        this.productDescription = e.getDescr().trim();
+        this.productShaftCategory = e.getZtype();
+        this.productShaftCategoryName = e.getZtydm();
+        this.tenantId = Long.parseLong(e.getFacno());
+    }
 }

+ 6 - 0
src/main/java/cn/ezhizao/project/business/domain/vo/OutsourceOrderDetailBalance.java

@@ -48,4 +48,10 @@ public class OutsourceOrderDetailBalance {
     private Integer taxRatio;
     // 废品计算类别
     private String wastePriceCategory;
+    // 外协单id
+    private  Long outsourceOrderId;
+    // 外协单明细id
+    private Long outsourceOrderDetailId;
+    // 外协商id
+    private Long supplierId;
 }