新火炬后端单体项目初始化代码
cuilei
2 天以前 c71714508fbe3ace3543423c7700d7bbcca90056
Merge remote-tracking branch 'origin/master'
已添加16个文件
已修改24个文件
1259 ■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/common/aspect/ApiLogAspect.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/config/Swagger2Config.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/controller/FactoryController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/model/FactoryModel.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/service/IFactoryService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/FeishuUser.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/FunctionConst.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/dto/MaterialRequestDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/request/MaterialRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/request/ProductionOrderSyncRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/OrderMaterialRequestService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/OrderMaterialRequestServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/system/entity/SysUser.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/system/service/ISysUserService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/CxfClientUtil.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/dto/WSResponse.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -2,9 +2,9 @@
  "name": "双林新火炬MES数据库设计",
  "describe": "描述双薪新火炬MES数据库设计详情",
  "avatar": "",
  "version": "4.9.4",
  "version": "4.9.2",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-8-7 10:18:16",
  "updatedTime": "2025-8-12 12:29:31",
  "dbConns": [],
  "profile": {
    "default": {
@@ -10982,6 +10982,42 @@
          "extProps": {},
          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
          "id": "6E75C587-8628-4A76-BE8A-07CB2185F61B"
        },
        {
          "defKey": "qualified_quantity",
          "defName": "合格数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E",
          "extProps": {},
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "id": "B4405701-40E7-4987-B540-759F22DC5A91"
        },
        {
          "defKey": "scrap_quantity",
          "defName": "报废数量",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E",
          "extProps": {},
          "domain": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4",
          "id": "48F2218D-6129-47BF-85BA-72737EEDCCAC"
        },
        {
          "defKey": "remark",
@@ -28089,6 +28125,24 @@
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098",
          "extProps": {},
          "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE"
        },
        {
          "defKey": "open_id",
          "defName": "飞书用户OPENID",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "BE09D493-E183-402D-ACC4-EEA21EB35B8E",
          "id": "BDE72375-D196-41E2-A887-59B59C9A9479"
        }
      ],
      "indexes": [
@@ -28262,7 +28316,8 @@
          "hideInGraph": true
        }
      ],
      "correlations": []
      "correlations": [],
      "notes": {}
    },
    {
      "id": "ADF40C7F-5C97-4196-BCA7-E780FCC8E2FB",
pom.xml
@@ -58,6 +58,8 @@
        <!-- Log4j2爆雷漏洞 -->
        <log4j2.version>2.17.0</log4j2.version>
        <logback.version>1.2.9</logback.version>
        <!-- webservice -->
        <cxf.version>3.2.4</cxf.version>
    </properties>
    <repositories>
@@ -220,17 +222,27 @@
            <artifactId>java-jwt</artifactId>
            <version>${java-jwt.version}</version>
        </dependency>
        <!-- WebService -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.apache.cxf</groupId>-->
<!--            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>-->
<!--            <version>${cxf.version}</version>-->
<!--        </dependency>-->
        <!-- CXF webservice -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.1</version>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.2.1</version>
            <version>${cxf.version}</version>
        </dependency>
        <!--shiro-->
src/main/java/org/jeecg/common/aspect/ApiLogAspect.java
@@ -146,6 +146,14 @@
            } catch (JsonProcessingException e) {
                throw new JeecgBootException(e);
            }
        } else {
            try {
                String json = objectMapper.writeValueAsString(result);
                JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
                items.add(item);
            } catch (JsonProcessingException e) {
                throw new JeecgBootException(e);
            }
        }
        return items.toString();
    }
src/main/java/org/jeecg/config/Swagger2Config.java
@@ -101,29 +101,6 @@
                .groupName("MDC");
    }
    /**
     * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 ï¼ˆDNC)
     *
     * @return Docket
     */
    @Bean(value = "defaultApiDnc")
    public Docket defaultApi3() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //此包路径下的类,才生成接口文档
                .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.dnc"))
                //加了ApiOperation注解的类,才生成接口文档
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(securityContexts())
                .globalOperationParameters(setHeaderToken())
                .groupName("DNC");
    }
    @Bean(value = "defaultApiAct")
    public Docket activitiApi() {
        return new Docket(DocumentationType.SWAGGER_2)
@@ -142,24 +119,6 @@
                .groupName("Flowable模块");
    }
    @Bean(value = "defaultApiMsi")
    public Docket activitiApiMsi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //此包路径下的类,才生成接口文档
                .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.msi"))
                //加了ApiOperation注解的类,才生成接口文档
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(securityContexts())
                .globalOperationParameters(setHeaderToken())
                .groupName("集成");
    }
    @Bean(value = "defaultApiEam")
    public Docket activitiApiEam() {
        return new Docket(DocumentationType.SWAGGER_2)
@@ -175,7 +134,43 @@
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(securityContexts())
                .globalOperationParameters(setHeaderToken())
                .groupName("eam");
                .groupName("EAM设备管理");
    }
    @Bean(value = "defaultApiSAP")
    public Docket defaultApiSAP() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //此包路径下的类,才生成接口文档
                .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.sap"))
                //加了ApiOperation注解的类,才生成接口文档
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(securityContexts())
                .globalOperationParameters(setHeaderToken())
                .groupName("SAP对接");
    }
    @Bean(value = "defaultApiMES")
    public Docket defaultApiMES() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //此包路径下的类,才生成接口文档
                .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.mes"))
                //加了ApiOperation注解的类,才生成接口文档
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(securityContexts())
                .globalOperationParameters(setHeaderToken())
                .groupName("MES模块");
    }
    /***
src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java
@@ -6,10 +6,12 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.andon.entity.AndonButtonConfig;
import org.jeecg.modules.andon.service.IAndonButtonConfigService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -56,6 +58,37 @@
       return Result.OK(pageList);
   }
    /**
     * APP分页列表查询
     *
     * @param andonButtonConfig
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    @ApiOperation(value="安灯按钮配置-分页列表查询", notes="安灯按钮配置-分页列表查询")
    @GetMapping(value = "/App/list")
    public Result<IPage<AndonButtonConfig>> queryPageAppList(AndonButtonConfig andonButtonConfig,
                                                             @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                             @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                             HttpServletRequest req) {
        QueryWrapper<AndonButtonConfig> queryWrapper = QueryGenerator.initQueryWrapper(andonButtonConfig, req.getParameterMap());
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser != null) {
            // å¢žåŠ é€šè¿‡ç³»ç»Ÿç™»å½•äººè¿›è¡Œè¿‡æ»¤
            queryWrapper.eq("create_by", sysUser.getUsername());
        }
        Page<AndonButtonConfig> page = new Page<AndonButtonConfig>(pageNo, pageSize);
        IPage<AndonButtonConfig> pageList = andonButtonConfigService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
   /**
    *   æ·»åŠ 
    *
src/main/java/org/jeecg/modules/base/controller/FactoryController.java
@@ -13,6 +13,7 @@
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.model.FactoryIdModel;
import org.jeecg.modules.base.model.FactoryModel;
import org.jeecg.modules.base.service.IFactoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -220,6 +221,19 @@
         return result;
     }
     @ApiOperation(value = "获取所有产线列表", notes = "获取所有产线列表")
     @GetMapping(value = "/queryProductionLineList")
     public Result<List<FactoryModel>> queryProductionLineList() {
         List<Factory> factoryList = factoryService.queryProductionLineList();
         List<FactoryModel> factoryModels = factoryList.stream()
                 .map(factory -> new FactoryModel(factory.getId(), factory.getFactoryName()))
                 .collect(Collectors.toList());
         return Result.ok(factoryModels);
     }
     //@AutoLog(value = "产线表-查询树形结构所有产线名称")
     @ApiOperation(value = "产线表-查询树形结构所有产线名称", notes = "产线表-查询树形结构所有产线名称")
     @GetMapping(value = "/queryIdTree")
src/main/java/org/jeecg/modules/base/model/FactoryModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package org.jeecg.modules.base.model;
import lombok.Data;
@Data
public class FactoryModel {
    // getter和setter方法
    private String value;  // äº§çº¿ID
    private String text;   // äº§çº¿åç§°
    public FactoryModel() {
    }
    public FactoryModel(String value, String text) {
        this.value = value;
        this.text = text;
    }
}
src/main/java/org/jeecg/modules/base/service/IFactoryService.java
@@ -45,4 +45,10 @@
    List<Factory> queryFacByPid(String pid);
    List<String> recursionChildren(String factoryId);
    /**
     * æŸ¥è¯¢æŸ¥è¯¢åˆ—表
     * @return
     */
    List<Factory> queryProductionLineList();
}
src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java
@@ -175,6 +175,15 @@
        return this.baseMapper.recursionChildren(factoryId);
    }
    @Override
    public List<Factory> queryProductionLineList() {
        LambdaQueryWrapper<Factory> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Factory::getDelFlag, CommonConstant.DEL_FLAG_0);
        queryWrapper.eq(Factory::getFactoryCategory, "PRODUCTION_LINE");
        queryWrapper.orderByAsc(Factory::getSorter);
        return super.list(queryWrapper);
    }
    /**
     * æ‰“å¼€ çˆ¶èŠ‚ç‚¹ åŠ ä»¥ä¸Šçš„mdc标记
     * @param parentId
src/main/java/org/jeecg/modules/mes/entity/FeishuUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package org.jeecg.modules.mes.entity;
import lombok.Data;
@Data
public class FeishuUser {
    private String openId;
    private String name;
    private String username;
    private String realname;
    private String workNo;
    private String password;
    private String userId;      // å¯¹åº” open_id
    private String unionId;     // å¯¹åº” union_id
    private String enName;      // å¯¹åº” en_name
    private String description; // å¯¹åº” description
    private String avatar240;   // å¯¹åº” avatar.avatar_240
    private String avatar640;   // å¯¹åº” avatar.avatar_640
    private String avatar72;    // å¯¹åº” avatar.avatar_72
    private String avatarOrigin;// å¯¹åº” avatar.avatar_origin
    private String email;
    private String mobile;
    private String employeeNo;
    private Integer status;
    private Boolean mobileVisible; // å¯¹åº” mobile_visible
}
src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java
@@ -126,6 +126,12 @@
    /**客户名称*/
    @ApiModelProperty(value = "客户名称")
    private String customer;
    /**合格数量*/
    @ApiModelProperty(value = "合格数量")
    private BigDecimal qualifiedQuantity;
    /**报废数量*/
    @ApiModelProperty(value = "报废数量")
    private BigDecimal scrapQuantity;
    /**备注*/
    @ApiModelProperty(value = "备注")
    private String remark;
