From 1cdccaf0a06161fcc2a5797e617508c8a7e1f300 Mon Sep 17 00:00:00 2001 From: p-honggang.li <p-honggang.li@pcitc.com> Date: 星期六, 06 九月 2025 03:14:53 +0800 Subject: [PATCH] 修改订单创建,发起工作流调用,采用后端处理,增加事务,修改审核同通过和驳回处理,修改根据用户id获取工作流代办信息,再根据代办ids查询订单信息 --- src/main/java/com/webmanage/config/WorkflowProperties.java | 93 +++++++++ src/main/java/com/webmanage/dto/CreateOrderDTO.java | 2 src/main/java/com/webmanage/entity/OrderInfo.java | 7 src/main/resources/mapper/OrderInfoMapper.xml | 16 + src/main/java/com/webmanage/dto/OrderApprovalDTO.java | 4 src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java | 398 +++++++++++++++++++++++++++++++++++++++ src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java | 9 src/main/java/com/webmanage/config/RestTemplateConfig.java | 30 +++ src/main/java/com/webmanage/mapper/OrderInfoMapper.java | 5 src/main/java/com/webmanage/controller/FileController.java | 4 src/main/java/com/webmanage/dto/OrderQueryDTO.java | 8 src/main/resources/application.yml | 23 ++ 12 files changed, 582 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/webmanage/config/RestTemplateConfig.java b/src/main/java/com/webmanage/config/RestTemplateConfig.java new file mode 100644 index 0000000..fcd4df6 --- /dev/null +++ b/src/main/java/com/webmanage/config/RestTemplateConfig.java @@ -0,0 +1,30 @@ +package com.webmanage.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate閰嶇疆绫� + */ +@Configuration +public class RestTemplateConfig { + + @Autowired + private WorkflowProperties workflowProperties; + + @Bean + public RestTemplate restTemplate() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + + // 璁剧疆杩炴帴瓒呮椂鏃堕棿 + factory.setConnectTimeout(workflowProperties.getRestTemplate().getConnectTimeout()); + + // 璁剧疆璇诲彇瓒呮椂鏃堕棿 + factory.setReadTimeout(workflowProperties.getRestTemplate().getReadTimeout()); + + return new RestTemplate(factory); + } +} diff --git a/src/main/java/com/webmanage/config/WorkflowProperties.java b/src/main/java/com/webmanage/config/WorkflowProperties.java new file mode 100644 index 0000000..19ac786 --- /dev/null +++ b/src/main/java/com/webmanage/config/WorkflowProperties.java @@ -0,0 +1,93 @@ +package com.webmanage.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 宸ヤ綔娴侀厤缃睘鎬� + */ +@Data +@Component +@ConfigurationProperties(prefix = "workflow") +public class WorkflowProperties { + + /** + * 瀹℃壒鏈嶅姟閰嶇疆 + */ + private Approval approval = new Approval(); + + /** + * 宸ヤ綔娴佹湇鍔¢厤缃� + */ + private Process process = new Process(); + + /** + * RestTemplate瓒呮椂閰嶇疆 + */ + private RestTemplate restTemplate = new RestTemplate(); + + @Data + public static class Approval { + /** + * 瀹℃壒鏈嶅姟鍩虹URL + */ + private String baseUrl; + + /** + * 妯℃澘鍏崇郴鏌ヨURL + */ + private String templateRelationUrl; + + /** + * 鍗曚綅ID + */ + private String unitId; + } + + @Data + public static class Process { + /** + * 宸ヤ綔娴佹湇鍔″熀纭�URL + */ + private String baseUrl; + + /** + * 鍚姩娴佺▼URL + */ + private String startProcessUrl; + + /** + * 鏌ヨ浠e姙URL + */ + private String findTodoUrl; + + /** + * 鏌ヨ宸插姙URL + */ + private String findDoneUrl; + + /** + * 鎻愪氦娴佺▼URL + */ + private String completeUrl; + + /** + * 椹冲洖娴佺▼URL + */ + private String rejectUrl; + } + + @Data + public static class RestTemplate { + /** + * 杩炴帴瓒呮椂鏃堕棿锛堟绉掞級 + */ + private int connectTimeout = 5000; + + /** + * 璇诲彇瓒呮椂鏃堕棿锛堟绉掞級 + */ + private int readTimeout = 10000; + } +} diff --git a/src/main/java/com/webmanage/controller/FileController.java b/src/main/java/com/webmanage/controller/FileController.java index 429b28b..359011c 100644 --- a/src/main/java/com/webmanage/controller/FileController.java +++ b/src/main/java/com/webmanage/controller/FileController.java @@ -48,8 +48,8 @@ } // 妫�鏌ユ枃浠跺ぇ灏忥紙闄愬埗涓�100MB锛� - if (file.getSize() > 100 * 1024 * 1024) { - return Result.error("鏂囦欢澶у皬涓嶈兘瓒呰繃100MB"); + if (file.getSize() > 500 * 1024 * 1024) { + return Result.error("鏂囦欢澶у皬涓嶈兘瓒呰繃500MB"); } String fileName = minioService.uploadFile(file, folder); diff --git a/src/main/java/com/webmanage/dto/CreateOrderDTO.java b/src/main/java/com/webmanage/dto/CreateOrderDTO.java index 18f8b32..d520ea1 100644 --- a/src/main/java/com/webmanage/dto/CreateOrderDTO.java +++ b/src/main/java/com/webmanage/dto/CreateOrderDTO.java @@ -47,4 +47,6 @@ @Valid @NotEmpty(message = "璁㈠崟鏄庣粏涓嶈兘涓虹┖") private List<CreateOrderItemDTO> items; + + private String processdefId; } diff --git a/src/main/java/com/webmanage/dto/OrderApprovalDTO.java b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java index 3846aba..d7ae141 100644 --- a/src/main/java/com/webmanage/dto/OrderApprovalDTO.java +++ b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java @@ -6,6 +6,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.List; @Data @ApiModel("璁㈠崟瀹℃壒DTO") @@ -34,4 +35,7 @@ @ApiModelProperty("瀹℃壒缁撴灉锛氶�氳繃/椹冲洖") @NotBlank(message = "瀹℃壒缁撴灉涓嶈兘涓虹┖") private String approvalResult; + + @ApiModelProperty("璁㈠崟璇︽儏鍒楄〃") + private List<UpdateOrderDetailDTO.UpdateOrderDetailItemDTO> orderDetails; } diff --git a/src/main/java/com/webmanage/dto/OrderQueryDTO.java b/src/main/java/com/webmanage/dto/OrderQueryDTO.java index 0300db9..99e896e 100644 --- a/src/main/java/com/webmanage/dto/OrderQueryDTO.java +++ b/src/main/java/com/webmanage/dto/OrderQueryDTO.java @@ -5,6 +5,7 @@ import lombok.Data; import java.time.LocalDateTime; +import java.util.List; /** * 璁㈠崟鏌ヨ鏉′欢DTO @@ -75,5 +76,10 @@ @ApiModelProperty("浜у搧绫诲瀷瀛愮骇ID") private String productSubTypeId; - + //宸ヤ綔娴佺被鍨� 0 浠e姙 1 宸插姙 + private Integer workFlowType; + // 娴佺▼瀹炰緥涓氬姟绫诲瀷 + private String businessType; + // 閮ㄩ棬id + private String departmentId; } diff --git a/src/main/java/com/webmanage/entity/OrderInfo.java b/src/main/java/com/webmanage/entity/OrderInfo.java index edf4937..cfc28bc 100644 --- a/src/main/java/com/webmanage/entity/OrderInfo.java +++ b/src/main/java/com/webmanage/entity/OrderInfo.java @@ -147,5 +147,10 @@ */ @TableField("is_evaluate") private String isEvaluate; - + + /** + * 宸ヤ綔娴佷换鍔d + */ + @TableField("task_id") + private String taskId; } diff --git a/src/main/java/com/webmanage/mapper/OrderInfoMapper.java b/src/main/java/com/webmanage/mapper/OrderInfoMapper.java index 1785bdc..89a80cd 100644 --- a/src/main/java/com/webmanage/mapper/OrderInfoMapper.java +++ b/src/main/java/com/webmanage/mapper/OrderInfoMapper.java @@ -42,7 +42,7 @@ @Param("productName") String productName, @Param("providerName") String providerName, @Param("orderId") String orderId, @Param("applyTimeStart") String applyTimeStart, @Param("applyTimeEnd") String applyTimeEnd, @Param("orderBy") String orderBy, - @Param("orderDirection") String orderDirection); + @Param("orderDirection") String orderDirection, @Param("workFlowIds") java.util.List<String> workFlowIds); /** * 鍒嗛〉鏌ヨ寰呭鎵硅鍗曞垪琛紙鏀寔浜у搧鏉′欢锛� @@ -51,7 +51,8 @@ @Param("productName") String productName, @Param("providerName") String providerName, @Param("orderId") String orderId, @Param("applyTimeStart") String applyTimeStart, @Param("applyTimeEnd") String applyTimeEnd, @Param("orderBy") String orderBy, - @Param("orderDirection") String orderDirection, @Param("productIds") java.util.List<String> productIds); + @Param("orderDirection") String orderDirection, @Param("productIds") java.util.List<String> productIds, + @Param("workFlowIds") java.util.List<String> workFlowIds); /** * 鍒嗛〉鏌ヨ涔板璁㈠崟鍒楄〃锛堟敮鎸佷骇鍝佹潯浠讹級 diff --git a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java index 72522e1..7655559 100644 --- a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java @@ -26,23 +26,35 @@ import com.webmanage.service.OrderInfoService; import com.webmanage.service.OrderNoService; import com.webmanage.service.MinioService; +import com.webmanage.config.WorkflowProperties; import com.webmanage.vo.OrderAttachmentVO; import com.webmanage.vo.OrderDetailItemVO; import com.webmanage.vo.OrderDetailVO; import com.webmanage.vo.OrderEvaluationVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpEntity; +import org.springframework.http.MediaType; +import org.springframework.http.HttpHeaders; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import java.util.stream.Collectors; +import java.util.Objects; /** * 璁㈠崟淇℃伅Service瀹炵幇绫� @@ -71,6 +83,12 @@ @Resource private ReportResultSubmissionMapper reportResultSubmissionMapper; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private WorkflowProperties workflowProperties; @Override public PageResult<OrderDetailVO> getBuyerOrderPage(OrderQueryDTO queryDTO) { @@ -167,13 +185,34 @@ // 鍒涘缓鍒嗛〉瀵硅薄 Page<OrderInfo> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize()); + // 鍩轰簬workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎 + List<String> workFlowIds = fetchWorkflowProcessInstanceIds( + queryDTO.getWorkFlowType(), + queryDTO.getUserId(), + queryDTO.getDepartmentId(), + queryDTO.getBusinessType(), + queryDTO.getPageNum(), + queryDTO.getPageSize() + ); + + // 濡傛灉娌℃湁浠讳綍娴佺▼ID锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉 + if (workFlowIds == null || workFlowIds.isEmpty()) { + return new PageResult<OrderDetailVO>( + java.util.Collections.emptyList(), + 0L, + queryDTO.getPageNum().longValue(), + queryDTO.getPageSize().longValue(), + 0L + ); + } + // 鎵ц鍒嗛〉鏌ヨ IPage<OrderInfo> result = baseMapper.selectPendingApprovalOrderPage( page, queryDTO.getOrderStatus(), queryDTO.getProductName(), queryDTO.getProviderName(), queryDTO.getOrderId(), queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null, queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null, - queryDTO.getOrderBy(), queryDTO.getOrderDirection() + queryDTO.getOrderBy(), queryDTO.getOrderDirection(), workFlowIds ); // 灏嗚鍗曚笌璇︽儏鑱旇〃灏佽鍒癡O @@ -227,12 +266,33 @@ Page<OrderInfo> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize()); // 鎵ц鍒嗛〉鏌ヨ + // 鍩轰簬workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎 + List<String> workFlowIds = fetchWorkflowProcessInstanceIds( + queryDTO.getWorkFlowType(), + queryDTO.getUserId(), + queryDTO.getDepartmentId(), + queryDTO.getBusinessType(), + queryDTO.getPageNum(), + queryDTO.getPageSize() + ); + + // 濡傛灉娌℃湁浠讳綍娴佺▼ID锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉 + if (workFlowIds == null || workFlowIds.isEmpty()) { + return new PageResult<OrderInfo>( + java.util.Collections.emptyList(), + 0L, + queryDTO.getPageNum().longValue(), + queryDTO.getPageSize().longValue(), + 0L + ); + } + IPage<OrderInfo> result = baseMapper.selectPendingApprovalOrderPageWithProductConditions( page, queryDTO.getOrderStatus(), queryDTO.getProductName(), queryDTO.getProviderName(), queryDTO.getOrderId(), queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null, queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null, - queryDTO.getOrderBy(), queryDTO.getOrderDirection(), productIds + queryDTO.getOrderBy(), queryDTO.getOrderDirection(), productIds, workFlowIds ); // 鏋勫缓杩斿洖缁撴灉 @@ -432,6 +492,34 @@ } // 鐢熸垚璁㈠崟缂栧彿 String orderId = orderNoService.generateOrderNo(); + + // 鍏堣皟鐢ㄥ伐浣滄祦鎺ュ彛锛岃幏鍙栧伐浣滄祦ID + String workflowId = null; + String taskId = null; + try { + // 妫�鏌ユ槸鍚︽湁浠锋牸绫诲瀷涓�"鍗忚"鐨勬槑缁嗛」 + boolean hasAgreementPrice = createOrderDTO.getItems().stream() + .anyMatch(item -> "鍗忚".equals(item.getPriceType())); + + // 鏍规嵁鏄惁鍖呭惈鍗忚纭畾type鍊� + String type = hasAgreementPrice ? "trade_agreement" : "trade_point"; + + // 璋冪敤鑾峰彇娴佺▼妯℃澘ID鐨勬帴鍙� + // String processTemplateId = getProcessTemplateId(type); + + if (createOrderDTO.getProcessdefId() != null) { + // 璋冪敤鍙戣捣宸ヤ綔娴佺殑鎺ュ彛 + Map<String,Object> resMap = startWorkflowProcess(createOrderDTO.getProcessdefId(), createOrderDTO.getUserId(), type); + workflowId = resMap.get("processinstId").toString(); + taskId = resMap.get("taskId").toString(); + } else { + throw new BusinessException("娴佺▼瀹氫箟Id涓虹┖!"); + } + } catch (Exception e) { + log.error("璋冪敤宸ヤ綔娴佹帴鍙eけ璐ワ紝璁㈠崟ID: {}", orderId, e); + // 宸ヤ綔娴佽皟鐢ㄥけ璐ワ紝鎶涘嚭寮傚父瑙﹀彂浜嬪姟鍥炴粴 + throw new BusinessException("宸ヤ綔娴佽皟鐢ㄥけ璐�: " + e.getMessage()); + } // 璁$畻鎬婚噾棰� BigDecimal totalAmount = BigDecimal.ZERO; @@ -465,6 +553,8 @@ orderInfo.setPaymentStatus("鏈敮浠�"); orderInfo.setBuyerRemarks(createOrderDTO.getBuyerRemarks()); orderInfo.setIsEvaluate("鏈瘎浠�"); + orderInfo.setWorkflowId(workflowId); // 璁剧疆宸ヤ綔娴両D + orderInfo.setTaskId(taskId); orderInfo.setCreatedAt(LocalDateTime.now()); orderInfo.setUpdatedAt(LocalDateTime.now()); @@ -827,6 +917,58 @@ throw new BusinessException("鎻掑叆瀹℃壒璁板綍澶辫触"); } + // 鏇存柊浜ゆ槗淇℃伅澶囨敞锛堝彧鏇存柊remarks锛屼笉鏇存柊璁㈠崟鐘舵�侊級 + // 鍙洿鏂拌鍗曡鎯呭娉紝涓嶆洿鏂拌鍗曠姸鎬� + if(orderApprovalDTO.getOrderDetails() != null) { + for (UpdateOrderDetailDTO.UpdateOrderDetailItemDTO itemDTO : orderApprovalDTO.getOrderDetails()) { + if (itemDTO.getId() == null) { + continue; + } + + OrderDetail orderDetail = orderDetailMapper.selectById(itemDTO.getId()); + if (orderDetail == null) { + log.warn("璁㈠崟璇︽儏涓嶅瓨鍦紝ID: {}", itemDTO.getId()); + continue; + } + + // 鏇存柊澶囨敞 + orderDetail.setRemarks(itemDTO.getRemarks()); + orderDetail.setUpdatedAt(LocalDateTime.now()); + + int detailUpdated = orderDetailMapper.updateById(orderDetail); + if (detailUpdated <= 0) { + log.warn("鏇存柊璁㈠崟璇︽儏澶辫触锛孖D: {}", itemDTO.getId()); + } + } + } + + // 鏇存柊璁㈠崟鐘舵�侊紙閫氳繃 -> 涓嬩竴涓紱椹冲洖 -> 涓婁竴涓級 + String currentStatus = orderInfo.getOrderStatus(); + if (!StringUtils.hasText(currentStatus)) { + throw new BusinessException("璁㈠崟褰撳墠鐘舵�佷负绌�"); + } + boolean isReject = orderApprovalDTO.getApprovalResult().contains("椹冲洖"); + String targetStatus = isReject ? getPreviousOrderStatus(currentStatus) : getNextOrderStatus(currentStatus); + if (targetStatus == null) { + throw new BusinessException((isReject ? "宸叉槸鍒濆鐘舵�侊紝鏃犳硶鍥為��" : "宸叉槸鏈�缁堢姸鎬侊紝鏃犳硶缁х画娴佽浆")); + } + orderInfo.setOrderStatus(targetStatus); + orderInfo.setUpdatedAt(LocalDateTime.now()); + + int updated = this.baseMapper.updateById(orderInfo); + if (updated <= 0) { + throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�"); + } + + log.info("璁㈠崟鐘舵�佹洿鏂版垚鍔燂紝璁㈠崟ID: {}, 浠� {} 鏇存柊涓� {}", orderInfo.getOrderId(), currentStatus, targetStatus); + // 鏍规嵁瀹℃壒缁撴灉璋冪敤鎻愪氦鎴栭┏鍥炴帴鍙� + String comment = orderApprovalDTO.getApprovalResult().contains("椹冲洖") ? "瀹℃牳椹冲洖" : "瀹℃牳閫氳繃"; + if ("瀹℃牳椹冲洖".equals(comment)) { + rejectWorkflowTask(orderInfo.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment); + } else { + completeWorkflowTask(orderInfo.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment); + } + log.info("瀹℃壒璁板綍娣诲姞鎴愬姛锛岃鍗旾D: {}, 瀹℃壒绫诲瀷: {}, 瀹℃壒缁撴灉: {}, 瀹℃壒浜�: {}, 瀹℃壒鎰忚: {}", orderApprovalDTO.getOrderId(), orderApprovalDTO.getApprovalType(), @@ -940,9 +1082,10 @@ private String getNextOrderStatus(String currentStatus) { switch (currentStatus) { case "寰呬笂浼犳枃浠�": - return "寰呮巿鏉�"; + return "寰呭鎵规巿鏉�"; + case "寰呭鎵规巿鏉�": case "寰呮巿鏉�": - return "寰呬氦鏄撶‘璁�"; + return "寰呬氦鏄撶‘璁�"; case "寰呬氦鏄撶‘璁�": return "宸插畬鎴�"; case "宸插畬鎴�": @@ -963,7 +1106,7 @@ switch (currentStatus) { case "寰呬笂浼犳枃浠�": return null; // 鍒濆鐘舵�� - case "寰呮巿鏉�": + case "寰呭鎵规巿鏉�": return "寰呬笂浼犳枃浠�"; case "寰呬氦鏄撶‘璁�": return "寰呮巿鏉�"; @@ -1213,4 +1356,249 @@ orderInfo.setIsEvaluate("宸茶瘎浠�"); return this.updateById(orderInfo); } + + /** + * 鑾峰彇娴佺▼妯℃澘ID + * @param type 绫诲瀷鍙傛暟 + * @return 娴佺▼妯℃澘ID + */ + private String getProcessTemplateId(String type) { + try { + String url = workflowProperties.getApproval().getBaseUrl() + workflowProperties.getApproval().getTemplateRelationUrl(); + + // 鏋勫缓璇锋眰鍙傛暟 + Map<String, Object> params = new HashMap<>(); + params.put("type", type); + params.put("unitId", workflowProperties.getApproval().getUnitId()); + + // 鍙戦�丳OST璇锋眰 + ResponseEntity<Map<String, Object>> response = restTemplate.exchange( + url, + HttpMethod.POST, + new HttpEntity<>(params), + new ParameterizedTypeReference<Map<String, Object>>() {} + ); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { + Map<String, Object> responseBody = response.getBody(); + return (String) responseBody.get("processTemplateId"); + } else { + log.warn("鑾峰彇娴佺▼妯℃澘ID澶辫触锛屽搷搴旂姸鎬�: {}", response.getStatusCode()); + return null; + } + } catch (Exception e) { + log.error("璋冪敤鑾峰彇娴佺▼妯℃澘ID鎺ュ彛澶辫触", e); + throw new BusinessException("鑾峰彇娴佺▼妯℃澘ID澶辫触: " + e.getMessage()); + } + } + + /** + * 鍚姩宸ヤ綔娴佹祦绋� + * @param processTemplateId 娴佺▼妯℃澘ID + * @param userId 鐢ㄦ埛ID + * @param businessKey 涓氬姟閿紙璁㈠崟ID锛� + * @return 娴佺▼瀹炰緥ID + */ + private Map<String,Object> startWorkflowProcess(String processTemplateId, String userId, String businessKey) { + try { + String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getStartProcessUrl(); + + // 鏋勫缓璇锋眰鍙傛暟 + Map<String, Object> params = new HashMap<>(); + params.put("processdefId", processTemplateId); + params.put("userid", userId); + params.put("businessKey", businessKey); + + // 鍙戦�丳OST璇锋眰 + ResponseEntity<Map<String, Object>> response = restTemplate.exchange( + url, + HttpMethod.POST, + new HttpEntity<>(params), + new ParameterizedTypeReference<Map<String, Object>>() {} + ); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { + Object code = response.getBody().get("code"); + boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code)); + if (!ok) { + throw new BusinessException("宸ヤ綔娴佸惎鍔ㄤ换鍔″け璐ワ紝杩斿洖鐮�: " + code); + } + Map<String, Object> data = (Map<String, Object>) response.getBody().get("data"); + if (data == null) { + throw new BusinessException("宸ヤ綔娴佸惎鍔ㄤ换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖"); + } + return data; + } else { + throw new BusinessException("鍚姩宸ヤ綔娴佸け璐ワ紝鍝嶅簲鐘舵��:"+response.getStatusCode()); + } + } catch (Exception e) { + log.error("璋冪敤鍚姩宸ヤ綔娴佹帴鍙eけ璐�", e); + throw new BusinessException("鍚姩宸ヤ綔娴佸け璐�: " + e.getMessage()); + } + } + + /** + * 鎻愪氦娴佺▼浠诲姟 + * @param taskId 浠诲姟ID锛堜娇鐢ㄨ鍗曠殑workflowId锛� + * @param userId 鐢ㄦ埛ID + * @param comment 瀹℃壒鎰忚锛堝锛氬鏍搁�氳繃锛� + */ + private void completeWorkflowTask(String taskId, String userId, String comment) { + try { + String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getCompleteUrl(); + Map<String, Object> params = new HashMap<>(); + params.put("taskId", taskId); + params.put("userid", userId); + params.put("commponet", comment); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers); + + ResponseEntity<Map<String, Object>> response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + new ParameterizedTypeReference<Map<String, Object>>() {} + ); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { + Object code = response.getBody().get("code"); + boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code)); + if (!ok) { + throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔″け璐ワ紝杩斿洖鐮�: " + code); + } + Map<?, ?> data = (Map<?, ?>) response.getBody().get("data"); + if (data == null) { + throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖"); + } + log.info("瀹屾垚宸ヤ綔娴佷换鍔℃垚鍔燂紝processinstId: {}", data.get("processinstId")); + } else { + throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔℃帴鍙h皟鐢ㄥけ璐ワ紝HTTP鐘舵��: " + response.getStatusCode()); + } + } catch (Exception e) { + log.error("鎻愪氦宸ヤ綔娴佸け璐�", e); + throw new BusinessException("鎻愪氦宸ヤ綔娴佸け璐�: " + e.getMessage()); + } + } + + /** + * 椹冲洖娴佺▼浠诲姟 + */ + private void rejectWorkflowTask(String taskId, String userId, String comment) { + try { + String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getRejectUrl(); + Map<String, Object> params = new HashMap<>(); + params.put("taskId", taskId); + params.put("userid", userId); + params.put("commponet", comment); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers); + + ResponseEntity<Map<String, Object>> response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + new ParameterizedTypeReference<Map<String, Object>>() {} + ); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { + Object code = response.getBody().get("code"); + boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code)); + if (!ok) { + throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔″け璐ワ紝杩斿洖鐮�: " + code); + } + Map<?, ?> data = (Map<?, ?>) response.getBody().get("data"); + if (data == null) { + throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖"); + } + log.info("椹冲洖宸ヤ綔娴佷换鍔℃垚鍔燂紝processinstId: {}", data.get("processinstId")); + } else { + throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔℃帴鍙h皟鐢ㄥけ璐ワ紝HTTP鐘舵��: " + response.getStatusCode()); + } + } catch (Exception e) { + log.error("椹冲洖宸ヤ綔娴佸け璐�", e); + throw new BusinessException("椹冲洖宸ヤ綔娴佸け璐�: " + e.getMessage()); + } + } + + /** + * 鎸夌収workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎 + * workFlowType: 0=浠e姙锛�1=宸插姙 + */ + private List<String> fetchWorkflowProcessInstanceIds(Integer workFlowType, String userId, String depId,String businessKey,Integer pageIndex, Integer pageSize) { + try { + if (workFlowType == null) { + return java.util.Collections.emptyList(); + } + + String base = workflowProperties.getProcess().getBaseUrl(); + + Map<String, Object> params = new HashMap<>(); + params.put("userid", userId); + params.put("businessKey", businessKey); + params.put("pageIndex", pageIndex != null ? pageIndex : 1); + params.put("pageSize", pageSize != null ? pageSize : 10); + + String url; + if (workFlowType != null && workFlowType == 0) { + // 浠e姙 + url = base + workflowProperties.getProcess().getFindTodoUrl(); + params.put("depid", depId); + } else { + // 宸插姙 + url = base + workflowProperties.getProcess().getFindDoneUrl(); + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers); + + ResponseEntity<Map<String, Object>> response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + new ParameterizedTypeReference<Map<String, Object>>() {} + ); + + if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) { + return java.util.Collections.emptyList(); + } + Object dataObj = response.getBody().get("data"); + + if (workFlowType != null && workFlowType == 0) { + if (!(dataObj instanceof java.util.List)) { + return java.util.Collections.emptyList(); + } + java.util.List<?> list = (java.util.List<?>) dataObj; + return list.stream() + .filter(item -> item instanceof Map) + .map(item -> (Map<?, ?>) item) + .map(m -> m.get("processInstanceId")) + .filter(Objects::nonNull) + .map(Object::toString) + .collect(Collectors.toList()); + }else { + if (!(dataObj instanceof Map)) { + return java.util.Collections.emptyList(); + } + Map<?,?> map = (Map<?,?>) dataObj; + Object dataObj1 = ((Map<?, ?>) dataObj).get("list"); + java.util.List<?> list = (java.util.List<?>) dataObj1; + return list.stream() + .filter(item -> item instanceof Map) + .map(item -> (Map<?, ?>) item) + .map(m -> m.get("processInstanceId")) + .filter(Objects::nonNull) + .map(Object::toString) + .collect(Collectors.toList()); + } + + } catch (Exception e) { + log.error("鏌ヨ宸ヤ綔娴佸疄渚婭D澶辫触", e); + return java.util.Collections.emptyList(); + } + } } diff --git a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java index 00d5dfd..a75f266 100644 --- a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java +++ b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java @@ -182,10 +182,10 @@ } // 姣忔棩涓婇檺鏍¢獙锛堝垎鍒牎楠岋級 - if (applyUser && userRule.getIsLimit() != null && userRule.getIsLimit() == 0) { + if (applyUser && userRule.getIsLimit() != null && userRule.getIsLimit() == 1) { checkDailyLimitByRule(userId, unitId, userRule, userPointsChange); } - if (applyProvider && providerRule.getIsLimit() != null && providerRule.getIsLimit() == 0) { + if (applyProvider && providerRule.getIsLimit() != null && providerRule.getIsLimit() == 1) { checkDailyLimitByRule(providerId, providerId, providerRule, providerPointsChange); } @@ -357,11 +357,14 @@ QueryWrapper<PointsFlow> wrapper = new QueryWrapper<>(); wrapper.eq("deleted", 0) .eq("user_id", userId) - .eq("unit_id", unitId) // .eq("data_category", pointsRule.getRuleName()) .eq("rule_id",pointsRule.getId()) + .eq("data_type", 0) .ge("flow_time", startOfDay) .le("flow_time", endOfDay); + if(StringUtils.hasText(unitId)){ + wrapper.eq("unit_id", unitId); + } List<PointsFlow> todayFlows = list(wrapper); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 405988c..06f1cb3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,7 +7,7 @@ application: name: trade-back profiles: - active: test + active: prod jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 @@ -70,3 +70,24 @@ thread-name-prefix: async-cart- wait-for-tasks-to-complete-on-shutdown: true await-termination-seconds: 30 + +# 宸ヤ綔娴侀厤缃� +workflow: + # 瀹℃壒鏈嶅姟閰嶇疆 + approval: + base-url: http://192.168.20.51:7098 + template-relation-url: /approval/templateRelation/relationByType + unit-id: "1" + # 宸ヤ綔娴佹湇鍔¢厤缃� + process: + base-url: http://192.168.20.51:7098 + # base-url: http://36.133.126.111:7098 + start-process-url: /app/workflow/startProcessAndComplete + find-todo-url: /app/workflow/findToList + find-done-url: /app/workflow/findHistoryByPage + complete-url: /app/workflow/complete + reject-url: /app/workflow/rejectStartNode + # RestTemplate瓒呮椂閰嶇疆 + rest-template: + connect-timeout: 5000 # 杩炴帴瓒呮椂鏃堕棿锛堟绉掞級 + read-timeout: 10000 # 璇诲彇瓒呮椂鏃堕棿锛堟绉掞級 \ No newline at end of file diff --git a/src/main/resources/mapper/OrderInfoMapper.xml b/src/main/resources/mapper/OrderInfoMapper.xml index c527c0e..9eceefb 100644 --- a/src/main/resources/mapper/OrderInfoMapper.xml +++ b/src/main/resources/mapper/OrderInfoMapper.xml @@ -153,7 +153,7 @@ <include refid="Base_Column_List"/> FROM tb_order_info WHERE deleted = 0 - AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸茶瘎浠�') + AND order_status IN ('寰呬笂浼犳枃浠�', '寰呭鎵规巿鏉�','寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸插彇娑�') <if test="orderStatus != null and orderStatus != ''"> AND order_status = #{orderStatus} </if> @@ -171,6 +171,12 @@ </if> <if test="applyTimeEnd != null and applyTimeEnd != ''"> AND apply_time <= #{applyTimeEnd}::timestamp + </if> + <if test="workFlowIds != null and workFlowIds.size() > 0"> + AND workflow_id IN + <foreach collection="workFlowIds" item="workFlowId" open="(" separator="," close=")"> + #{workFlowId} + </foreach> </if> ORDER BY <choose> @@ -197,7 +203,7 @@ <include refid="Base_Column_List"/> FROM tb_order_info WHERE deleted = 0 - AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸茶瘎浠�') + AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呭鎵规巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸插彇娑�') <if test="orderStatus != null and orderStatus != ''"> AND order_status = #{orderStatus} </if> @@ -222,6 +228,12 @@ #{productId} </foreach> </if> + <if test="workFlowIds != null and workFlowIds.size() > 0"> + AND workflow_id IN + <foreach collection="workFlowIds" item="workFlowId" open="(" separator="," close=")"> + #{workFlowId} + </foreach> + </if> ORDER BY <choose> <when test="orderBy != null and orderBy != ''"> -- Gitblit v1.8.0