From c71714508fbe3ace3543423c7700d7bbcca90056 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期二, 12 八月 2025 13:41:37 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/org/jeecg/modules/base/service/IFactoryService.java | 6 src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java | 4 src/main/java/org/jeecg/modules/system/entity/SysUser.java | 6 src/main/resources/application-prod.yml | 11 src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java | 40 + pom.xml | 16 src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java | 4 src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java | 4 src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java | 33 + src/main/java/org/jeecg/modules/base/model/FactoryModel.java | 18 src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java | 5 src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java | 4 src/main/resources/application-dev.yml | 12 src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java | 10 src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java | 11 src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java | 14 src/main/java/org/jeecg/modules/base/controller/FactoryController.java | 14 src/main/java/org/jeecg/modules/sap/service/impl/OrderMaterialRequestServiceImpl.java | 96 ++++ src/main/java/org/jeecg/modules/sap/request/MaterialRequest.java | 16 db/双林新火炬MES数据库设计.pdma.json | 61 ++ src/main/java/org/jeecg/modules/sap/service/OrderMaterialRequestService.java | 21 src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java | 24 src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java | 55 ++ src/main/java/org/jeecg/modules/sap/FunctionConst.java | 2 src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java | 49 ++ src/main/java/org/jeecg/modules/system/service/ISysUserService.java | 2 src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java | 88 +-- src/main/java/org/jeecg/modules/wms/CxfClientUtil.java | 32 + src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java | 90 ++- src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java | 327 ++++++++++++++ src/main/java/org/jeecg/common/aspect/ApiLogAspect.java | 8 src/main/java/org/jeecg/modules/mes/entity/FeishuUser.java | 26 + src/main/java/org/jeecg/modules/sap/dto/MaterialRequestDTO.java | 13 src/main/java/org/jeecg/config/Swagger2Config.java | 79 +- src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java | 9 src/main/java/org/jeecg/modules/sap/request/ProductionOrderSyncRequest.java | 16 src/main/java/org/jeecg/modules/wms/dto/WSResponse.java | 6 src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java | 39 + src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java | 6 src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java | 8 40 files changed, 1,113 insertions(+), 172 deletions(-) diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" index 2308f0a..8b3fc7f 100644 --- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" +++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" @@ -2,9 +2,9 @@ "name": "鍙屾灄鏂扮伀鐐琈ES鏁版嵁搴撹璁�", "describe": "鎻忚堪鍙岃柂鏂扮伀鐐琈ES鏁版嵁搴撹璁¤鎯�", "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", diff --git a/pom.xml b/pom.xml index 40acc8d..559fb4f 100644 --- a/pom.xml +++ b/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--> diff --git a/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java b/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java index 9da336c..2651f1a 100644 --- a/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java +++ b/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(); } diff --git a/src/main/java/org/jeecg/config/Swagger2Config.java b/src/main/java/org/jeecg/config/Swagger2Config.java index 1fb1a97..17afa0c 100644 --- a/src/main/java/org/jeecg/config/Swagger2Config.java +++ b/src/main/java/org/jeecg/config/Swagger2Config.java @@ -101,29 +101,6 @@ .groupName("MDC"); } - /** - * swagger2鐨勯厤缃枃浠讹紝杩欓噷鍙互閰嶇疆swagger2鐨勪竴浜涘熀鏈殑鍐呭锛屾瘮濡傛壂鎻忕殑鍖呯瓑绛� 锛圖NC锛� - * - * @return Docket - */ - @Bean(value = "defaultApiDnc") - public Docket defaultApi3() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - //姝ゅ寘璺緞涓嬬殑绫伙紝鎵嶇敓鎴愭帴鍙f枃妗� - .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() - //姝ゅ寘璺緞涓嬬殑绫伙紝鎵嶇敓鎴愭帴鍙f枃妗� - .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() + //姝ゅ寘璺緞涓嬬殑绫伙紝鎵嶇敓鎴愭帴鍙f枃妗� + .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() + //姝ゅ寘璺緞涓嬬殑绫伙紝鎵嶇敓鎴愭帴鍙f枃妗� + .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妯″潡"); } /*** diff --git a/src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java b/src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java index be0c78d..a589c4b 100644 --- a/src/main/java/org/jeecg/modules/andon/controller/AndonButtonConfigController.java +++ b/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); + } + /** * 娣诲姞 * diff --git a/src/main/java/org/jeecg/modules/base/controller/FactoryController.java b/src/main/java/org/jeecg/modules/base/controller/FactoryController.java index 75efb57..cfb5a5a 100644 --- a/src/main/java/org/jeecg/modules/base/controller/FactoryController.java +++ b/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") diff --git a/src/main/java/org/jeecg/modules/base/model/FactoryModel.java b/src/main/java/org/jeecg/modules/base/model/FactoryModel.java new file mode 100644 index 0000000..89c62fa --- /dev/null +++ b/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鍜宻etter鏂规硶 + private String value; // 浜х嚎ID + private String text; // 浜х嚎鍚嶇О + + public FactoryModel() { + } + + public FactoryModel(String value, String text) { + this.value = value; + this.text = text; + } +} diff --git a/src/main/java/org/jeecg/modules/base/service/IFactoryService.java b/src/main/java/org/jeecg/modules/base/service/IFactoryService.java index e89a234..0f2a799 100644 --- a/src/main/java/org/jeecg/modules/base/service/IFactoryService.java +++ b/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(); } diff --git a/src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java b/src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java index 1464018..2307edd 100644 --- a/src/main/java/org/jeecg/modules/base/service/impl/FactoryServiceImpl.java +++ b/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); + } + /** * 鎵撳紑 鐖惰妭鐐� 鍙� 浠ヤ笂鐨刴dc鏍囪 * @param parentId diff --git a/src/main/java/org/jeecg/modules/mes/entity/FeishuUser.java b/src/main/java/org/jeecg/modules/mes/entity/FeishuUser.java new file mode 100644 index 0000000..90ea6d9 --- /dev/null +++ b/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 +} diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java b/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java index 2d2f5fa..be2c9e7 100644 --- a/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java +++ b/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; diff --git a/src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java b/src/main/java/org/jeecg/modules/mes/job/FeishuSyncTask.java new file mode 100644 index 0000000..36e816a --- /dev/null +++ b/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("鏈厤缃涔﹀悓姝ラ儴闂↖D锛岃烦杩囧悓姝ヤ换鍔�"); + } + } catch (Exception e) { + log.error("椋炰功鐢ㄦ埛鍚屾浠诲姟鎵ц澶辫触", e); + throw new JobExecutionException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java b/src/main/java/org/jeecg/modules/mes/job/FeishuUserService.java new file mode 100644 index 0000000..b5b3991 --- /dev/null +++ b/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("鍚屾椋炰功鐢ㄦ埛澶辫触锛岀敤鎴稩D: {}", feishuUser.getUserId(), e); + } + } + + log.info("椋炰功鐢ㄦ埛鍚屾瀹屾垚锛屾�诲鐞�: {}锛屾柊澧�: {}锛屾洿鏂�: {}", successCount, addCount, updateCount); + } catch (Exception e) { + log.error("鍚屾椋炰功閮ㄩ棬鐢ㄦ埛澶辫触锛岄儴闂↖D: {}", 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鍙戦�佽姹傦紝纭繚澶翠俊鎭姝g‘浼犻�� + HttpEntity<String> requestEntity = new HttpEntity<>(headers); + ResponseEntity<String> response = restTemplate.exchange( + urlBuilder.toString(), + HttpMethod.GET, + requestEntity, + String.class + ); + + // 瑙f瀽鍝嶅簲 + JSONObject result = JSONObject.parseObject(response.getBody()); + log.debug("绗瑊}椤礎PI鍝嶅簲: {}", pageNumber, result != null ? result.toJSONString() : "null"); + + if (result != null && result.getInteger("code") == 0) { + JSONObject data = result.getJSONObject("data"); + if (data != null) { + // 瑙f瀽鐢ㄦ埛鍒楄〃 + 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("绗瑊}椤礹as_more: {}, page_token: {}", pageNumber, hasMore, pageToken); + pageNumber++; + } else { + log.warn("绗瑊}椤礵ata涓虹┖", 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; + } + + /** + * 瑙f瀽鐢ㄦ埛鏁版嵁 + */ + /** + * 瑙f瀽鐢ㄦ埛鏁版嵁 + */ + @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("瑙f瀽鐢ㄦ埛鏁版嵁澶辫触锛宨tems涓嶆槸鍒楄〃绫诲瀷: {}", 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(); + // 瑙f瀽open_id + user.setOpenId((String) userMap.getOrDefault("open_id", "")); + // 瑙f瀽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()); // 宸ュ彿涔熷瓨鍒皐orkNo + } 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); + } + // 瑙f瀽鍏朵粬鍩烘湰淇℃伅 + 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); + // 瑙f瀽澶村儚淇℃伅 + 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"); // 浣犺姹傜殑榛樿瀵嗙爜 + // 灏唎pen_id瀛樺埌瀵瑰簲鐨勫瓧娈碉紙鏍规嵁浣犵殑鐢ㄦ埛琛ㄧ粨鏋勶紝鍋囪鐢ㄦ埛琛ㄦ湁open_id瀛楁锛� + user.setOpenId((String) userMap.getOrDefault("open_id", "")); + userList.add(user); + } + + return userList; + } + + /** + * 鍚屾鍗曚釜椋炰功鐢ㄦ埛鍒扮郴缁� + * @param feishuUser 椋炰功鐢ㄦ埛 + * @return true琛ㄧず鏇存柊锛宖alse琛ㄧず鏂板 + * + * 鍚庢湡澧炲姞锛� 鐢ㄦ埛鍚屾瀵规瘮锛岄涔︾鑱屽憳宸ラ渶瑕佸湪鏈湴鐢ㄦ埛琛ㄩ噷闈㈠皢璇ョ敤鎴风姸鎬佺鐢� + */ + 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; + } + } +} diff --git a/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java b/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java index 086a7b1..d81111b 100644 --- a/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncCreationJob.java +++ b/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; @@ -100,15 +101,22 @@ //鑾峰彇涓婃鍚屾鏃堕棿 String lastSyncDateLow = productionOrderService.getLastSyncCreateDate(); String lastSyncDateHigh = null; - if(lastSyncDateLow != null) { + if (lastSyncDateLow != null) { lastSyncDateHigh = DateUtils.format(new Date(), "yyyyMMdd"); - if(lastSyncDateLow.equals(lastSyncDateHigh)) { + if (lastSyncDateLow.equals(lastSyncDateHigh)) { 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; @@ -116,7 +124,7 @@ //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹� Object result = productionOrderMap.get("result"); boolean b = result instanceof List; - if(!b) { + if (!b) { log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass()); return; } @@ -132,13 +140,13 @@ //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹� result = orderBomMap.get("result"); b = result instanceof List; - if(!b) { + if (!b) { log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass()); return; } List<OrderBomDTO> orderBomDTOList = (List<OrderBomDTO>) result; b = processBillMaterialsService.saveOrUpdateOrderBom(orderMap, orderBomDTOList); - if(!b) { + if (!b) { log.error("淇濆瓨璁㈠崟BOM澶辫触锛屾棩鏈燂細{}", LocalDateTime.now()); return; } @@ -151,13 +159,13 @@ //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹� result = orderProcessMap.get("result"); b = result instanceof List; - if(!b) { + if (!b) { log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass()); return; } List<OrderProcessDTO> orderProcessDTOList = (List<OrderProcessDTO>) result; b = materialProcessService.saveOrUpdateOrderProcess(orderMap, orderProcessDTOList); - if(!b) { + if (!b) { log.error("淇濆瓨璁㈠崟宸ュ簭澶辫触锛屾棩鏈燂細{}", LocalDateTime.now()); } quartzLog.setIsSuccess(0); diff --git a/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java b/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java index 93dd7ee..6a7f780 100644 --- a/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java +++ b/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; diff --git a/src/main/java/org/jeecg/modules/sap/FunctionConst.java b/src/main/java/org/jeecg/modules/sap/FunctionConst.java index 68929c6..538be8f 100644 --- a/src/main/java/org/jeecg/modules/sap/FunctionConst.java +++ b/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"; } diff --git a/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java b/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java index 8292c82..8331808 100644 --- a/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java +++ b/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闆嗘垚娴嬭瘯") @@ -34,7 +34,7 @@ private static final String createTime = "20250508"; private static final String updateTime = "20250101"; -// @Autowired + // @Autowired // private SAPService sapService; @Autowired private ProductionOrderSync productionOrderSync; @@ -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); + } } diff --git a/src/main/java/org/jeecg/modules/sap/dto/MaterialRequestDTO.java b/src/main/java/org/jeecg/modules/sap/dto/MaterialRequestDTO.java new file mode 100644 index 0000000..10ce42c --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/sap/request/MaterialRequest.java b/src/main/java/org/jeecg/modules/sap/request/MaterialRequest.java new file mode 100644 index 0000000..9b66962 --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/sap/request/ProductionOrderSyncRequest.java b/src/main/java/org/jeecg/modules/sap/request/ProductionOrderSyncRequest.java new file mode 100644 index 0000000..7538cb6 --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/sap/service/OrderMaterialRequestService.java b/src/main/java/org/jeecg/modules/sap/service/OrderMaterialRequestService.java new file mode 100644 index 0000000..dddf041 --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java b/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java index 52995cb..bb9aed9 100644 --- a/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java +++ b/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; } diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java index 20449a1..e59bde2 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/OrderCloseServiceImpl.java +++ b/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); diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java index f04db7b..d2ee015 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/OrderLoadServiceImpl.java +++ b/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; } } diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/OrderMaterialRequestServiceImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/OrderMaterialRequestServiceImpl.java new file mode 100644 index 0000000..1bf9282 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java index 2fdd666..722bdc1 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/OrderProcessSyncImpl.java +++ b/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 diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java index 8339959..b6603d3 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/OrderReportServiceImpl.java +++ b/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; } } diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java index 960a8c4..2f39fda 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java +++ b/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(","); - for(String code : 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(","); - for(String code : 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(","); - for(String code : 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(","); - for(String code : 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; } diff --git a/src/main/java/org/jeecg/modules/system/entity/SysUser.java b/src/main/java/org/jeecg/modules/system/entity/SysUser.java index 233d20b..3d2db93 100644 --- a/src/main/java/org/jeecg/modules/system/entity/SysUser.java +++ b/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; /** * 鑱屽姟锛屽叧鑱旇亴鍔¤〃 */ diff --git a/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index 3ab96db..f70dfa9 100644 --- a/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/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); } diff --git a/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index 1fd0c21..d605ced 100644 --- a/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/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); + } } diff --git a/src/main/java/org/jeecg/modules/wms/CxfClientUtil.java b/src/main/java/org/jeecg/modules/wms/CxfClientUtil.java new file mode 100644 index 0000000..484d2c9 --- /dev/null +++ b/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; + } + +} diff --git a/src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java b/src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java new file mode 100644 index 0000000..23a94af --- /dev/null +++ b/src/main/java/org/jeecg/modules/wms/config/WebServiceClientConfig.java @@ -0,0 +1,4 @@ +package org.jeecg.modules.wms.config; + +public class WebServiceClientConfig { +} diff --git a/src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java b/src/main/java/org/jeecg/modules/wms/config/WebServiceServerConfig.java new file mode 100644 index 0000000..0c818be --- /dev/null +++ b/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 ,鍚﹀垯浼氳鐩杁ispatcherServlet + public ServletRegistrationBean<CXFServlet> cxfServlet() { + return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/webservice/*"); + } + + @Bean + public Endpoint endpoint() { + // 鍙傛暟浜岋紝鏄疭EI瀹炵幇绫诲璞� + Endpoint endpoint = new EndpointImpl(this.springBus(), receiveWMSScanItemListService); + // 鍙戝竷鏈嶅姟 + endpoint.publish("/userService"); + return endpoint; + } +} diff --git a/src/main/java/org/jeecg/modules/wms/dto/WSResponse.java b/src/main/java/org/jeecg/modules/wms/dto/WSResponse.java new file mode 100644 index 0000000..611bfcd --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java b/src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java new file mode 100644 index 0000000..a6132e0 --- /dev/null +++ b/src/main/java/org/jeecg/modules/wms/request/ReceiveMESScanItemList.java @@ -0,0 +1,4 @@ +package org.jeecg.modules.wms.request; + +public class ReceiveMESScanItemList { +} diff --git a/src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java b/src/main/java/org/jeecg/modules/wms/service/ReceiveWMSScanItemListService.java new file mode 100644 index 0000000..2026d5a --- /dev/null +++ b/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 { + +} diff --git a/src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java b/src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java new file mode 100644 index 0000000..94d8dae --- /dev/null +++ b/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 { +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b365287..84dc636 100644 --- a/src/main/resources/application-dev.yml +++ b/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 \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 48063b6..e28975a 100644 --- a/src/main/resources/application-prod.yml +++ b/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: @@ -293,4 +296,10 @@ lang: ZH # 璇█ poolSize: 5 # 绾跨▼姹犳暟閲� expirationTime: 10000 # 杩囨湡鏃堕棿 - peekLimit: 10 # 宄板�� \ No newline at end of file + peekLimit: 10 # 宄板�� +feishu: + url: https://open.feishu.cn/ + appId: cli_a74aab6353b7d00e + appSecret: mx5wm7X9S8WSzZCOYlxcggXTFL8iujIT + sync: + departmentId: od-47692f32e6b66cc3985d317fee780a8b \ No newline at end of file -- Gitblit v1.9.3