Lius
2025-04-15 6a5cb9b11c95fbde3e56a55ea5379b633651d2ad
Oee合格率数据源切换
已添加11个文件
已修改1个文件
440 ■■■■■ 文件已修改
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/MesPartProcessInfoJob.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/dto/MesRcJobreport.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/entity/MdcJcRcJobreport.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/MdcJcRcJobreportMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/MesRcJobreportMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/xml/MdcJcRcJobreportMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/xml/MesRcJobreportMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/IMdcJcRcJobreportService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/MesRcJobreportService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/impl/MdcJcRcJobreportServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/impl/MesRcJobreportServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/MesPartProcessInfoJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,117 @@
package org.jeecg.modules.mdc.job;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import org.jeecg.modules.mdcJc.entity.MdcJcRcJobreport;
import org.jeecg.modules.mdcJc.service.IMdcJcRcJobreportService;
import org.jeecg.modules.mdcJc.service.MesRcJobreportService;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.entity.SysQuartzLog;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.quartz.service.ISysQuartzLogService;
import org.jeecg.modules.system.service.ISysAnnouncementService;
import org.quartz.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @Author: Lius
 * @CreateTime: 2025-04-14
 * @Description: åŒæ­¥MES加工信息(合格率)
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Slf4j
public class MesPartProcessInfoJob implements Job {
    /**
     * è‹¥å‚数变量名修改 QuartzJobController中也需对应修改  æ—¶é—´ï¼š yyyyMMdd ä¾‹ï¼š 20230414
     */
    private String parameter;
    public void setParameter(String parameter) {
        this.parameter = parameter;
    }
    @Resource
    private IQuartzJobService quartzJobService;
    @Resource
    private ISysAnnouncementService sysAnnouncementService;
    @Resource
    private ISysQuartzLogService sysQuartzLogService;
    @Resource
    private IMdcJcRcJobreportService mdcJcRcJobreportService;
    @Resource
    private MesRcJobreportService mesRcJobreportService;
    @Resource
    private IMdcEquipmentService mdcEquipmentService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        log.info("定时获取MES系统加工个数任务 MesPartProcessInfoJob start!  æ—¶é—´:" + DateUtils.getNow());
        long startTime = System.currentTimeMillis();
        try {
            if (StringUtils.isNotBlank(parameter)) {
                String date = "";
                if (StringUtils.isNotBlank(this.parameter)) {
                    date = DateUtils.format(DateUtils.toDate(this.parameter, DateUtils.STRDATE), DateUtils.STR_DATE);
                } else {
                    date = DateUtils.format(DateUtils.getNow(), DateUtils.STR_DATE);
                }
                mdcJcRcJobreportService.remove(new LambdaQueryWrapper<MdcJcRcJobreport>().eq(MdcJcRcJobreport::getTheDate, date));
                //获取设备列表
                List<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list();
                if (mdcEquipmentList != null && !mdcEquipmentList.isEmpty()) {
                    List<String> equipmentIdList = mdcEquipmentList.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
                    List<MesRcJobreport> mesRcJobreportList = mesRcJobreportService.findPartProcessInfo(date, equipmentIdList);
                    if (mesRcJobreportList != null && !mesRcJobreportList.isEmpty()) {
                        List<MdcJcRcJobreport> mdcJcRcJobreportList = new ArrayList<>();
                        for (MesRcJobreport mesRcJobreport : mesRcJobreportList) {
                            MdcJcRcJobreport mdcJcRcJobreport = new MdcJcRcJobreport();
                            mdcJcRcJobreport.setEquipmentId(mesRcJobreport.getDeviceNumber());
                            mdcJcRcJobreport.setOkuqty(mesRcJobreport.getOkuqty().intValue());
                            mdcJcRcJobreport.setProcessCount(mesRcJobreport.getQty().intValue());
                            mdcJcRcJobreport.setTheDate(date);
                            mdcJcRcJobreportList.add(mdcJcRcJobreport);
                        }
                        if (!mdcEquipmentList.isEmpty()) {
                            mdcJcRcJobreportService.saveBatch(mdcJcRcJobreportList);
                        }
                    }
                }
            }
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
            // å‘送消息通知
            sysAnnouncementService.jobSendMessage("定时获取MES系统加工个数任务", quartzLog.getExceptionDetail());
        }
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java
@@ -15,6 +15,7 @@
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.vo.MdcOeeComputeVo;
import org.jeecg.modules.mdc.vo.MdcOeeInfoVo;
import org.jeecg.modules.mdcJc.service.IMdcJcRcJobreportService;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
@@ -45,8 +46,11 @@
    @Resource
    private IMdcDowntimeService mdcDowntimeService;
//    @Resource
//    private IMdcPartProcessInfoService mdcPartProcessInfoService;
    @Resource
    private IMdcPartProcessInfoService mdcPartProcessInfoService;
    private IMdcJcRcJobreportService mdcJcRcJobreportService;
    @Resource
    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
@@ -204,13 +208,17 @@
                    mdcOeeInfo.setTimeActuationRate(timeActuationRate);
                    // æœ‰æ•ˆè¿è¡Œæ—¶é—´ --- æŒ‰éœ€æ±‚维护零件加工总时长||系统主轴负载时间
                    Integer effectiveRunLong = 0;
                    Integer totalProcessLong = mdcPartProcessInfoService.selectTotalProcessLong(equipmentId, validDate);
                    if (totalProcessLong == 0) {
//                    Integer totalProcessLong = mdcPartProcessInfoService.selectTotalProcessLong(equipmentId, validDate);
                        //查询设备运行时间
                        effectiveRunLong = mdcEquipmentStatisticalInfoService.selectProcessLong(equipmentId, validDate.replace("-", ""));
                    } else {
                        effectiveRunLong = totalProcessLong;
                    if (effectiveRunLong == null) {
                        effectiveRunLong = 0;
                    }
//                    if (totalProcessLong == 0) {
//
//                    } else {
//                        effectiveRunLong = totalProcessLong;
//                    }
                    mdcOeeInfo.setEffectiveRunLong(effectiveRunLong);
                    // æ€§èƒ½å¼€åŠ¨çŽ‡ --- æœ‰æ•ˆè¿è¡Œæ—¶é—´/开动时间
                    BigDecimal performanceRate = BigDecimal.ZERO;
@@ -219,10 +227,21 @@
                    }
                    mdcOeeInfo.setPerformanceRate(performanceRate);
                    // åŠ å·¥é›¶ä»¶æ•°é‡ --- æŒ‰ç»´æŠ¤æ•°æ®ç»Ÿè®¡å½“天
                    Integer processCount = mdcPartProcessInfoService.selectTotalProcessCount(equipmentId, validDate);
//                    Integer processCount = mdcPartProcessInfoService.selectTotalProcessCount(equipmentId, validDate);
//                    mdcOeeInfo.setProcessCount(processCount);
//                    // åˆæ ¼é›¶ä»¶æ•°é‡ --- æŒ‰ç»´æŠ¤æ•°æ®ç»Ÿè®¡å½“天
//                    Integer passCount = mdcPartProcessInfoService.selectTotalPassCount(equipmentId, validDate);
//                    mdcOeeInfo.setPassCount(passCount);
//                    // åˆæ ¼çއ --- åˆæ ¼æ•°/加工数
//                    BigDecimal passRate = BigDecimal.ZERO;
//                    if (processCount != 0 && passCount != 0) {
//                        passRate = new BigDecimal(passCount).divide(new BigDecimal(processCount), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
//                    }
                    // åŠ å·¥é›¶ä»¶æ•°é‡
                    Integer processCount = mdcJcRcJobreportService.selectTotalProcessCount(equipmentId, validDate);
                    mdcOeeInfo.setProcessCount(processCount);
                    // åˆæ ¼é›¶ä»¶æ•°é‡ --- æŒ‰ç»´æŠ¤æ•°æ®ç»Ÿè®¡å½“天
                    Integer passCount = mdcPartProcessInfoService.selectTotalPassCount(equipmentId, validDate);
                    // åˆæ ¼é›¶ä»¶æ•°é‡
                    Integer passCount = mdcJcRcJobreportService.selectTotalPassCount(equipmentId, validDate);
                    mdcOeeInfo.setPassCount(passCount);
                    // åˆæ ¼çއ --- åˆæ ¼æ•°/加工数
                    BigDecimal passRate = BigDecimal.ZERO;
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/dto/MesRcJobreport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package org.jeecg.modules.mdcJc.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-04-14
 * @Description:
 */
@Data
public class MesRcJobreport {
    private String billDate;
    private String deviceNumber;
    /**
     * åˆæ ¼æ•°
     */
    private BigDecimal okuqty;
    /**
     * æ€»æ•°
     */
    private BigDecimal qty;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/entity/MdcJcRcJobreport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package org.jeecg.modules.mdcJc.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.system.base.entity.JeecgEntity;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
/**
 * @Description: è®¾å¤‡é›†æˆmes合格率表
 * @Author: jeecg-boot
 * @Date: 2025-04-14
 * @Version: V1.0
 */
@Data
@TableName("mdcJc_rc_jobreport")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "mdcJc_rc_jobreport对象", description = "设备集成mes合格率表")
public class MdcJcRcJobreport extends JeecgEntity implements Serializable {
    /**
     * è®¾å¤‡ç¼–号
     */
    @Excel(name = "设备编号", width = 15)
    @ApiModelProperty(value = "设备编号")
    private String equipmentId;
    /**
     * åŠ å·¥é›¶ä»¶æ•°é‡
     */
    @Excel(name = "加工零件数量", width = 15)
    @ApiModelProperty(value = "加工零件数量")
    private Integer processCount;
    /**
     * åˆæ ¼æ•°é‡
     */
    @Excel(name = "合格数量", width = 15)
    @ApiModelProperty(value = "合格数量")
    private Integer okuqty;
    /**
     * ä¸åˆæ ¼é›¶ä»¶æ•°é‡
     */
    @Excel(name = "不合格零件数量", width = 15)
    @ApiModelProperty(value = "不合格零件数量")
    private Integer nookqty;
    /**
     * æ—¥æœŸ
     */
    @Excel(name = "日期", width = 15)
    @ApiModelProperty(value = "日期")
    private String theDate;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/MdcJcRcJobreportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.mdcJc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import org.jeecg.modules.mdcJc.entity.MdcJcRcJobreport;
import java.util.List;
/**
 * @Description: è®¾å¤‡é›†æˆmes合格率表
 * @Author: Lius
 * @Date: 2025-04-14
 */
public interface MdcJcRcJobreportMapper extends BaseMapper<MdcJcRcJobreport> {
    Integer selectTotalProcessCount(@Param("equipmentId") String equipmentId, @Param("date") String validDate);
    Integer selectTotalPassCount(@Param("equipmentId") String equipmentId, @Param("date") String validDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/MesRcJobreportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package org.jeecg.modules.mdcJc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
/**
 * @Author: Lius
 * @CreateTime: 2025-04-14
 * @Description:
 */
public interface MesRcJobreportMapper extends BaseMapper<MesRcJobreport> {
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/xml/MdcJcRcJobreportMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mdcJc.mapper.MdcJcRcJobreportMapper">
    <select id="selectTotalProcessCount" resultType="java.lang.Integer">
        SELECT okuqty + nookqty FROM mdcJc_rc_jobreport WHERE equipment_id = #{equipmentId} AND the_date = #{date}
    </select>
    <select id="selectTotalPassCount" resultType="java.lang.Integer">
        SELECT okuqty FROM mdcJc_rc_jobreport WHERE equipment_id = #{equipmentId} AND the_date = #{date}
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/mapper/xml/MesRcJobreportMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mdcJc.mapper.MesRcJobreportMapper">
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/IMdcJcRcJobreportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.mdcJc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import org.jeecg.modules.mdcJc.entity.MdcJcRcJobreport;
import java.util.List;
/**
 * @Description: è®¾å¤‡é›†æˆmes合格率表
 * @Author: Lius
 * @Date: 2025-04-14
 */
public interface IMdcJcRcJobreportService extends IService<MdcJcRcJobreport> {
    Integer selectTotalProcessCount(String equipmentId, String validDate);
    Integer selectTotalPassCount(String equipmentId, String validDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/MesRcJobreportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.modules.mdcJc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import java.util.List;
/**
 * @Author: Lius
 * @CreateTime: 2025-04-14
 * @Description:
 */
public interface MesRcJobreportService {
    List<MesRcJobreport> findPartProcessInfo(String date, List<String> equipmentIdList);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/impl/MdcJcRcJobreportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package org.jeecg.modules.mdcJc.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import org.jeecg.modules.mdcJc.entity.MdcJcRcJobreport;
import org.jeecg.modules.mdcJc.mapper.MdcJcRcJobreportMapper;
import org.jeecg.modules.mdcJc.service.IMdcJcRcJobreportService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
/**
 * @Description: è®¾å¤‡é›†æˆmes合格率表
 * @Author: Lius
 * @Date:   2025-04-14
 */
@Service
@Slf4j
public class MdcJcRcJobreportServiceImpl extends ServiceImpl<MdcJcRcJobreportMapper, MdcJcRcJobreport> implements IMdcJcRcJobreportService {
    @Override
    public Integer selectTotalProcessCount(String equipmentId, String validDate) {
        Integer totalProcessCount = this.baseMapper.selectTotalProcessCount(equipmentId, validDate);
        if (totalProcessCount == null) {
            return 0;
        } else {
            return totalProcessCount;
        }
    }
    @Override
    public Integer selectTotalPassCount(String equipmentId, String validDate) {
        Integer totalPassCount = this.baseMapper.selectTotalPassCount(equipmentId, validDate);
        if (totalPassCount == null) {
            return 0;
        } else {
            return totalPassCount;
        }
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdcJc/service/impl/MesRcJobreportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package org.jeecg.modules.mdcJc.service.impl;
import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
import org.jeecg.modules.mdcJc.dto.MesRcJobreport;
import org.jeecg.modules.mdcJc.service.MesRcJobreportService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @Author: Lius
 * @CreateTime: 2025-04-14
 * @Description:
 */
@Service
public class MesRcJobreportServiceImpl implements MesRcJobreportService {
    @Override
    public List<MesRcJobreport> findPartProcessInfo(String date, List<String> equipmentIdList) {
        List<MesRcJobreport> result = new ArrayList<>();
        // ç©ºå‚数检查
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return result;
        }
        // æž„建动态IN子句
        String inClause = String.join(",", Collections.nCopies(equipmentIdList.size(), "?"));
        // æž„建安全SQL(注意WHERE子句的空格)
        String sql = "SELECT the_data AS thedate, " +
                "device_number AS deviceNumber, " +
                "okuqty, qty " +
                "FROM hegelv " +
                "WHERE the_data = ? " +  // ä½¿ç”¨å‚数化查询
                "AND device_number IN (" + inClause + ")";
        // å‡†å¤‡å‚数(日期在前,设备ID在后)
        List<String> params = new ArrayList<>();
        params.add(date);
        params.addAll(equipmentIdList);
        System.out.println("SQL参数: date=" + date + ", equipmentIds=" + equipmentIdList);
        List<Map<String, Object>> mapList = DynamicDBUtil.findList("basicDB", sql, params.toArray());
        if (mapList == null || mapList.isEmpty()) {
            return result;
        }
        result = mapList.stream().map(map -> {
            MesRcJobreport mesRcJobreport = new MesRcJobreport();
            mesRcJobreport.setBillDate(map.get("thedate").toString());
            mesRcJobreport.setDeviceNumber(map.get("deviceNumber").toString());
            mesRcJobreport.setOkuqty(new BigDecimal(map.get("okuqty").toString()));
            mesRcJobreport.setQty(new BigDecimal(map.get("qty").toString()));
            return mesRcJobreport;
        }).collect(Collectors.toList());
        return result;
    }
}