ac918503bb5e8fad007348e7e39ba7275b75f334..2b0b64182263d922b946ec898070e59b602382dc
2 天以前 Bang Hu
交易审批多节点问题处理完善
2b0b64 对比 | 目录
2 天以前 p-honggang.li
修改产品类型,单位工程条偶见查询问题
7c2c6a 对比 | 目录
6个文件已修改
126 ■■■■■ 已修改文件
src/main/java/com/webmanage/dto/OrderQueryDTO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/webmanage/mapper/ReportResultSubmissionMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderInfoMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ReportResultSubmissionMapper.xml 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/webmanage/dto/OrderQueryDTO.java
@@ -69,7 +69,10 @@
    private String industryId;
    
    @ApiModelProperty("单位工程ID")
    private String unitProjectId;
    private List<String> unitProjectId;
    @ApiModelProperty("单位工程一级ID")
    private List<String> importantDistrictId;
    
    @ApiModelProperty("产品类型ID")
    private String productTypeId;
src/main/java/com/webmanage/mapper/ReportResultSubmissionMapper.java
@@ -23,7 +23,8 @@
     */
    List<String> selectProductIdsByConditions(
        @Param("industryId") String industryId,
        @Param("unitProjectId") String unitProjectId,
        @Param("unitProjectId") List<String> unitProjectId,
        @Param("importantDistrictId") List<String> importantDistrictId,
        @Param("productTypeId") String productTypeId,
        @Param("productSubTypeId") String productSubTypeId
    );