src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package org.jeecg.modules.mes.job;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * é£žä¹¦ç”¨æˆ·åŒæ­¥å®šæ—¶ä»»åŠ¡
 */
@Component
@Slf4j
public class FeishuSyncTask implements Job {
    @Autowired
    private org.jeecg.modules.mes.job.FeishuUserService feishuUserService;
    @Value("${feishu.sync.departmentId:0}")
    private String departmentId;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info("开始执行飞书用户同步任务");
        try {
            if (departmentId != null && !"0".equals(departmentId)) {
                feishuUserService.syncFeishuDepartmentUsers(departmentId);
                log.info("飞书用户同步任务执行完成");
            } else {
                log.warn("未配置飞书同步部门ID,跳过同步任务");
            }
        } catch (Exception e) {
            log.error("飞书用户同步任务执行失败", e);
            throw new JobExecutionException(e);
        }
    }
}
src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,327 @@
package org.jeecg.modules.mes.job;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.PasswordUtil;
import org.jeecg.common.util.RestUtil;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.mes.entity.FeishuUser;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class FeishuUserService {
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private RestTemplate restTemplate;  // æ–°å¢žRestTemplate依赖注入
    @Value("${feishu.appId:}")
    private String appId;
    @Value("${feishu.appSecret:}")
    private String appSecret;
    @Value("${feishu.url:}")
    private String feishuUrl;
    /**
     * åŒæ­¥é£žä¹¦éƒ¨é—¨ç”¨æˆ·åˆ°ç³»ç»Ÿç”¨æˆ·è¡¨
     * @param departmentId é£žä¹¦éƒ¨é—¨ID
     */
    public void syncFeishuDepartmentUsers(String departmentId) {
        try {
            log.info("开始同步飞书部门用户,部门ID: {}", departmentId);
            // 1. èŽ·å–é£žä¹¦è®¿é—®ä»¤ç‰Œ
            String accessToken = getFeishuAccessToken();
            if (oConvertUtils.isEmpty(accessToken)) {
                log.error("获取飞书访问令牌失败,终止同步流程");
                return;  // ä»¤ç‰ŒèŽ·å–å¤±è´¥ç›´æŽ¥è¿”å›žï¼Œé¿å…åŽç»­æ— æ•ˆæ“ä½œ
            }
            // 2. èŽ·å–éƒ¨é—¨ä¸‹çš„ç”¨æˆ·åˆ—è¡¨
            List<FeishuUser> feishuUsers = getDepartmentUsers(accessToken, departmentId);
            log.info("获取到飞书部门用户数量: {}", feishuUsers.size());
            // 3. åŒæ­¥åˆ°ç³»ç»Ÿç”¨æˆ·è¡¨
            int successCount = 0;
            int updateCount = 0;
            int addCount = 0;
            for (FeishuUser feishuUser : feishuUsers) {
                try {
                    boolean isUpdated = syncFeishuUserToSystem(feishuUser);
                    successCount++;
                    if (isUpdated) {
                        updateCount++;
                    } else {
                        addCount++;
                    }
                } catch (Exception e) {
                    log.error("同步飞书用户失败,用户ID: {}", feishuUser.getUserId(), e);
                }
            }
            log.info("飞书用户同步完成,总处理: {},新增: {},更新: {}", successCount, addCount, updateCount);
        } catch (Exception e) {
            log.error("同步飞书部门用户失败,部门ID: {}", departmentId, e);
            throw new RuntimeException("同步飞书用户失败: " + e.getMessage());
        }
    }
    private String getFeishuAccessToken() {
        try {
            String url = feishuUrl + "open-apis/auth/v3/tenant_access_token/internal";
            log.info("开始获取飞书访问令牌,AppId: {}",
                    appId != null ? appId.substring(0, Math.min(appId.length(), 10)) + "..." : "null");
            JSONObject params = new JSONObject();
            params.put("app_id", appId);
            params.put("app_secret", appSecret);
            log.debug("获取令牌请求参数: {}", params.toJSONString());
            JSONObject result = RestUtil.post(url, params);
            log.info("获取飞书访问令牌响应: {}", result != null ? result.toJSONString() : "null");
            if (result != null && result.getInteger("code") == 0) {
                String accessToken = result.getString("tenant_access_token");
                log.info("成功获取飞书访问令牌,令牌长度: {}", accessToken != null ? accessToken.length() : 0);
                return accessToken;
            } else {
                log.error("获取飞书访问令牌失败,响应: {}", result != null ? result.toJSONString() : "null");
                if (result != null) {
                    log.error("错误码: {}, é”™è¯¯ä¿¡æ¯: {}", result.getInteger("code"), result.getString("msg"));
                }
                return null;
            }
        } catch (Exception e) {
            log.error("获取飞书访问令牌异常", e);
            return null;
        }
    }
    /**
     * èŽ·å–éƒ¨é—¨ç”¨æˆ·åˆ—è¡¨ï¼ˆç›´å±žå‘˜å·¥ï¼‰
     */
    private List<FeishuUser> getDepartmentUsers(String accessToken, String departmentId) {
        List<FeishuUser> userList = new ArrayList<>();
        try {
            log.info("开始获取飞书部门用户列表,部门ID: {}", departmentId);
            // éªŒè¯è®¿é—®ä»¤ç‰Œ
            if (accessToken == null || accessToken.isEmpty()) {
                log.error("访问令牌为空,无法继续执行");
                return userList;
            }
            log.info("使用的访问令牌前缀: Bearer {}", accessToken.substring(0, Math.min(20, accessToken.length())) + "...");
            // é£žä¹¦API端点
            String url = feishuUrl + "open-apis/contact/v3/users/find_by_department";
            String pageToken = null;
            int pageNumber = 1;
            do {
                // æž„建请求URL和参数
                StringBuilder urlBuilder = new StringBuilder(url);
                urlBuilder.append("?department_id=").append(departmentId);
                urlBuilder.append("&department_id_type=open_department_id");
                urlBuilder.append("&page_size=50");
                urlBuilder.append("&user_id_type=open_id");
                if (pageToken != null && !pageToken.isEmpty()) {
                    urlBuilder.append("&page_token=").append(pageToken);
                }
                log.info("请求第{}页数据,URL: {}", pageNumber, urlBuilder.toString());
                // è®¾ç½®è¯·æ±‚头 - å…³é”®ä¿®å¤ç‚¹ï¼šä½¿ç”¨HttpHeaders确保头信息正确设置
                HttpHeaders headers = new HttpHeaders();
                String authHeader = "Bearer " + accessToken;
                headers.add("Authorization", authHeader);
                headers.add("Content-Type", "application/json; charset=utf-8");
                log.info("设置请求头: Authorization = {}", authHeader.substring(0, Math.min(30, authHeader.length())) + "...");
                // ä½¿ç”¨RestTemplate发送请求,确保头信息被正确传递
                HttpEntity<String> requestEntity = new HttpEntity<>(headers);
                ResponseEntity<String> response = restTemplate.exchange(
                        urlBuilder.toString(),
                        HttpMethod.GET,
                        requestEntity,
                        String.class
                );
                // è§£æžå“åº”
                JSONObject result = JSONObject.parseObject(response.getBody());
                log.debug("第{}页API响应: {}", pageNumber, result != null ? result.toJSONString() : "null");
                if (result != null && result.getInteger("code") == 0) {
                    JSONObject data = result.getJSONObject("data");
                    if (data != null) {
                        // è§£æžç”¨æˆ·åˆ—表
                        Object items = data.get("items");
                        log.info("第{}页原始用户数据数量: {}", pageNumber, items instanceof List ? ((List<?>) items).size() : 0);
                        if (items != null) {
                            List<FeishuUser> pageUsers = parseUsers(items);
                            userList.addAll(pageUsers);
                            log.info("第{}页解析后用户数量: {}", pageNumber, pageUsers.size());
                        }
                        // æ£€æŸ¥æ˜¯å¦æœ‰ä¸‹ä¸€é¡µ
                        pageToken = data.getString("page_token");
                        boolean hasMore = data.getBooleanValue("has_more");
                        log.info("第{}页has_more: {}, page_token: {}", pageNumber, hasMore, pageToken);
                        pageNumber++;
                    } else {
                        log.warn("第{}页data为空", pageNumber);
                        break;
                    }
                } else {
                    log.error("获取飞书部门用户列表失败,响应: {}", result != null ? result.toJSONString() : "null");
                    if (result != null) {
                        log.error("错误码: {}, é”™è¯¯ä¿¡æ¯: {}", result.getInteger("code"), result.getString("msg"));
                    }
                    break;
                }
            } while (pageToken != null && !pageToken.isEmpty());
            log.info("获取飞书部门用户完成,总用户数量: {}", userList.size());
        } catch (Exception e) {
            log.error("获取飞书部门用户列表异常", e);
        }
        return userList;
    }
    /**
     * è§£æžç”¨æˆ·æ•°æ®
     */
    /**
     * è§£æžç”¨æˆ·æ•°æ®
     */
    @SuppressWarnings("unchecked")
    private List<FeishuUser> parseUsers(Object items) {
        Logger log = LoggerFactory.getLogger(FeishuUserService.class);
        List<FeishuUser> userList = new ArrayList<>();
        if (!(items instanceof List)) {
            log.warn("解析用户数据失败,items不是列表类型: {}", items);
            return userList;
        }
        List<?> userItems = (List<?>) items;
        log.info("开始解析飞书用户列表,共{}条记录", userItems.size());
        for (Object item : userItems) {
            if (item == null || !(item instanceof Map)) {
                log.warn("跳过无效用户数据项,类型不匹配: {}", item != null ? item.getClass() : "null");
                continue;
            }
            Map<String, Object> userMap = (Map<String, Object>) item;
            FeishuUser user = new FeishuUser();
            // è§£æžopen_id
            user.setOpenId((String) userMap.getOrDefault("open_id", ""));
            // è§£æžname并拆分
            String name = (String) userMap.getOrDefault("name", "");
            if (name.contains(" ")) {
                String[] parts = name.split(" ");
                if (parts.length == 2) {
                    user.setUsername(parts[0].trim()); // å·¥å·éƒ¨åˆ†å­˜åˆ°username
                    user.setRealname(parts[1].trim()); // å§“名部分存到realname
                    user.setWorkNo(parts[0].trim());   // å·¥å·ä¹Ÿå­˜åˆ°workNo
                } else {
                    // æ‹†åˆ†å¼‚常时,默认处理
                    user.setUsername(name);
                    user.setRealname(name);
                    user.setWorkNo("");
                    log.warn("飞书用户name字段格式异常,无法拆分,原始值:{}", name);
                }
            } else {
                user.setUsername(name);
                user.setRealname(name);
                user.setWorkNo("");
                log.warn("飞书用户name字段无空格分隔,无法拆分,原始值:{}", name);
            }
            // è§£æžå…¶ä»–基本信息
            user.setEnName((String) userMap.getOrDefault("en_name", ""));
            user.setDescription((String) userMap.getOrDefault("description", ""));
            Object mobileVisibleObj = userMap.get("mobile_visible");
            user.setMobileVisible(mobileVisibleObj instanceof Boolean ? (Boolean) mobileVisibleObj : false);
            // è§£æžå¤´åƒä¿¡æ¯
            Object avatarObj = userMap.get("avatar");
            if (avatarObj instanceof Map) {
                Map<String, Object> avatarMap = (Map<String, Object>) avatarObj;
                user.setAvatar240((String) avatarMap.getOrDefault("avatar_240", ""));
                user.setAvatar640((String) avatarMap.getOrDefault("avatar_640", ""));
                user.setAvatar72((String) avatarMap.getOrDefault("avatar_72", ""));
                user.setAvatarOrigin((String) avatarMap.getOrDefault("avatar_origin", ""));
            } else {
                log.info("用户[{}]未设置头像或头像格式异常", user.getRealname());
            }
            // è®¾ç½®é»˜è®¤åŠ å¯†å¯†ç ï¼ˆè¿™é‡Œå‡è®¾å¯†ç æ˜¯ç®€å•åŠ å¯†å­˜å‚¨ï¼Œå®žé™…å»ºè®®ç”¨æ›´å®‰å…¨çš„åŠ å¯†æ–¹å¼ï¼‰
            user.setPassword("123456"); // ä½ è¦æ±‚的默认密码
            // å°†open_id存到对应的字段(根据你的用户表结构,假设用户表有open_id字段)
            user.setOpenId((String) userMap.getOrDefault("open_id", ""));
            userList.add(user);
        }
        return userList;
    }
    /**
     * åŒæ­¥å•个飞书用户到系统
     * @param feishuUser é£žä¹¦ç”¨æˆ·
     * @return true表示更新,false表示新增
     *
     * åŽæœŸå¢žåŠ ï¼š ç”¨æˆ·åŒæ­¥å¯¹æ¯”,飞书离职员工需要在本地用户表里面将该用户状态禁用
     */
    private boolean syncFeishuUserToSystem(FeishuUser feishuUser) {
        // è¿™é‡Œæ ¹æ®æ‹†åˆ†åŽçš„username(工号)去查询系统用户
        String username = feishuUser.getUsername();
        SysUser existUser = sysUserService.getUserByName(username);
        SysUser sysUser = new SysUser();
        sysUser.setUsername(username);
        sysUser.setStatus(1);
        sysUser.setDelFlag(0);
        sysUser.setAvatar(feishuUser.getAvatar640());
        sysUser.setRealname(feishuUser.getRealname());
        sysUser.setWorkNo(feishuUser.getWorkNo());
        String password = "123456", salt = oConvertUtils.randomGen(8);
        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
        sysUser.setSalt(salt);
        sysUser.setPassword(passwordEncode);
        sysUser.setOpenId(feishuUser.getOpenId());
        if (existUser == null) {
            sysUserService.addUserWithRole(sysUser, "5");
            log.info("新增用户: {}", username);
            return false;
        } else {
            sysUser.setId(existUser.getId());
            sysUserService.editUser(sysUser);
            log.info("更新用户: {}", username);
            return true;
        }
    }
}
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java
@@ -14,6 +14,7 @@
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.jeecg.modules.sap.request.ProductionOrderSyncRequest;
import org.jeecg.modules.sap.service.OrderBomSync;
import org.jeecg.modules.sap.service.OrderProcessSync;
import org.jeecg.modules.sap.service.ProductionOrderSync;
@@ -106,9 +107,16 @@
                lastSyncDateHigh = null;
            }
        }
        ProductionOrderSyncRequest request = new ProductionOrderSyncRequest();
        request.setFactoryCode(FACTORY_CODE);
        request.setOrderTypeCode(ORDER_TYPE_CODE);
        request.setProductionManager(PRODUCTION_MANAGER);
        request.setOrderStatus(ORDER_STATUS);
        request.setCreateTimeLow(lastSyncDateLow);
        request.setCreateTimeHigh(lastSyncDateHigh);
        try {
            //调用SAP接口获取生产订单
            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(FACTORY_CODE, ORDER_TYPE_CODE, PRODUCTION_MANAGER, ORDER_STATUS, lastSyncDateLow, lastSyncDateHigh, null, null);
            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(request);
            if (productionOrderMap == null || !SUCCESS_CODE.equals(productionOrderMap.get("ztype"))) {
                log.error("未同步到订单信息!日期:{}", LocalDateTime.now());
                return;
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java
@@ -14,6 +14,7 @@
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.jeecg.modules.sap.request.ProductionOrderSyncRequest;
import org.jeecg.modules.sap.service.OrderBomSync;
import org.jeecg.modules.sap.service.OrderProcessSync;
import org.jeecg.modules.sap.service.ProductionOrderSync;
@@ -106,9 +107,16 @@
                lastSyncDateHigh = null;
            }
        }
        ProductionOrderSyncRequest request = new ProductionOrderSyncRequest();
        request.setFactoryCode(FACTORY_CODE);
        request.setOrderTypeCode(ORDER_TYPE_CODE);
        request.setProductionManager(PRODUCTION_MANAGER);
        request.setOrderStatus(ORDER_STATUS);
        request.setUpdateTimeLow(lastSyncDateLow);
        request.setUpdateTimeHigh(lastSyncDateHigh);
        try {
            //调用SAP接口获取生产订单
            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(FACTORY_CODE, ORDER_TYPE_CODE, PRODUCTION_MANAGER, ORDER_STATUS, null, null, lastSyncDateLow, lastSyncDateHigh);
            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(request);
            if (productionOrderMap == null || !SUCCESS_CODE.equals(productionOrderMap.get("ztype"))) {
                log.error("未同步到订单信息!日期:{}", LocalDateTime.now());
                return;
src/main/java/org/jeecg/modules/sap/FunctionConst.java
@@ -13,4 +13,6 @@
    public static final String ZMES_GOODSMVT_CREATE_2301 = "ZMES_GOODSMVT_CREATE_2301";
    //6.生产订单关闭接口
    public static final String ZPPF_019 = "ZPPF_019";
    //7.SAP预留号创建接口
    public static final String ZMES_RESERVATION_CREATE = "ZMES_RESERVATION_CREATE";
}
src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java
@@ -4,15 +4,15 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.sap.request.MaterialRequest;
import org.jeecg.modules.sap.request.OrderLoadRequest;
import org.jeecg.modules.sap.request.OrderReportRequest;
import org.jeecg.modules.sap.request.ProductionOrderSyncRequest;
import org.jeecg.modules.sap.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Api(tags = "SAP集成测试")
@@ -48,71 +48,81 @@
    private OrderLoadService orderLoadService;
    @Autowired
    private OrderCloseService orderCloseService;
//    @ApiOperation(value = "SAP集成测试-测试接口", notes = "SAP集成测试-测试接口")
//    @GetMapping("/test")
//    public Result<?> test() {
//        String test = sapService.test();
//        return Result.ok(test);
//    }
    @Autowired
    private OrderMaterialRequestService orderMaterialRequestService;
    @ApiOperation(value = "SAP集成测试-生产订单同步接口", notes = "SAP集成测试-生产订单同步接口")
    @GetMapping("/syncProductionOrder")
    public Result<?> syncProductionOrder() throws Exception {
        Map<String, Object> resultMap = productionOrderSync.syncProductionOrder(factoryCode, orderTypeCode1, productionManager, orderStatus, null, null, null, null);
    @PostMapping("/syncProductionOrder")
    public Result<?> syncProductionOrder(@RequestBody ProductionOrderSyncRequest request) throws Exception {
//        ProductionOrderSyncRequest request = new ProductionOrderSyncRequest();
//        request.setFactoryCode(factoryCode);
//        request.setOrderTypeCode(orderTypeCode1);
//        request.setProductionManager(productionManager);
//        request.setOrderStatus(orderStatus);
//        request.setOrderCode("10711342");
        Map<String, Object> resultMap = productionOrderSync.syncProductionOrder(request);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-订单BOM同步", notes = "SAP集成测试-订单BOM同步")
    @GetMapping("/syncOrderBom")
    public Result<?> syncOrderBom() throws Exception {
        String orderCode = "10706312,10706988,10708077,10708078,10708825,10711404,10711404,10711543";
    public Result<?> syncOrderBom(@RequestParam(value = "factoryCode") String factoryCode, @RequestParam(value = "orderCode") String orderCode) throws Exception {
//        String orderCode = "10706312,10706988,10708077,10708078,10708825,10711404,10711404,10711543";
        Map<String, Object> resultMap = orderBomSync.syncOrderBom(factoryCode, orderCode);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-订单工序同步", notes = "SAP集成测试-订单工序同步")
    @GetMapping("/syncOrderProcess")
    public Result<?> syncOrderProcess() throws Exception {
        String orderCode = "10706312,10706988,10708077,10708078,10708825,10711404,10711404,10711543";
    public Result<?> syncOrderProcess(@RequestParam(value = "factoryCode") String factoryCode, @RequestParam(value = "orderCode") String orderCode) throws Exception {
//        String orderCode = "10706312,10706988,10708077,10708078,10708825,10711404,10711404,10711543";
        Map<String, Object> resultMap = orderProcessSync.syncOrderProcess(factoryCode, orderCode);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-工序报工", notes = "SAP集成测试-工序报工")
    @GetMapping("/productionOrderReport")
    public Result<?> productionOrderReport() throws Exception {
        OrderReportRequest request = new OrderReportRequest();
        request.setFactoryCode(factoryCode);
        request.setOrderCode("10711404");
        request.setWarehouseCode("7014"); //2# çº¿è¾¹åº“
        request.setProcessCode("0040");
        request.setQualifiedQuantity(new BigDecimal("180"));
        request.setScrapQuantity(new BigDecimal("0"));
        request.setKeyProcess("202505080102");
    @PostMapping("/productionOrderReport")
    public Result<?> productionOrderReport(@RequestBody OrderReportRequest request) throws Exception {
//        OrderReportRequest request10 = new OrderReportRequest();
//        request10.setFactoryCode(factoryCode);
//        request10.setOrderCode("10711404");
//        request10.setWarehouseCode("7014"); //2# çº¿è¾¹åº“
//        request10.setProcessCode("0010");
//        request10.setQualifiedQuantity(new BigDecimal("180"));
//        request10.setScrapQuantity(new BigDecimal("0"));
//        request10.setKeyProcess("202505080101");
//        request10.setBatchNumber("202505080101");
        Map<String, Object> resultMap = orderReportService.productionOrderReport(request);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-生产订单投料", notes = "SAP集成测试-生产订单投料")
    @GetMapping("/productionOrderLoad")
    public Result<?> productionOrderLoad() throws Exception {
        OrderLoadRequest request = new OrderLoadRequest();
        request.setFactoryCode(factoryCode);
        request.setOrderCode("10711404");
        request.setWarehouseCode("7014"); //2# çº¿è¾¹åº“
        request.setMaterialNumber("320013727");
        request.setQuantity(new BigDecimal("180"));
        request.setBatchNumber("202505080102");
    @PostMapping("/productionOrderLoad")
    public Result<?> productionOrderLoad(@RequestBody OrderLoadRequest request) throws Exception {
//        OrderLoadRequest request = new OrderLoadRequest();
//        request.setFactoryCode(factoryCode);
//        request.setOrderCode("10711404");
//        request.setWarehouseCode("7014"); //2# çº¿è¾¹åº“
//        request.setMaterialNumber("320013727");
//        request.setQuantity(new BigDecimal("180"));
//        request.setBatchNumber("202505080102");
        Map<String, Object> resultMap = orderLoadService.productionOrderLoad(request);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-生产订单关闭", notes = "SAP集成测试-生产订单关闭")
    @GetMapping("/productionOrderClose")
    public Result<?> productionOrderClose() throws Exception {
        String orderCode = "10711404";
    public Result<?> productionOrderClose(@RequestParam(value = "orderCode") String orderCode) throws Exception {
//        String orderCode = "10698749";
        Map<String, Object> resultMap = orderCloseService.productionOrderClose(orderCode);
        return Result.ok(resultMap);
    }
    @ApiOperation(value = "SAP集成测试-物料拉动", notes = "SAP集成测试-物料拉动")
    @PostMapping("/orderMaterialRequest")
    public Result<?> orderMaterialRequest(@RequestParam(value = "factoryCode") String factoryCode, @RequestParam(value = "warehouseCode") String warehouseCode, @RequestBody List<MaterialRequest> request) throws Exception {
//        String orderCode = "10698749";
        Map<String, Object> resultMap = orderMaterialRequestService.orderMaterialRequest(factoryCode, warehouseCode, request);
        return Result.ok(resultMap);
    }
}
src/main/java/org/jeecg/modules/sap/dto/MaterialRequestDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.jeecg.modules.sap.dto;
import lombok.Data;
@Data
public class MaterialRequestDTO {
    /** æˆåŠŸæ ‡è®° Y-OK N-NG */
    private String O_IS_OK;
    /** é¢„ç•™/相关需求的编号 */
    private String O_SAP_RESV;
    /** æ¶ˆæ¯æ–‡æœ¬ */
    private String O_MESSAGE;
}
src/main/java/org/jeecg/modules/sap/request/MaterialRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.modules.sap.request;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class MaterialRequest implements Serializable {
    /** ç‰©æ–™å· */
    private String materialNumber;
    /** æ•°é‡ */
    private BigDecimal quantity;
    /** å‘货库存地点 */
    private String warehouseCode;
}
src/main/java/org/jeecg/modules/sap/request/ProductionOrderSyncRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.modules.sap.request;
import lombok.Data;
@Data
public class ProductionOrderSyncRequest {
    private String factoryCode;
    private String orderCode;
    private String orderTypeCode;
    private String productionManager;
    private String orderStatus;
    private String createTimeLow;
    private String createTimeHigh;
    private String updateTimeLow;
    private String updateTimeHigh;
}
src/main/java/org/jeecg/modules/sap/service/OrderMaterialRequestService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.sap.service;
import org.jeecg.modules.sap.request.MaterialRequest;
import java.util.List;
import java.util.Map;
/**
 * ç‰©æ–™æ‹‰åŠ¨ï¼Œé¢„ç•™å·è¯·æ±‚
 */
public interface OrderMaterialRequestService {
    /**
     * ç‰©æ–™æ‹‰åŠ¨è¯·æ±‚
     * @param factoryCode å·¥åŽ‚ç¼–ç 
     * @param receiveWarehouseCode æŽ¥æ”¶åº“存地点
     * @param request ç‰©æ–™æ‹‰åŠ¨ä¿¡æ¯
     * @return
     * @throws Exception
     */
    Map<String, Object> orderMaterialRequest(String factoryCode, String receiveWarehouseCode, List<MaterialRequest> request) throws Exception;
}
src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java
@@ -1,10 +1,12 @@
package org.jeecg.modules.sap.service;
import org.jeecg.modules.sap.request.ProductionOrderSyncRequest;
import java.util.Map;
public interface ProductionOrderSync {
    /**
     * åŒæ­¥ç”Ÿæˆè®¢å•
     */
    Map<String, Object> syncProductionOrder(String factoryCode, String orderTypeCode, String productionManager, String orderStatus, String createTimeLow, String createTimeHigh, String updateTimeLow, String updateTimeHigh) throws Exception;
    Map<String, Object> syncProductionOrder(ProductionOrderSyncRequest request) throws Exception;
}
src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java
@@ -38,8 +38,8 @@
        // æ‰§è¡Œè°ƒç”¨
        function.execute(destination);
        //获取返回结果
        String ztype = function.getExportParameterList().getTable("ZTYPE").toString();
        String zmess = function.getExportParameterList().getTable("ZMESS").toString();
        String ztype = function.getExportParameterList().getValue("ZTYPE").toString();
        String zmess = function.getExportParameterList().getValue("ZMESS").toString();
        resultMap.put("zmess", zmess);
        resultMap.put("ztype", ztype);
src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java
@@ -6,6 +6,7 @@
import org.jeecg.common.constant.ApiLogCategoryEnum;
import org.jeecg.config.sap.SapRfcConnectionManager;
import org.jeecg.modules.sap.FunctionConst;
import org.jeecg.modules.sap.dto.OrderLoadDTO;
import org.jeecg.modules.sap.request.OrderLoadRequest;
import org.jeecg.modules.sap.service.OrderLoadService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -52,15 +53,55 @@
        // æ‰§è¡Œè°ƒç”¨
        function.execute(destination);
        //获取返回结果
        JCoTable eReturn = function.getExportParameterList().getTable("E_RETURN");
        Object eReturn1 = function.getExportParameterList().getValue("E_RETURN");
        OrderLoadDTO reportDTO1 = null;
        if (eReturn1 != null) {
            JCoStructure eReturn = (JCoStructure) eReturn1;
            //E Return
            reportDTO1 = new OrderLoadDTO();
            reportDTO1.setTYPE(eReturn.getString("TYPE"));
            reportDTO1.setID(eReturn.getString("ID"));
            reportDTO1.setNUMBER(eReturn.getString("NUMBER"));
            reportDTO1.setMESSAGE(eReturn.getString("MESSAGE"));
            reportDTO1.setLOG_NO(eReturn.getString("LOG_NO"));
            reportDTO1.setLOG_MSG_NO(eReturn.getString("LOG_MSG_NO"));
            reportDTO1.setMESSAGE_V1(eReturn.getString("MESSAGE_V1"));
            reportDTO1.setMESSAGE_V2(eReturn.getString("MESSAGE_V2"));
            reportDTO1.setMESSAGE_V3(eReturn.getString("MESSAGE_V3"));
            reportDTO1.setMESSAGE_V4(eReturn.getString("MESSAGE_V4"));
            reportDTO1.setPARAMETER(eReturn.getString("PARAMETER"));
            reportDTO1.setROW(eReturn.getString("ROW"));
            reportDTO1.setFIELD(eReturn.getString("FIELD"));
            reportDTO1.setSYSTEM(eReturn.getString("SYSTEM"));
        }
        JCoTable tReturn1 = function.getTableParameterList().getTable("T_RETURN");
        String zmess = "";
        String ztype = "";//S æ ‡è¯† æˆåŠŸ
        OrderLoadDTO reportDTO2 = null;
        if (tReturn1.getNumRows() > 0) {
            tReturn1.setRow(0);
            reportDTO2 = new OrderLoadDTO();
            reportDTO2.setTYPE(tReturn1.getString("TYPE"));
            reportDTO2.setID(tReturn1.getString("ID"));
            reportDTO2.setNUMBER(tReturn1.getString("NUMBER"));
            reportDTO2.setMESSAGE(tReturn1.getString("MESSAGE"));
            reportDTO2.setLOG_NO(tReturn1.getString("LOG_NO"));
            reportDTO2.setLOG_MSG_NO(tReturn1.getString("LOG_MSG_NO"));
            reportDTO2.setMESSAGE_V1(tReturn1.getString("MESSAGE_V1"));
            reportDTO2.setMESSAGE_V2(tReturn1.getString("MESSAGE_V2"));
            reportDTO2.setMESSAGE_V3(tReturn1.getString("MESSAGE_V3"));
            reportDTO2.setMESSAGE_V4(tReturn1.getString("MESSAGE_V4"));
            reportDTO2.setPARAMETER(tReturn1.getString("PARAMETER"));
            reportDTO2.setROW(tReturn1.getString("ROW"));
            reportDTO2.setFIELD(tReturn1.getString("FIELD"));
            reportDTO2.setSYSTEM(tReturn1.getString("SYSTEM"));
        }
        String zmess = reportDTO1 == null ? (reportDTO2 == null ? "" : reportDTO2.getMESSAGE()) : reportDTO1.getMESSAGE();
        String ztype = reportDTO1 == null ? (reportDTO2 == null ? "" : reportDTO2.getTYPE()) : reportDTO1.getTYPE(); //S æ ‡è¯† æˆåŠŸ
        resultMap.put("zmess", zmess);
        resultMap.put("ztype", ztype);
        resultMap.put("importParameters", request);
        resultMap.put("result", null);
        resultMap.put("result", reportDTO1 == null ? reportDTO2 : reportDTO1);
        return resultMap;
    }
}
src/main/java/org/jeecg/modules/sap/service/impl/OrderMaterialRequestServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package org.jeecg.modules.sap.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sap.conn.jco.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.aspect.annotation.ApiLog;
import org.jeecg.common.constant.ApiLogCategoryEnum;
import org.jeecg.config.sap.SapRfcConnectionManager;
import org.jeecg.modules.sap.FunctionConst;
import org.jeecg.modules.sap.dto.MaterialRequestDTO;
import org.jeecg.modules.sap.request.MaterialRequest;
import org.jeecg.modules.sap.service.OrderMaterialRequestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class OrderMaterialRequestServiceImpl implements OrderMaterialRequestService {
    @Autowired
    private SapRfcConnectionManager connectionManager;
    @Autowired
    private ObjectMapper objectMapper;
    @Override
    @ApiLog(apiName = "SAP预留号创建(ZMES_RESERVATION_CREATE)", apiCategory = ApiLogCategoryEnum.SAP)
    public Map<String, Object> orderMaterialRequest(String factoryCode, String receiveWarehouseCode, List<MaterialRequest> request) throws Exception {
        Map<String, Object> resultMap = new HashMap<>();
        JCoDestination destination = connectionManager.getDestination();
        JCoRepository repository = destination.getRepository();
        JCoFunction function = repository.getFunction(FunctionConst.ZMES_RESERVATION_CREATE);
        if (function == null) {
            throw new RuntimeException("RFC å‡½æ•° ZMES_RESERVATION_CREATE æœªæ‰¾åˆ°ï¼");
        }
        if (StringUtils.isBlank(factoryCode) || StringUtils.isBlank(receiveWarehouseCode) || CollectionUtil.isEmpty(request)) {
            resultMap.put("zmess", "工厂编码、接收库存地为空或物料信息为空");
            resultMap.put("ztype", "-1");
            resultMap.put("importParameters", factoryCode + "|" + receiveWarehouseCode + "|" + (request == null ? 0 : request.size()));
            resultMap.put("result", null);
            return resultMap;
        }
        // è®¾ç½®è¾“入参数
        List<JSONObject> items = new ArrayList<>();
        //新火炬
        JCoParameterList importParameterList = function.getImportParameterList();
        importParameterList.setValue("I_SITE", factoryCode);
        //组装请求参数
        JSONObject item = new JSONObject();
        item.put("I_SITE", factoryCode);
        items.add(item);
        //接收库存地
        importParameterList.setValue("I_TO_STORGE_LOC", receiveWarehouseCode);
        //组装请求参数
        item = new JSONObject();
        item.put("I_TO_STORGE_LOC", factoryCode);
        items.add(item);
        JCoTable itemTable = function.getTableParameterList().getTable("T_ITEMS");
        for (MaterialRequest itemReq : request) {
            itemTable.appendRow();
            itemTable.setValue("ITEM", itemReq.getMaterialNumber());
            itemTable.setValue("PULL_QTY", itemReq.getQuantity());
            itemTable.setValue("FROM_STORGE_LOC", itemReq.getWarehouseCode());
            //组装请求参数
            String json = objectMapper.writeValueAsString(itemReq);
            item = JSONObject.parseObject(json, Feature.OrderedField);
            items.add(item);
        }
        // æ‰§è¡Œè°ƒç”¨
        function.execute(destination);
        //获取返回结果
        MaterialRequestDTO response = new MaterialRequestDTO();
        String zmess = function.getExportParameterList().getValue("O_IS_OK").toString();
        String ztype = function.getExportParameterList().getValue("O_MESSAGE").toString();//S æ ‡è¯† æˆåŠŸ
        String resv = function.getExportParameterList().getValue("O_SAP_RESV").toString();//S æ ‡è¯† æˆåŠŸ
        response.setO_IS_OK(ztype);
        response.setO_MESSAGE(zmess);
        response.setO_SAP_RESV(resv);
        //返回结果
        resultMap.put("zmess", zmess);
        resultMap.put("ztype", ztype);
        resultMap.put("importParameters", items);
        resultMap.put("result", response);
        return resultMap;
    }
}
src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java
@@ -1,20 +1,25 @@
package org.jeecg.modules.sap.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.sap.conn.jco.*;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoRepository;
import com.sap.conn.jco.JCoTable;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.aspect.annotation.ApiLog;
import org.jeecg.common.constant.ApiLogCategoryEnum;
import org.jeecg.config.sap.SapRfcConnectionManager;
import org.jeecg.modules.sap.FunctionConst;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.jeecg.modules.sap.service.OrderProcessSync;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java
@@ -6,6 +6,7 @@
import org.jeecg.common.constant.ApiLogCategoryEnum;
import org.jeecg.config.sap.SapRfcConnectionManager;
import org.jeecg.modules.sap.FunctionConst;
import org.jeecg.modules.sap.dto.OrderReportDTO;
import org.jeecg.modules.sap.request.OrderReportRequest;
import org.jeecg.modules.sap.service.OrderReportService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,15 +49,61 @@
        // æ‰§è¡Œè°ƒç”¨
        function.execute(destination);
        //获取返回结果
        JCoTable eReturn = function.getExportParameterList().getTable("E_RETURN");
        Object eReturn1 = function.getExportParameterList().getValue("E_RETURN");
        OrderReportDTO reportDTO1 = null;
        if (eReturn1 != null) {
            JCoStructure eReturn = (JCoStructure) eReturn1;
            //E Return
            reportDTO1 = new OrderReportDTO();
            reportDTO1.setTYPE(eReturn.getString("TYPE"));
            reportDTO1.setID(eReturn.getString("ID"));
            reportDTO1.setNUMBER(eReturn.getString("NUMBER"));
            reportDTO1.setMESSAGE(eReturn.getString("MESSAGE"));
            reportDTO1.setLOG_NO(eReturn.getString("LOG_NO"));
            reportDTO1.setLOG_MSG_NO(eReturn.getString("LOG_MSG_NO"));
            reportDTO1.setMESSAGE_V1(eReturn.getString("MESSAGE_V1"));
            reportDTO1.setMESSAGE_V2(eReturn.getString("MESSAGE_V2"));
            reportDTO1.setMESSAGE_V3(eReturn.getString("MESSAGE_V3"));
            reportDTO1.setMESSAGE_V4(eReturn.getString("MESSAGE_V4"));
            reportDTO1.setPARAMETER(eReturn.getString("PARAMETER"));
            reportDTO1.setROW(eReturn.getString("ROW"));
            reportDTO1.setFIELD(eReturn.getString("FIELD"));
            reportDTO1.setSYSTEM(eReturn.getString("SYSTEM"));
            reportDTO1.setFLG_LOCKED(eReturn.getString("FLG_LOCKED"));
            reportDTO1.setCONF_NO(eReturn.getString("CONF_NO"));
            reportDTO1.setCONF_CNT(eReturn.getString("CONF_CNT"));
        }
        JCoTable tReturn1 = function.getTableParameterList().getTable("T_RETURN");
        String zmess = "";
        String ztype = "";//S æ ‡è¯† æˆåŠŸ
        OrderReportDTO reportDTO2 = null;
        if (tReturn1.getNumRows() > 0) {
            tReturn1.setRow(0);
            reportDTO2 = new OrderReportDTO();
            reportDTO2.setTYPE(tReturn1.getString("TYPE"));
            reportDTO2.setID(tReturn1.getString("ID"));
            reportDTO2.setNUMBER(tReturn1.getString("NUMBER"));
            reportDTO2.setMESSAGE(tReturn1.getString("MESSAGE"));
            reportDTO2.setLOG_NO(tReturn1.getString("LOG_NO"));
            reportDTO2.setLOG_MSG_NO(tReturn1.getString("LOG_MSG_NO"));
            reportDTO2.setMESSAGE_V1(tReturn1.getString("MESSAGE_V1"));
            reportDTO2.setMESSAGE_V2(tReturn1.getString("MESSAGE_V2"));
            reportDTO2.setMESSAGE_V3(tReturn1.getString("MESSAGE_V3"));
            reportDTO2.setMESSAGE_V4(tReturn1.getString("MESSAGE_V4"));
            reportDTO2.setPARAMETER(tReturn1.getString("PARAMETER"));
            reportDTO2.setROW(tReturn1.getString("ROW"));
            reportDTO2.setFIELD(tReturn1.getString("FIELD"));
            reportDTO2.setSYSTEM(tReturn1.getString("SYSTEM"));
            reportDTO2.setFLG_LOCKED(tReturn1.getString("FLG_LOCKED"));
            reportDTO2.setCONF_NO(tReturn1.getString("CONF_NO"));
            reportDTO2.setCONF_CNT(tReturn1.getString("CONF_CNT"));
        }
        String zmess = reportDTO1 == null ? (reportDTO2 == null ? "" : reportDTO2.getMESSAGE()) : reportDTO1.getMESSAGE();
        String ztype = reportDTO1 == null ? (reportDTO2 == null ? "" : reportDTO2.getTYPE()) : reportDTO1.getTYPE(); //S æ ‡è¯† æˆåŠŸ
        resultMap.put("zmess", zmess);
        resultMap.put("ztype", ztype);
        resultMap.put("importParameters", request);
        resultMap.put("result", null);
        resultMap.put("result", reportDTO1 == null ? reportDTO2 : reportDTO1);
        return resultMap;
    }
}
src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java
@@ -1,6 +1,5 @@
package org.jeecg.modules.sap.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoRepository;
@@ -12,6 +11,7 @@
import org.jeecg.config.sap.SapRfcConnectionManager;
import org.jeecg.modules.sap.FunctionConst;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.jeecg.modules.sap.request.ProductionOrderSyncRequest;
import org.jeecg.modules.sap.service.ProductionOrderSync;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -33,7 +33,7 @@
    @Override
    @ApiLog(apiName = "生产订单同步(ZPPF_033_1)", apiCategory = ApiLogCategoryEnum.SAP)
    public Map<String, Object> syncProductionOrder(String factoryCode, String orderTypeCode, String productionManager, String orderStatus, String createTimeLow, String createTimeHigh, String updateTimeLow, String updateTimeHigh) throws Exception {
    public Map<String, Object> syncProductionOrder(ProductionOrderSyncRequest request) throws Exception {
        Map<String, Object> resultMap = new HashMap<>();
        JCoDestination destination = connectionManager.getDestination();
        JCoRepository repository = destination.getRepository();
@@ -43,94 +43,68 @@
        }
        // è®¾ç½®è¾“入参数
        //订单号查询条件
//            JCoTable AUFNRTable = function.getTableParameterList().getTable("ZTAB_AUFNR");
        List<JSONObject> items = new ArrayList<>();
        if (StringUtils.isNotBlank(request.getOrderCode())) {
            JCoTable AUFNRTable = function.getTableParameterList().getTable("ZTAB_AUFNR");
            String[] split = request.getOrderCode().split(",");
            for (String code : split) {
                AUFNRTable.appendRow();
                AUFNRTable.setValue("AUFNR", code);
            }
        }
        //订单类型 æ ‡å‡†ç”Ÿäº§è®¢å•
        if(StringUtils.isNotBlank(orderTypeCode)){
        if (StringUtils.isNotBlank(request.getOrderTypeCode())) {
            JCoTable AUARTTable = function.getTableParameterList().getTable("ZTAB_AUART");
            String[] split = orderTypeCode.split(",");
            String[] split = request.getOrderTypeCode().split(",");
            for(String code : split){
                AUARTTable.appendRow();
                AUARTTable.setValue("AUART", code);
            }
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("AUART", orderTypeCode);
            items.add(item);
        }
        if(StringUtils.isNotBlank(productionManager)){
        if (StringUtils.isNotBlank(request.getProductionManager())) {
            JCoTable FEVORTable = function.getTableParameterList().getTable("ZTAB_FEVOR");
            String[] split = productionManager.split(",");
            String[] split = request.getProductionManager().split(",");
            for(String code : split){
                FEVORTable.appendRow();
                FEVORTable.setValue("FEVOR", code);
            }
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("FEVOR", productionManager);
            items.add(item);
        }
        if(StringUtils.isNotBlank(factoryCode)){
        if (StringUtils.isNotBlank(request.getFactoryCode())) {
            //新火炬
            JCoTable WERKSTable = function.getTableParameterList().getTable("ZTAB_WERKS");
            String[] split = factoryCode.split(",");
            String[] split = request.getFactoryCode().split(",");
            for(String code : split){
                WERKSTable.appendRow();
                WERKSTable.setValue("WERKS", code);
            }
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("WERKS", factoryCode);
            items.add(item);
        }
        if(StringUtils.isNotBlank(orderStatus)) {
        if (StringUtils.isNotBlank(request.getOrderStatus())) {
            //新火炬
            JCoTable TXT04Table = function.getTableParameterList().getTable("ZTAB_TXT04");
            String[] split = orderStatus.split(",");
            String[] split = request.getOrderStatus().split(",");
            for(String code : split){
                TXT04Table.appendRow();
                TXT04Table.setValue("TXT04", code);
            }
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("TXT04", orderStatus);
            items.add(item);
        }
        if(StringUtils.isNotBlank(createTimeLow)){
        if (StringUtils.isNotBlank(request.getCreateTimeLow())) {
            JCoTable UDATETable = function.getTableParameterList().getTable("ZTAB_UDATE");
            UDATETable.appendRow();
            UDATETable.setValue("LOW", createTimeLow);
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("ZTAB_UDATE_LOW", createTimeLow);
            items.add(item);
            UDATETable.setValue("LOW", request.getCreateTimeLow());
        }
        if(StringUtils.isNotBlank(createTimeHigh)){
        if (StringUtils.isNotBlank(request.getCreateTimeHigh())) {
            JCoTable UDATETable = function.getTableParameterList().getTable("ZTAB_UDATE");
            UDATETable.appendRow();
            UDATETable.setValue("HIGH", createTimeHigh);
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("ZTAB_UDATE_HIGH", createTimeHigh);
            items.add(item);
            UDATETable.setValue("HIGH", request.getCreateTimeHigh());
        }
        if(StringUtils.isNotBlank(updateTimeLow)){
        if (StringUtils.isNotBlank(request.getUpdateTimeLow())) {
            JCoTable LAEDATable = function.getTableParameterList().getTable("ZTAB_LAEDA");
            LAEDATable.appendRow();
            LAEDATable.setValue("LOW", updateTimeLow);
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("ZTAB_LAEDA_LOW", updateTimeLow);
            items.add(item);
            LAEDATable.setValue("LOW", request.getUpdateTimeLow());
        }
        if(StringUtils.isNotBlank(updateTimeHigh)){
        if (StringUtils.isNotBlank(request.getUpdateTimeHigh())) {
            JCoTable LAEDATable = function.getTableParameterList().getTable("ZTAB_LAEDA");
            LAEDATable.appendRow();
            LAEDATable.setValue("HIGH", updateTimeLow);
            //组装请求参数
            JSONObject item = new JSONObject();
            item.put("ZTAB_LAEDA_HIGH", updateTimeLow);
            items.add(item);
            LAEDATable.setValue("HIGH", request.getUpdateTimeHigh());
        }
        // æ‰§è¡Œè°ƒç”¨
        function.execute(destination);
@@ -176,7 +150,7 @@
        }
        resultMap.put("zmess", zmess);
        resultMap.put("ztype", ztype);
        resultMap.put("importParameters", items);
        resultMap.put("importParameters", request);
        resultMap.put("result", resultList);
        return resultMap;
    }
src/main/java/org/jeecg/modules/system/entity/SysUser.java
@@ -125,6 +125,12 @@
    @Excel(name = "工号", width = 15)
    private String workNo;
    /**
     * é£žä¹¦id,唯一键
     */
    @Excel(name = "飞书id", width = 15)
    private String openId;
    /**
     * èŒåŠ¡ï¼Œå…³è”èŒåŠ¡è¡¨
     */
src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -363,4 +363,6 @@
     * @return
     */
    IPage<SysUser> getUserByFactoryId(Page<SysUser> page, String factoryId, String username);
    void editUser(SysUser sysUser);
}
src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -832,4 +832,9 @@
    public IPage<SysUser> getUserByFactoryId(Page<SysUser> page, String factoryId, String username) {
        return userMapper.getUserByFactoryId(page,factoryId,username);
    }
    @Override
    public void editUser(SysUser sysUser) {
        userMapper.updateById(sysUser);
    }
}
src/main/java/org/jeecg/modules/wms/CxfClientUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package org.jeecg.modules.wms;
import com.alibaba.fastjson.JSONObject;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import javax.xml.namespace.QName;
/**
 * @author Lius
 * @date 2024/6/11 10:16
 */
public class CxfClientUtil {
    /**
     * åŠ¨æ€è°ƒç”¨
     */
    public static String invokeService(String url, String data, String namespace, String method) throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(url);
        QName opName = new QName(namespace, method);
        Object[] objects = new Object[0];
        try {
            objects = client.invoke(opName, data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String json = JSONObject.toJSONString(objects[0]);
        return json;
    }
}
src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
package org.jeecg.modules.wms.config;
public class WebServiceClientConfig {
}
src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package org.jeecg.modules.wms.config;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class WebServiceServerConfig {
    @Autowired
    private ReceiveWMSScanItemListService receiveWMSScanItemListService;
    @Bean(name = "cxfServer")
    public Bus springBus() {
        return new SpringBus();
    }
    @Bean(name = "cxfServlet")  // æ³¨å…¥servlet bean name不能dispatcherServlet ,否则会覆盖dispatcherServlet
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/webservice/*");
    }
    @Bean
    public Endpoint endpoint() {
        // å‚数二,是SEI实现类对象
        Endpoint endpoint = new EndpointImpl(this.springBus(), receiveWMSScanItemListService);
        // å‘布服务
        endpoint.publish("/userService");
        return endpoint;
    }
}
src/main/java/org/jeecg/modules/wms/dto/WSResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package org.jeecg.modules.wms.dto;
public class WSResponse {
    private String ErrorCode;
    private String ErrorDesc;
}
src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
package org.jeecg.modules.wms.request;
public class ReceiveMESScanItemList {
}
src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package org.jeecg.modules.wms.service;
import javax.jws.WebService;
@WebService
public interface ReceiveWMSScanItemListService {
}
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package org.jeecg.modules.wms.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
@WebService(name = "ReceiveWMSScanItemListService",  targetNamespace = "http://xhj008.server.webservice.com")
@Slf4j
@Service
public class ReceiveWMSScanItemListServiceImpl implements ReceiveWMSScanItemListService {
}
src/main/resources/application-dev.yml
@@ -283,10 +283,8 @@
      client-secret: ??
      agent-id: ??
webservice:
  url: http://localhost:8081/services/EquipmentService?wsdl
  namespace: http://service.server.webservice.example.com
  statusMethod: equipmentStatus
  rateMethod: equipmentRate
  url: http://10.101.0.182:8002/MesWebService/WebService.asmx?wsdl
  namespace: http://tempuri.org/
# SAP RFC方式接口集成
sap:
  rfc:
@@ -300,3 +298,9 @@
    poolSize: 5               # çº¿ç¨‹æ± æ•°é‡
    expirationTime: 10000     # è¿‡æœŸæ—¶é—´
    peekLimit: 10             # å³°å€¼
feishu:
  url: https://open.feishu.cn/
  appId: cli_a74aab6353b7d00e
  appSecret: mx5wm7X9S8WSzZCOYlxcggXTFL8iujIT
  sync:
    departmentId: od-47692f32e6b66cc3985d317fee780a8b
src/main/resources/application-prod.yml
@@ -281,6 +281,9 @@
      # appSecret
      client-secret: ??
      agent-id: ??
webservice:
  url: http://10.101.0.182:8002/MesWebService/WebService.asmx?wsdl
  namespace: http://tempuri.org/
# SAP RFC方式接口集成
sap:
  rfc:
@@ -294,3 +297,9 @@
    poolSize: 5               # çº¿ç¨‹æ± æ•°é‡
    expirationTime: 10000     # è¿‡æœŸæ—¶é—´
    peekLimit: 10             # å³°å€¼
feishu:
  url: https://open.feishu.cn/
  appId: cli_a74aab6353b7d00e
  appSecret: mx5wm7X9S8WSzZCOYlxcggXTFL8iujIT
  sync:
    departmentId: od-47692f32e6b66cc3985d317fee780a8b