diff --git a/nflg_project_dev/nflg-bom-new/pom.xml b/nflg_project_dev/nflg-bom-new/pom.xml index 851a9bf6..6f32fd98 100644 --- a/nflg_project_dev/nflg-bom-new/pom.xml +++ b/nflg_project_dev/nflg-bom-new/pom.xml @@ -119,6 +119,7 @@ + org.springframework.boot @@ -129,6 +130,7 @@ 2.6.4 + \ No newline at end of file diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/NacosConfig.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/NacosConfig.java index 40098a5d..c77f4b32 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/NacosConfig.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/NacosConfig.java @@ -108,6 +108,10 @@ public class NacosConfig { + + + + public static NacosConfig getNacosConfig(){ return SpringContextUtils.getBean(NacosConfig.class); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapChildDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapChildDTO.java new file mode 100644 index 00000000..dd66b8a9 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapChildDTO.java @@ -0,0 +1,35 @@ +package com.nflg.product.bomnew.pojo.dto.sap; + +import lombok.Data; + +@Data +public class ImportToSapChildDTO { + // 物料编码 + private String IDNRK; + // 序号 + private String POSNR; + // 项目类别 + private String POSTP; + // 数量 + private String MENGE; + // 单位 + private String MEINS; + + /** 暂时未用到的字段 */ +// // 工厂 +// private String WERKS; +// // 物料描述 +// private String MAKTX; +// // 创建日期 +// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +// private String ANDAT; +// // 修改日期 +// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +// private String AEDAT; +// // 有效起始日 +// private String DATUV; +// // 有效至 +// private String DATUB; +// // 设计人员 +// private String ANNAM; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapDTO.java new file mode 100644 index 00000000..43ca377a --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapDTO.java @@ -0,0 +1,15 @@ +package com.nflg.product.bomnew.pojo.dto.sap; + +import lombok.Data; + +import java.util.List; + +@Data +public class ImportToSapDTO { + + // 抬头 + private ImportToSapParentDTO parent; + + // 组件 + private List childList; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapParentDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapParentDTO.java new file mode 100644 index 00000000..1f7e2428 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/ImportToSapParentDTO.java @@ -0,0 +1,29 @@ +package com.nflg.product.bomnew.pojo.dto.sap; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +@Data +public class ImportToSapParentDTO { + // 工厂 + private String WERKS; + // 物料号 + private String MATNR; + // BOM用途 + private String STLAN; + // 基本数量 + private String BMENG; + // 单位 + private String BMEIN; + // BOM状态:1=EBOM生成、2=暂存(当编辑时状态改为暂存)、3=已发布 + private String STLST; + // 有效起始日 + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private String DATUV; + + /** 暂时未用到的字段 */ + // 物料描述 +// private String MAKTX; + // 可选的bom +// private String STLAL; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapReqParams.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapReqParams.java similarity index 96% rename from nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapReqParams.java rename to nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapReqParams.java index 67b5560f..e678b6ee 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapReqParams.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapReqParams.java @@ -1,4 +1,4 @@ -package com.nflg.product.bomnew.util.sap; +package com.nflg.product.bomnew.pojo.dto.sap; import lombok.Data; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapResult.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapResult.java similarity index 92% rename from nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapResult.java rename to nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapResult.java index 3deb2ca1..bbee0c2f 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/SapResult.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/sap/SapResult.java @@ -1,4 +1,4 @@ -package com.nflg.product.bomnew.util.sap; +package com.nflg.product.bomnew.pojo.dto.sap; import com.sap.conn.jco.JCoParameterList; import lombok.Data; 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 22b9bbad..8e178bad 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 @@ -1,15 +1,12 @@ package com.nflg.product.bomnew.service; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; 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.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.ImmutableList; @@ -19,26 +16,27 @@ import com.nflg.product.base.core.exception.NflgBusinessException; import com.nflg.product.bomnew.constant.*; import com.nflg.product.bomnew.mapper.master.BomNewPbomParentMapper; import com.nflg.product.bomnew.pojo.dto.*; +import com.nflg.product.bomnew.pojo.dto.sap.ImportToSapChildDTO; +import com.nflg.product.bomnew.pojo.dto.sap.ImportToSapDTO; +import com.nflg.product.bomnew.pojo.dto.sap.ImportToSapParentDTO; import com.nflg.product.bomnew.pojo.entity.*; import com.nflg.product.bomnew.pojo.query.BomNewPbomParentQuery; import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.service.domain.PBom.*; import com.nflg.product.bomnew.util.*; -import com.nflg.product.bomnew.util.sap.LevelNumUtil; -import io.swagger.models.auth.In; +import com.nflg.product.bomnew.util.LevelNumUtil; import nflg.product.common.constant.STATE; +import nflg.product.common.vo.ResultVO; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.ttzero.excel.entity.ListMapSheet; -import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.Workbook; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ExecutionException; @@ -93,6 +91,9 @@ public class BomNewPbomParentService extends ServiceImpl childResult=new ArrayList<>(); + ImportToSapChildDTO childEnt =new ImportToSapChildDTO(); + childEnt.setIDNRK("1100021745"); + childEnt.setPOSNR("045"); + childEnt.setPOSTP("F"); + childEnt.setMENGE("6"); + childEnt.setMEINS("PC"); + childResult.add(childEnt); + + result.setChildList(childResult); + + + List sapParams=new ArrayList<>(); + + sapParams.add(result); + ResultVO syncResult = sapOpUtilService.importPBomToSap(sapParams); + VUtils.isTure(!syncResult.getState().equals(STATE.Success)).throwMessage("同步SAP失败:"+syncResult.getMsg()); + } + + private void importSap(BomNewPbomParentEntity parent, List children){ + + List pbom = children.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()); + List parentChild = children.stream().filter(u -> u.getParentRowId().equals(parent.getRowId())).collect(Collectors.toList()); + List sapParams=new ArrayList<>(); + sapParams.add(buildSapBom(Convert.convert(BomNewPbomParentVO.class, parent), parentChild)); + + for (BomNewPbomParentVO pt :pbom) { + List pChild = children.stream().filter(u -> u.getParentRowId().equals(pt.getBomRowId())).collect(Collectors.toList()); + sapParams.add(buildSapBom(Convert.convert(BomNewPbomParentVO.class, parent), pChild)); + } + if(CollUtil.isNotEmpty(sapParams)) { + sapOpUtilService.importPBomToSap(sapParams); + } + + } + + private ImportToSapDTO buildSapBom(BomNewPbomParentVO parentVO, List children){ + + ImportToSapDTO result=new ImportToSapDTO(); + ImportToSapParentDTO sapParent=new ImportToSapParentDTO(); + SimpleDateFormat spt=new SimpleDateFormat("yyyy-MM-dd"); + sapParent.setWERKS(parentVO.getFacCode()); + sapParent.setMATNR(parentVO.getMaterialNo()); + sapParent.setSTLAN(""); + sapParent.setBMENG(parentVO.getNum().toString()); + sapParent.setBMEIN(parentVO.getMaterialUnit()); + sapParent.setSTLST("3"); + sapParent.setDATUV(spt.format( parentVO.getCreatedTime())); + + List childResult=new ArrayList<>(); + for (BomNewPbomParentVO child :children) { + ImportToSapChildDTO childEnt =new ImportToSapChildDTO(); + childEnt.setIDNRK(child.getMaterialNo()); + childEnt.setPOSNR(child.getOrderNumber()); + childEnt.setPOSTP(child.getProjectType()); + childEnt.setMENGE(child.getNum().toString()); + childEnt.setMEINS(child.getMaterialUnit()); + childResult.add(childEnt); + } + + result.setParent(sapParent); + result.setChildList(childResult); + return result; + } + + + /** * 获取CRM 订单号 * diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapOpUtilService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapOpUtilService.java new file mode 100644 index 00000000..4e55061e --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapOpUtilService.java @@ -0,0 +1,73 @@ +package com.nflg.product.bomnew.service; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.nflg.product.bomnew.pojo.dto.sap.ImportToSapDTO; +import com.nflg.product.bomnew.pojo.dto.sap.SapReqParams; +import com.nflg.product.bomnew.pojo.dto.sap.SapResult; +import lombok.extern.slf4j.Slf4j; +import nflg.product.common.constant.STATE; +import nflg.product.common.vo.ResultVO; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@Slf4j +public class SapOpUtilService { + + @Resource + SapService sapService; + + + + public ResultVO importPBomToSap(List sapList) { + if (CollUtil.isEmpty(sapList)) { + return null; + } + + for (ImportToSapDTO importToSapDTO : sapList) { + SapReqParams params = new SapReqParams(); + // 接口名 + params.setFunName("ZRFC_PP_CREATEBOM"); + + Map> inputStructure = new HashMap<>(); + Map parentMap = Convert.convert(new TypeReference>() { + }, importToSapDTO.getParent()); + inputStructure.put("I_STKO", parentMap); + params.setInputStructure(inputStructure); + + Map>> inputTables = new HashMap<>(); + List> childMapList = Convert.convert(new TypeReference>>() { + }, importToSapDTO.getChildList()); + inputTables.put("T_BOM", childMapList); + params.setInputTables(inputTables); + + try { + log.info("PBOM导入到SAP--参数:" + JSON.toJSONString(params)); + SapResult sapResult = sapService.doSapFun(params); + Map exportMap = sapResult.getExportMap(); + if (!sapResult.isSuccess()) { + return ResultVO.error(STATE.Error, "接口连接失败"); + } + + log.info("PBOM导入到SAP--返回值:" + JSON.toJSONString(exportMap)); + String eErrmsg = String.valueOf(exportMap.get("E_ERRMSG")); + if (StrUtil.isNotEmpty(eErrmsg)) { + return ResultVO.error(STATE.Error, eErrmsg); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + return ResultVO.success(); + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/ConnectPooled.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapService.java similarity index 93% rename from nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/ConnectPooled.java rename to nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapService.java index db4cdcb6..beca05f5 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/ConnectPooled.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/SapService.java @@ -1,24 +1,26 @@ -package com.nflg.product.bomnew.util.sap; - +package com.nflg.product.bomnew.service; +import com.nflg.product.bomnew.pojo.dto.sap.SapReqParams; +import com.nflg.product.bomnew.pojo.dto.sap.SapResult; import com.sap.conn.jco.*; import com.sap.conn.jco.ext.DestinationDataProvider; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; import java.io.File; import java.io.FileOutputStream; import java.util.*; /** - * SAP JCO3 连接池 + * sap服務 */ +@Service @Slf4j -@Component -public class ConnectPooled { - +public class SapService implements ApplicationContextAware { @Value("${custom.sap.host}") private String sapHost; @Value("${custom.sap.sysnr}") @@ -36,33 +38,31 @@ public class ConnectPooled { @Value("${custom.sap.peak}") private String sapPeak; - static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; + private static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; + + - /** - * 初始化SAP连接 - * PostConstruct 注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的 - */ - @PostConstruct private void initProperties() { Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sapHost); - connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sapSysnr); - connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sapClient); + connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,sapSysnr); + connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT,sapClient); // QAS800 - connectProperties.setProperty(DestinationDataProvider.JCO_USER, sapUsername); + connectProperties.setProperty(DestinationDataProvider.JCO_USER,sapUsername); // 注:密码是区分大小写的,要注意大小写 - connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sapPassword); - connectProperties.setProperty(DestinationDataProvider.JCO_LANG, sapLang); + connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,sapPassword); + connectProperties.setProperty(DestinationDataProvider.JCO_LANG ,sapLang); // *********连接池方式与直接不同的是设置了下面两个连接属性 // JCO_PEAK_LIMIT - 同时可创建的最大活动连接数,0表示无限制,默认为JCO_POOL_CAPACITY的值 // 如果小于JCO_POOL_CAPACITY的值,则自动设置为该值,在没有设置JCO_POOL_CAPACITY的情况下为0 - connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sapPeak); + connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,sapPeak); // JCO_POOL_CAPACITY - 空闲连接数,如果为0,则没有连接池效果,默认为1 - connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sapPool); + connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY,sapPool); createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); } - static void createDataFile(String name, String suffix, Properties properties) { + + void createDataFile(String name, String suffix, Properties properties) { File cfg = new File(name + "." + suffix); if (!cfg.exists()) { try { @@ -75,6 +75,7 @@ public class ConnectPooled { } } + public static void connectWithPooled() throws JCoException { JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); System.out.println("Attributes:"); @@ -295,10 +296,8 @@ public class ConnectPooled { return destination; } -// public static void main(String[] args) throws JCoException { -//// connectWithPooled(); -//// accessSAPStructure(); -//// workWithTable(); -// } - -} \ No newline at end of file + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + initProperties(); + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBom.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBom.java index 2f7f62df..74802a0c 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBom.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomToPBom.java @@ -305,9 +305,10 @@ public class EBomToPBom { if (CollUtil.isNotEmpty(parentList)) { sum = NumberUtil.mul(sum, parentList.get(0).getNum()); parentFullPathNum.add(parentList.get(0).getNum()); - } else { - parentFullPathNum.add(parentList.get(0).getNum()); } +// else { +// parentFullPathNum.add(parentList.get(0).getNum()); +// } parentLevelNo = BomLevelUtil.getParentLevelNo(parentLevelNo); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/BomLevelUtil.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/BomLevelUtil.java index 7d241b6a..73cfb1b4 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/BomLevelUtil.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/BomLevelUtil.java @@ -20,6 +20,6 @@ public class BomLevelUtil { public static String getParentLevelNo(String levelNo){ List result=new ArrayList<>(); String[] parts = levelNo.split("-"); - return String.join("-", Arrays.copyOfRange(parts, 0, levelNo.length()-1)); + return String.join("-", Arrays.copyOfRange(parts, 0, parts.length-1)); } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/LevelNumUtil.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/LevelNumUtil.java similarity index 94% rename from nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/LevelNumUtil.java rename to nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/LevelNumUtil.java index 803bb5b4..bf5b2a13 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/sap/LevelNumUtil.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/LevelNumUtil.java @@ -1,4 +1,4 @@ -package com.nflg.product.bomnew.util.sap; +package com.nflg.product.bomnew.util; import cn.hutool.core.util.StrUtil;