src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
@@ -214,11 +214,15 @@
                 .map(Object::toString)
                 .collect(Collectors.toList());
        log.info("从工作流服务获取的原始数据: {}", workFlowsList);
        log.info("提取的工作流ID列表: {}", workFlowIds);
        Map<String,String> workFlowIdAndTaskIdMap = workFlowsList.stream()
                .filter(item -> item instanceof Map)
                .map(item -> (Map<?, ?>) item).collect(Collectors.toMap(m -> m.get("processInstanceId").toString(), m -> m.get("taskId").toString(),(k1,k2) -> k2));
        // 执行分页查询
        log.info("执行待审批订单查询,工作流ID列表: {}, 订单状态: {}, 产品名称: {}", workFlowIds, queryDTO.getOrderStatus(), queryDTO.getProductName());
        IPage<OrderInfo> result = baseMapper.selectPendingApprovalOrderPage(
            page, queryDTO.getOrderStatus(), queryDTO.getProductName(), queryDTO.getProviderName(),
            queryDTO.getOrderId(),
@@ -226,6 +230,7 @@
            queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null,
            queryDTO.getOrderBy(), queryDTO.getOrderDirection(), workFlowIds
        );
        log.info("查询结果总数: {}, 当前页记录数: {}", result.getTotal(), result.getRecords().size());
        // 将订单与详情联表封装到VO
        List<OrderDetailVO> voList = result.getRecords().stream().map(order -> {
@@ -256,10 +261,10 @@
    public PageResult<OrderDetailVO> getPendingApprovalOrderPageWithProductConditions(OrderQueryDTO queryDTO) {
        // 根据产品条件查询产品ID列表
        List<String> productIds = null;
        if (StringUtils.hasText(queryDTO.getIndustryId()) || StringUtils.hasText(queryDTO.getUnitProjectId()) ||
        if (StringUtils.hasText(queryDTO.getIndustryId()) || queryDTO.getUnitProjectId() != null ||
            StringUtils.hasText(queryDTO.getProductTypeId()) || StringUtils.hasText(queryDTO.getProductSubTypeId())) {
            productIds = reportResultSubmissionMapper.selectProductIdsByConditions(
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(),
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(), queryDTO.getImportantDistrictId(),
                queryDTO.getProductTypeId(), queryDTO.getProductSubTypeId()
            );
            
@@ -353,10 +358,10 @@
        // 根据产品条件查询产品ID列表
        List<String> productIds = null;
        if (StringUtils.hasText(queryDTO.getIndustryId()) || StringUtils.hasText(queryDTO.getUnitProjectId()) ||
        if (StringUtils.hasText(queryDTO.getIndustryId())  || queryDTO.getUnitProjectId() != null ||
            StringUtils.hasText(queryDTO.getProductTypeId()) || StringUtils.hasText(queryDTO.getProductSubTypeId())) {
            productIds = reportResultSubmissionMapper.selectProductIdsByConditions(
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(),
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(), queryDTO.getImportantDistrictId(),
                queryDTO.getProductTypeId(), queryDTO.getProductSubTypeId()
            );
            
@@ -420,10 +425,10 @@
        // 根据产品条件查询产品ID列表
        List<String> productIds = null;
        if (StringUtils.hasText(queryDTO.getIndustryId()) || StringUtils.hasText(queryDTO.getUnitProjectId()) ||
        if (StringUtils.hasText(queryDTO.getIndustryId()) || queryDTO.getUnitProjectId()!= null ||
            StringUtils.hasText(queryDTO.getProductTypeId()) || StringUtils.hasText(queryDTO.getProductSubTypeId())) {
            productIds = reportResultSubmissionMapper.selectProductIdsByConditions(
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(),
                queryDTO.getIndustryId(), queryDTO.getUnitProjectId(), queryDTO.getImportantDistrictId(),
                queryDTO.getProductTypeId(), queryDTO.getProductSubTypeId()
            );
            
@@ -981,31 +986,51 @@
            }
        }
        // 更新订单状态(通过 -> 下一个;驳回 -> 上一个)
        // 先调用工作流,再依据结果决定是否流转订单状态
        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(orderApprovalDTO.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment);
        String comment = isReject ? "审核驳回" : "审核通过";
        boolean workflowEnded = false;
        if (isReject) {
            // 驳回:调用工作流驳回,并将订单状态回退到上一个状态
            rejectWorkflowTask(orderApprovalDTO.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), orderApprovalDTO.getApprovalOpinion());
            String previousStatus = getPreviousOrderStatus(currentStatus);
            if (previousStatus == null) {
                throw new BusinessException("已是初始状态,无法回退");
            }
            orderInfo.setOrderStatus(previousStatus);
            orderInfo.setUpdatedAt(LocalDateTime.now());
            int updated = this.baseMapper.updateById(orderInfo);
            if (updated <= 0) {
                throw new BusinessException("更新订单状态失败");
            }
            log.info("订单状态回退成功,订单ID: {}, 从 {} 回退为 {}", orderInfo.getOrderId(), currentStatus, previousStatus);
        } else {
            completeWorkflowTask(orderApprovalDTO.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment);
            // 通过:调用完成任务,并读取工作流是否结束
            workflowEnded = completeWorkflowTask(orderApprovalDTO.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), orderApprovalDTO.getApprovalOpinion());
            // 按需流转订单状态:仅当是通过且工作流已结束时,推进到下一个状态
            if (workflowEnded) {
                String targetStatus = getNextOrderStatus(currentStatus);
            if (targetStatus == null) {
                        throw new BusinessException("已是最终状态,无法继续流转");
            }
            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);
            } else {
                log.info("未推进订单状态,原因:isReject={}, workflowEnded={}", isReject, workflowEnded);
            }
        }
        log.info("审批记录添加成功,订单ID: {}, 审批类型: {}, 审批结果: {}, 审批人: {}, 审批意见: {}", 
@@ -1486,7 +1511,7 @@
     * @param userId 用户ID
     * @param comment 审批意见(如:审核通过)
     */
    private void completeWorkflowTask(String taskId, String userId, String comment) {
    private boolean completeWorkflowTask(String taskId, String userId, String comment) {
        try {
            String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getCompleteUrl();
            Map<String, Object> params = new HashMap<>();
@@ -1515,7 +1540,15 @@
                if (data == null) {
                    throw new BusinessException("工作流完成任务失败,返回数据为空");
                }
                log.info("完成工作流任务成功,processinstId: {}", data.get("processinstId"));
                Object isEndedObj = data.get("isEnded");
                boolean isEnded = false;
                if (isEndedObj instanceof Boolean) {
                    isEnded = (Boolean) isEndedObj;
                } else if (isEndedObj != null) {
                    isEnded = "true".equalsIgnoreCase(String.valueOf(isEndedObj));
                }
                log.info("完成工作流任务成功,processinstId: {}, isEnded: {}", data.get("processinstId"), isEnded);
                return isEnded;
            } else {
                throw new BusinessException("工作流完成任务接口调用失败,HTTP状态: " + response.getStatusCode());
            }
src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
@@ -186,7 +186,7 @@
            checkDailyLimitByRule(userId, unitId, userRule, userPointsChange);
        }
        if (applyProvider && providerRule.getIsLimit() != null && providerRule.getIsLimit() == 1) {
            checkDailyLimitByRule(providerId, providerId, providerRule, providerPointsChange);
            checkDailyLimitByRule(providerId, null, providerRule, providerPointsChange);
        }
        // 余额校验(仅在扣减时)
@@ -359,7 +359,7 @@
               .eq("user_id", userId)
//               .eq("data_category", pointsRule.getRuleName())
                .eq("rule_id",pointsRule.getId())
                .eq("data_type", 0)
                // .eq("data_type", 0)
               .ge("flow_time", startOfDay)
               .le("flow_time", endOfDay);
        if(StringUtils.hasText(unitId)){
@@ -377,14 +377,14 @@
        Integer dailyLimit = pointsRule.getDailyLimit();
        if (dailyLimit != null && dailyLimit > 0) {
            // 如果今日累计积分超过每日上限,则抛出异常
            if (Math.abs(todayTotal) >= dailyLimit) {
            if (Math.abs(todayTotal) > dailyLimit) {
                throw new BusinessException("今日该规则积分已达上限: " + dailyLimit);
            }
            
            // 如果加上当前积分会超过每日上限,则抛出异常
            if (Math.abs(todayTotal + currentPoints) > dailyLimit) {
                throw new BusinessException("本次积分操作将超过每日上限: " + dailyLimit + ",当前已累计: " + Math.abs(todayTotal));
            }
//            if (Math.abs(todayTotal + currentPoints) > dailyLimit) {
//                throw new BusinessException("本次积分操作将超过每日上限: " + dailyLimit + ",当前已累计: " + Math.abs(todayTotal));
//            }
        }
    }
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>
@@ -203,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>
src/main/resources/mapper/ReportResultSubmissionMapper.xml
@@ -5,16 +5,25 @@
    <!-- 根据条件查询产品ID列表 -->
    <select id="selectProductIdsByConditions" resultType="java.lang.String">
        SELECT id
        FROM tb_report_result_submission
        FROM tb_report_product_submission
        WHERE deleted = '0'
        <if test="industryId != null and industryId != ''">
            AND industrial_chain_id = #{industryId}
            AND #{industryId} = ANY ( STRING_TO_ARRAY( industrial_chain_id, ',' ) )
        </if>
        <if test="unitProjectId != null and unitProjectId != ''">
            AND important_area_id = #{unitProjectId}
        <if test="unitProjectId != null and unitProjectId.size() > 0">
            AND
            <foreach collection="unitProjectId" item="importantAreaId" open="(" separator="OR" close=")">
                #{importantAreaId} = ANY ( STRING_TO_ARRAY( important_area_id, ',' ) )
            </foreach>
        </if>
        <if test="importantDistrictId != null and importantDistrictId.size() > 0">
            AND
            <foreach collection="importantDistrictId" item="importantDistrictId" open="(" separator="OR" close=")">
                #{importantDistrictId} = ANY ( STRING_TO_ARRAY( important_district_id, ',' ) )
            </foreach>
        </if>
        <if test="productTypeId != null and productTypeId != ''">
            AND type_id = #{productTypeId}
            AND technology_type_id = #{productTypeId}
        </if>
        <if test="productSubTypeId != null and productSubTypeId != ''">
            AND type_child_id = #{productSubTypeId}