qushaowei
2023-12-13 5677ab158fb78d1267c16bbbf29eb690e0b4039f
Merge branch 'master' of http://117.34.109.166:18448/r/mdc_430 into develop
已添加15个文件
已修改40个文件
2248 ■■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcProcessCountDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java 574 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyVo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -91,6 +91,10 @@
    String PREFIX_USER_TOKEN = "prefix_user_token_";
//    /** Token缓存时间:3600秒即一小时 */
//    int  TOKEN_EXPIRE_TIME  = 3600;
    /**
     * Token缓存时间(小时)
     */
    Integer TOKEN_EXPIRE_TIME  = 1;
    /**
     * ç™»å½•二维码
@@ -523,4 +527,49 @@
     */
    String JOB_SEND_MSG = "job_fail_send_msg_role";
    /**
     * é»˜è®¤å¯†ç æœ€å¤§å°è¯•次数
     */
    //Integer MAX_ATTEMPTS = 3;
    /**
     * é»˜è®¤ç”¨æˆ·é”å®šæ—¶é•¿(分钟)
     */
    //Integer USER_FREEZE_TIME = 5;
    /**
     * å¯†ç æœ€å¤§å°è¯•次数的字典编号
     */
    String DICT_MAX_ATTEMPTS = "login_max_attempts";
    /**
     * ç”¨æˆ·ç™»å½•失败锁定时长字典编号
     */
    String DICT_USER_FREEZE = "user_freeze_time";
    /**
     * redis登录次数key
     */
    String PREFIX_LOGIN_COUNT = "prefix_login_count_";
    /**
     * token缓存时间字典编号
     */
    String DICT_TOKEN_EXPIRE_TIME = "token_expire_time";
    /**
     * é»˜è®¤ç”¨æˆ·å¯†ç æ›´æ”¹å‘¨æœŸ(天)
     */
    //Integer PASSWORD_EXPIRATION_PERIOD = 90;
    /**
     * ç”¨æˆ·å¯†ç æ›´æ”¹å‘¨æœŸå­—典编号
     */
    String DICT_PASSWORD_EXPIRATION = "password_expiration_period";
    /**
     * ç”¨æˆ·é¦–次登录强制更改字典编号
     */
    String DICT_USER_FIRST_LOGIN = "user_first_login";
}
lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java
@@ -7,15 +7,6 @@
import com.auth0.jwt.interfaces.DecodedJWT;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Joiner;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CommonConstant;
@@ -28,6 +19,14 @@
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.oConvertUtils;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
/**
 * @Author Scott
 * @Date 2018-07-12 14:23
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -20,7 +20,6 @@
import org.jeecg.config.shiro.filters.JwtFilter;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
@@ -94,6 +93,7 @@
        filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token
        filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览
        filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件
        filterChainDefinitionMap.put("/sys/user/updatePassword", "anon");//首页用户修改密码
        filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //登录二维码
        filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //监听扫码
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
package org.jeecg.modules.mdc.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.modules.mdc.entity.MdcEquipmentOverFlag;
import org.jeecg.modules.mdc.service.IMdcEquipmentOverFlagService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
 * @Description: è®¾å¤‡ç¨‹åºæ‰§è¡Œç»“束标志表
 * @Author: Lius
 * @Date: 2023-12-05
 * @Version: V1.0
 */
@Slf4j
@Api(tags = "设备程序执行结束标志表")
@RestController
@RequestMapping("/mdc/mdcEquipmentOverFlag")
public class MdcEquipmentOverFlagController extends JeecgController<MdcEquipmentOverFlag, IMdcEquipmentOverFlagService> {
    @Resource
    private IMdcEquipmentOverFlagService mdcEquipmentOverFlagService;
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param mdcEquipmentOverFlag
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-分页列表查询")
    @ApiOperation(value = "设备程序执行结束标志表-分页列表查询", notes = "设备程序执行结束标志表-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList(MdcEquipmentOverFlag mdcEquipmentOverFlag,
                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                   HttpServletRequest req) {
        QueryWrapper<MdcEquipmentOverFlag> queryWrapper = QueryGenerator.initQueryWrapper(mdcEquipmentOverFlag, req.getParameterMap());
        Page<MdcEquipmentOverFlag> page = new Page<MdcEquipmentOverFlag>(pageNo, pageSize);
        IPage<MdcEquipmentOverFlag> pageList = mdcEquipmentOverFlagService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
    /**
     * æ·»åŠ 
     *
     * @param mdcEquipmentOverFlag
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-添加")
    @ApiOperation(value = "设备程序执行结束标志表-添加", notes = "设备程序执行结束标志表-添加")
    @PostMapping(value = "/add")
    public Result<?> add(@RequestBody MdcEquipmentOverFlag mdcEquipmentOverFlag) {
        mdcEquipmentOverFlagService.save(mdcEquipmentOverFlag);
        return Result.OK("添加成功!");
    }
    /**
     * ç¼–辑
     *
     * @param mdcEquipmentOverFlag
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-编辑")
    @ApiOperation(value = "设备程序执行结束标志表-编辑", notes = "设备程序执行结束标志表-编辑")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<?> edit(@RequestBody MdcEquipmentOverFlag mdcEquipmentOverFlag) {
        mdcEquipmentOverFlagService.updateById(mdcEquipmentOverFlag);
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-通过id删除")
    @ApiOperation(value = "设备程序执行结束标志表-通过id删除", notes = "设备程序执行结束标志表-通过id删除")
    @DeleteMapping(value = "/delete")
    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
        mdcEquipmentOverFlagService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-批量删除")
    @ApiOperation(value = "设备程序执行结束标志表-批量删除", notes = "设备程序执行结束标志表-批量删除")
    @DeleteMapping(value = "/deleteBatch")
    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.mdcEquipmentOverFlagService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    @AutoLog(value = "设备程序执行结束标志表-通过id查询")
    @ApiOperation(value = "设备程序执行结束标志表-通过id查询", notes = "设备程序执行结束标志表-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
        MdcEquipmentOverFlag mdcEquipmentOverFlag = mdcEquipmentOverFlagService.getById(id);
        return Result.OK(mdcEquipmentOverFlag);
    }
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param mdcEquipmentOverFlag
     */
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, MdcEquipmentOverFlag mdcEquipmentOverFlag) {
        return super.exportXls(request, mdcEquipmentOverFlag, MdcEquipmentOverFlag.class, "设备程序执行结束标志表");
    }
    /**
     * é€šè¿‡excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, MdcEquipmentOverFlag.class);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package org.jeecg.modules.mdc.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.vo.LoginUser;
import org.jeecg.modules.mdc.dto.MdcProcessCountDto;
import org.jeecg.modules.mdc.entity.MdcProcessCount;
import org.jeecg.modules.mdc.service.IProcessCountService;
import org.jeecg.modules.mdc.vo.MdcProcessCountVo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
 * @author Lius
 * @Description: mdc设备加工个数表
 * @date 2023/12/7 16:50
 */
@Slf4j
@Api(tags = "mdc设备加工个数表")
@RestController
@RequestMapping("/mdc/mdcProcessCount")
public class MdcProcessCountController extends JeecgController<MdcProcessCount, IProcessCountService> {
    @Resource
    private IProcessCountService processCountService;
/*    *//**
     * åˆ†é¡µåˆ—表查询
     *
     * @param mdcProcessCountVo
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    @AutoLog(value = "mdc设备加工个数表-分页列表查询")
    @ApiOperation(value = "mdc设备加工个数表-分页列表查询", notes = "mdc设备加工个数表-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList(MdcProcessCountVo mdcProcessCountVo,
                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                   HttpServletRequest req) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        Page<MdcProcessCountDto> page = new Page<MdcProcessCountDto>(pageNo, pageSize);
        IPage<MdcProcessCountDto> pageList = processCountService.pageList(userId, page, mdcProcessCountVo, req);
        return Result.OK(pageList);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java
@@ -228,18 +228,21 @@
        try {
            String workshopId = mdcWorkshopEquipmentVo.getWorkshopId();
            for (String equipmentId : mdcWorkshopEquipmentVo.getEquipmentIdList()) {
                MdcWorkshopEquipment mdcWorkshopEquipment = new MdcWorkshopEquipment();
                mdcWorkshopEquipment.setWorkshopId(workshopId);
                mdcWorkshopEquipment.setEquipmentId(equipmentId);
                mdcWorkshopEquipment.setCoordinateLeft(0);
                mdcWorkshopEquipment.setCoordinateTop(0);
                mdcWorkshopEquipment.setVw(100);
                mdcWorkshopEquipment.setVh(100);
                LambdaQueryWrapper<MdcWorkshopEquipment> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(MdcWorkshopEquipment::getWorkshopId, workshopId).eq(MdcWorkshopEquipment::getEquipmentId, equipmentId);
                MdcWorkshopEquipment one = mdcWorkshopEquipmentService.getOne(queryWrapper);
                if (one == null) {
                    mdcWorkshopEquipmentService.save(mdcWorkshopEquipment);
                List<MdcEquipment> list = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, equipmentId));
                if (list != null && !list.isEmpty()) {
                    MdcWorkshopEquipment mdcWorkshopEquipment = new MdcWorkshopEquipment();
                    mdcWorkshopEquipment.setWorkshopId(workshopId);
                    mdcWorkshopEquipment.setEquipmentId(equipmentId);
                    mdcWorkshopEquipment.setCoordinateLeft(0);
                    mdcWorkshopEquipment.setCoordinateTop(0);
                    mdcWorkshopEquipment.setVw(100);
                    mdcWorkshopEquipment.setVh(100);
                    LambdaQueryWrapper<MdcWorkshopEquipment> queryWrapper = new LambdaQueryWrapper<>();
                    queryWrapper.eq(MdcWorkshopEquipment::getWorkshopId, workshopId).eq(MdcWorkshopEquipment::getEquipmentId, equipmentId);
                    MdcWorkshopEquipment one = mdcWorkshopEquipmentService.getOne(queryWrapper);
                    if (one == null) {
                        mdcWorkshopEquipmentService.save(mdcWorkshopEquipment);
                    }
                }
            }
            return Result.OK("添加成功!");
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java
@@ -17,33 +17,48 @@
    /**
     * åŠ å·¥æ—¶é•¿
     */
    private BigDecimal processLong;
    private BigDecimal processLong = BigDecimal.ZERO;
    /**
     * åˆ©ç”¨çއ
     */
    private BigDecimal utilizationRate;
    private BigDecimal utilizationRate = BigDecimal.ZERO;
    /**
     * å¼€åŠ¨çŽ‡
     */
    private BigDecimal startRate;
    private BigDecimal startRate = BigDecimal.ZERO;
    /**
     * å¼€æœºçއ
     */
    private BigDecimal openRate;
    private BigDecimal openRate = BigDecimal.ZERO;
    /**
     * å¼€æœºæ—¶é•¿
     */
    private BigDecimal openLong;
    private BigDecimal openLong = BigDecimal.ZERO;
    /**
     * å¾…机时长
     */
    private BigDecimal waitLong;
    private BigDecimal waitLong = BigDecimal.ZERO;
    /**
     * å…³æœºæ—¶é•¿
     */
    private BigDecimal closeLong;
    private BigDecimal closeLong = BigDecimal.ZERO;
    /**
     * é¢œè‰²
     */
    private String color;
    public MdcEfficiencyResultDto(String theDate, BigDecimal processLong, BigDecimal utilizationRate, BigDecimal startRate, BigDecimal openRate, BigDecimal openLong, BigDecimal waitLong, BigDecimal closeLong) {
        this.theDate = theDate;
        this.processLong = processLong;
        this.utilizationRate = utilizationRate;
        this.startRate = startRate;
        this.openRate = openRate;
        this.openLong = openLong;
        this.waitLong = waitLong;
        this.closeLong = closeLong;
    }
    public MdcEfficiencyResultDto() {
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java
@@ -17,33 +17,48 @@
    /**
     * åŠ å·¥æ—¶é•¿
     */
    private BigDecimal processLong;
    private BigDecimal processLong = BigDecimal.ZERO;
    /**
     * åˆ©ç”¨çއ
     */
    private BigDecimal utilizationRate;
    private BigDecimal utilizationRate = BigDecimal.ZERO;
    /**
     * å¼€åŠ¨çŽ‡
     */
    private BigDecimal startRate;
    private BigDecimal startRate = BigDecimal.ZERO;
    /**
     * å¼€æœºçއ
     */
    private BigDecimal openRate;
    private BigDecimal openRate = BigDecimal.ZERO;
    /**
     * å¼€æœºæ—¶é•¿
     */
    private BigDecimal openLong;
    private BigDecimal openLong = BigDecimal.ZERO;
    /**
     * å¾…机时长
     */
    private BigDecimal waitLong;
    private BigDecimal waitLong = BigDecimal.ZERO;
    /**
     * å…³æœºæ—¶é•¿
     */
    private BigDecimal closeLong;
    private BigDecimal closeLong = BigDecimal.ZERO;
    /**
     * é¢œè‰²
     */
    private String color;
    public MdcEfficiencyShiftResultDto(String theDate, BigDecimal processLong, BigDecimal utilizationRate, BigDecimal startRate, BigDecimal openRate, BigDecimal openLong, BigDecimal waitLong, BigDecimal closeLong) {
        this.theDate = theDate;
        this.processLong = processLong;
        this.utilizationRate = utilizationRate;
        this.startRate = startRate;
        this.openRate = openRate;
        this.openLong = openLong;
        this.waitLong = waitLong;
        this.closeLong = closeLong;
    }
    public MdcEfficiencyShiftResultDto() {
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentDto.java
@@ -158,20 +158,33 @@
     * lsv2
     */
    //操作模式
    @JSONField(name = "OperationType")
    private String operationType;
    //当前程序
    private String program;
    //程序执行点
    @JSONField(name = "ProgramPosition")
    private String programPosition;
    //快速进给倍率
    @JSONField(name = "Rapidfeed")
    private String rapidfeed;
    //第一个错误号
    @JSONField(name = "FirstErrorNum")
    private String firstErrorNum;
    //第一个错误
    @JSONField(name = "FirstError")
    private String firstError;
    //第二个错误号
    @JSONField(name = "SecondErrorNum")
    private String secondErrorNum;
    //进给倍率
    @JSONField(name = "Ffeed")
    private String fFeed;
    //主轴倍率
    @JSONField(name = "Sfeed")
    private String sFeed;
    //第二个错误
    @JSONField(name = "SecondError")
    private String secondError;
    //X坐标
    private String x;
@@ -186,16 +199,22 @@
    //C坐标
    private String c;
    //错误信息
    @JSONField(name = "Errorinfo")
    private String errorinfo;
    //设备信息
    @JSONField(name = "Equipmentinfo")
    private String equipmentinfo;
    //基础信息
    @JSONField(name = "Basicinfo")
    private String basicinfo;
    //预设数据
    @JSONField(name = "Preinstall")
    private String preinstall;
    //NC正常运行时间
    @JSONField(name = "NCNormalTime")
    private String nCNormalTime;
    //设备正常运行时间
    @JSONField(name = "EquipmentNormalTime")
    private String equipmentNormalTime;
    //    è®¾å¤‡ID
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcProcessCountDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package org.jeecg.modules.mdc.dto;
import lombok.Data;
/**
 * @author Lius
 * @date 2023/12/8 10:38
 */
@Data
public class MdcProcessCountDto {
    private String equipmentId;
    private String equipmentName;
    private String driveType;
    private String theDate;
    private String sequenceNumber;
    private Long duration;
    private Integer processCount;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package org.jeecg.modules.mdc.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: è®¾å¤‡ç¨‹åºæ‰§è¡Œç»“束标志表
 * @Author: Lius
 * @Date: 2023-12-05
 * @Version: V1.0
 */
@Data
@TableName("mdc_equipment_over_flag")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "mdc_equipment_over_flag对象", description = "设备程序执行结束标志表")
public class MdcEquipmentOverFlag extends JeecgEntity implements Serializable {
    /**
     * é©±åŠ¨ç±»åž‹
     */
    @Excel(name = "驱动类型", width = 15)
    @ApiModelProperty(value = "驱动类型")
    private String driveType;
    /**
     * ç»“束标志
     */
    @Excel(name = "结束标志", width = 15)
    @ApiModelProperty(value = "结束标志")
    private String overFlag;
    /**
     * åˆ¤æ–­ç»“束字段
     */
    @Excel(name = "判断结束字段", width = 15)
    @ApiModelProperty(value = "判断结束字段")
    private String overField;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package org.jeecg.modules.mdc.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
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 org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @author Lius
 * @date 2023/11/27 10:57
 */
@Data
@TableName("mdc_process_count")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "mdc_process_count对象", description = "设备加工工件个数表")
public class MdcProcessCount extends JeecgEntity implements Serializable {
    private static final long serialVersionUID = 370474448269945391L;
    /**
     * è®¾å¤‡ç¼–号
     */
    @Excel(name = "设备编号", width = 15)
    @ApiModelProperty(value = "设备编号")
    private String equipmentId;
    /**
     * è®¾å¤‡åç§°
     */
    @Excel(name = "设备名称", width = 20)
    @ApiModelProperty(value = "设备名称")
    private String equipmentName;
    /**
     * æ—¥æœŸ
     */
    @Excel(name = "日期", width = 20, format = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "日期")
    private String theDate;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @Excel(name = "开始时间", width = 20, format = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始时间")
    private Date startTime;
    /**
     * ç»“束时间
     */
    @Excel(name = "结束时间", width = 20, format = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束时间")
    private Date endTime;
    /**
     * æ—¶é•¿
     */
    @Excel(name = "时长", width = 20)
    @ApiModelProperty(value = "时长")
    private Long duration;
    /**
     * ç¨‹åºå·
     */
    @Excel(name = "程序号", width = 20)
    @ApiModelProperty(value = "程序号")
    private String sequenceNumber;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package org.jeecg.modules.mdc.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.mdc.service.IProcessCountService;
import org.jeecg.modules.mdc.util.ThrowableUtil;
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.Date;
import java.util.List;
/**
 * @author Lius
 * @date 2023/11/22 10:17
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Slf4j
public class RunningProcessCountJob implements Job {
    @Resource
    private IQuartzJobService quartzJobService;
    @Resource
    private ISysQuartzLogService sysQuartzLogService;
    @Resource
    private ISysAnnouncementService sysAnnouncementService;
    @Resource
    private IProcessCountService processCountService;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) 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("计算加工工件个数和时间任务 RunningProcessCountJob start!  æ—¶é—´:" + DateUtils.now());
        long startTime = System.currentTimeMillis();
        try {
            processCountService.runningProcessCount();
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
            // å‘送消息通知
            sysAnnouncementService.jobSendMessage("计算加工工件个数和时间任务", 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/mapper/EquipmentLogMapper.java
@@ -14,4 +14,6 @@
    EquipmentLog getRow(@Param("equipmentid") String equipmentid, @Param("startTime") Date startTime);
    Integer selectEquipmentOporation(@Param("equipmentId") String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java
@@ -4,6 +4,7 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.jeecg.modules.mdc.dto.EquipmentMachingDto;
import org.jeecg.modules.mdc.dto.MdcEquipmentDto;
import org.springframework.stereotype.Repository;
@@ -36,4 +37,10 @@
    @InterceptorIgnore(tenantLine = "1")
    @Select("SELECT COUNT(*) FROM SysObjects WHERE XType='U' AND name = '${tableName}'")
    Integer isTableExist(@Param("tableName") String tableName);
    @InterceptorIgnore(tenantLine = "1")
    List<Map<String, Object>> findRunningData(@Param("tableName") String saveTableName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
    @InterceptorIgnore(tenantLine = "1")
    List<EquipmentMachingDto> getEquipProgramNum(@Param("tableName") String saveTableName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java
@@ -28,4 +28,7 @@
    List<String> findShiftSort(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
    Integer computeShiftTimeCount(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
    MdcDeviceCalendar getFirstData(@Param("equipmentId") String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.jeecg.modules.mdc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
/**
 * @Description: è®¾å¤‡ç¨‹åºæ‰§è¡Œç»“束标志表
 * @Author: Lius
 * @Date:   2023-12-05
 * @Version: V1.0
 */
public interface MdcEquipmentOverFlagMapper extends BaseMapper<MdcEquipmentOverFlag> {
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
@@ -65,4 +65,9 @@
     * æ ¹æ®æ—¥æœŸæŸ¥è¯¢æ•°é‡
     */
    Integer findAlarmCountByDate(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("vo") MdcAlarmAnalyzeQueryVo vo);
    /**
     * æŸ¥è¯¢æ—¶é—´æ®µå†…运行数据
     */
    List<MdcEquipmentRunningSection> selectRunningData(@Param("equipmentId") String equipmentId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package org.jeecg.modules.mdc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mdc.dto.MdcProcessCountDto;
import org.jeecg.modules.mdc.entity.MdcProcessCount;
import org.jeecg.modules.mdc.vo.MdcProcessCountVo;
/**
 * @author Lius
 * @date 2023/11/27 11:07
 */
public interface MdcProcessCountMapper extends BaseMapper<MdcProcessCount> {
    MdcProcessCount getLastData(@Param("equipmentId") String equipmentId);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param mdcProcessCountVo
     * @return
     */
    IPage<MdcProcessCountDto> pageList(Page<MdcProcessCountDto> page, @Param("mdcProcessCountVo") MdcProcessCountVo mdcProcessCountVo);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java
@@ -31,4 +31,6 @@
     * @return
     */
    IPage<MdcTorqueConfig> pageList(IPage<MdcTorqueConfig> pageData, @Param("mdcTorqueConfig") MdcTorqueConfig mdcTorqueConfig);
    MdcTorqueConfig findLast(@Param("equipmentId") String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml
@@ -5,4 +5,8 @@
    <select id="getRow" resultType="org.jeecg.modules.mdc.entity.EquipmentLog">
        SELECT top 1 * FROM EquipmentLog WHERE EquipmentID = #{ equipmentid } AND CollectTime &lt;= #{ startTime } AND Oporation in ('0','1','2','3') ORDER BY CollectTime ASC
    </select>
    <select id="selectEquipmentOporation" resultType="java.lang.Integer">
        SELECT TOP 1 Oporation FROM EquipmentLog WHERE EquipmentID = #{ equipmentId } ORDER BY CollectTime DESC
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml
@@ -5,4 +5,12 @@
    <select id="getMacingDataList" resultType="org.jeecg.modules.mdc.dto.MdcEquipmentDto">
        select top 1 [${tableName}].* from [${tableName}] order by CollectTime  desc
    </select>
    <select id="findRunningData" resultType="java.util.Map">
        select [${tableName}].* from [${tableName}] where CollectTime between #{ startTime } AND #{ endTime } order by CollectTime  asc
    </select>
    <select id="getEquipProgramNum" resultType="org.jeecg.modules.mdc.dto.EquipmentMachingDto">
        select Programnumber,CollectTime from [${tableName}] where CollectTime &gt; #{startTime} and CollectTime &lt;= #{endTime} and Programnumber is not null
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml
@@ -52,12 +52,15 @@
            t3.sleep_start_date,
            t3.sleep_end_date,
            t3.is_day_span,
            t4.equipment_name
            t4.equipment_name,
            t5.start_time overtimeStartTime,
            t5.end_time overtimeEndTime
        FROM
            mdc_device_calendar t1
            LEFT JOIN mdc_shift t2 ON t1.shift_id = t2.id
            LEFT JOIN mdc_shift_sub t3 ON t1.shift_sub_id = t3.id
            LEFT JOIN mdc_equipment t4 ON t1.equipment_id = t4.equipment_id
            LEFT JOIN mdc_equipment_overtime t5 ON t5.calendar_id = t1.id
        <where>
            <if test="equipmentId != null and equipmentId != ''">
                AND t4.equipment_id = #{ equipmentId }
@@ -117,4 +120,8 @@
            AND equipment_id = #{ equipmentId }
    </select>
    <select id="getFirstData" resultType="org.jeecg.modules.mdc.entity.MdcDeviceCalendar">
        SELECT TOP 1 * FROM mdc_device_calendar WHERE equipment_id = #{ equipmentId } ORDER BY effective_date ASC
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
@@ -25,6 +25,9 @@
        WHERE
            t1.the_date &lt;= #{ vo.endTime }
            AND t1.the_date &gt;= #{ vo.startTime }
        <if test="vo.equipmentType != null and vo.equipmentType != '' ">
            AND t2.equipment_type = #{ vo.equipmentType }
        </if>
        <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
            AND t2.equipment_id IN
            <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
@@ -60,6 +63,9 @@
        WHERE
            t1.the_date &lt;= #{ vo.endTime }
            AND t1.the_date &gt;= #{ vo.startTime }
        <if test="vo.equipmentType != null and vo.equipmentType != '' ">
            AND t2.equipment_type = #{ vo.equipmentType }
        </if>
        <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
            AND t2.equipment_id IN
            <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
@@ -101,6 +107,9 @@
            <if test="vo.shiftSubId != null and vo.shiftSubId != ''">
                AND t1.shift_sub_id = #{ vo.shiftSubId }
            </if>
            <if test="vo.equipmentType != null and vo.equipmentType != '' ">
                AND t2.equipment_type = #{ vo.equipmentType }
            </if>
        </where>
        GROUP BY
            t2.equipment_id,
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -168,7 +168,7 @@
                #{id}
            </foreach>
        </where>
        ORDER BY me.equipment_id
        ORDER BY sd.depart_order
    </select>
    <!--根据设备编号查询设备信息和产线信息-->
@@ -191,7 +191,7 @@
                #{id}
            </foreach>
        </where>
        ORDER BY me.equipment_id
        ORDER BY mp.production_order
    </select>
    <!--根据大屏车间id查询设备列表-->
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.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.mdc.mapper.MdcEquipmentOverFlagMapper">
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
@@ -125,5 +125,19 @@
        </where>
    </select>
    <!--查询时间段内运行数据-->
    <select id="selectRunningData" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection">
        SELECT
            *
        FROM
            mdc_equipment_running_section
        WHERE
            equipment_id = #{ equipmentId }
          AND status = '3'
          AND  (start_time &lt;= #{ endDate } AND end_time &gt;= #{ startDate })
        ORDER BY
            start_time
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
<?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.mdc.mapper.MdcProcessCountMapper">
    <select id="getLastData" resultType="org.jeecg.modules.mdc.entity.MdcProcessCount">
        SELECT TOP 1 * FROM mdc_process_count WHERE equipment_id = #{equipmentId} ORDER BY the_date DESC
    </select>
    <!--分页查询-->
    <select id="pageList" resultType="org.jeecg.modules.mdc.dto.MdcProcessCountDto">
        SELECT
            t1.equipment_id equipmentId,
            MAX(t1.equipment_name) equipmentName,
            MAX(t2.drive_type) driveType,
            t1.the_date theDate,
            t1.sequence_number sequenceNumber,
            COUNT(*) processCount,
            SUM(t1.duration) duration
        FROM
            mdc_process_count t1
            LEFT JOIN mdc_equipment t2 ON t1.equipment_id = t2.equipment_id
        <where>
            <if test="mdcProcessCountVo.equipmentId != null and mdcProcessCountVo.equipmentId != ''">
                AND t1.equipment_id = #{ mdcProcessCountVo.equipmentId }
            </if>
            <if test="mdcProcessCountVo.equipmentName != null and mdcProcessCountVo.equipmentName != ''">
                AND t1.equipment_name LIKE CONCAT(CONCAT('%',#{mdcProcessCountVo.equipmentName}),'%')
            </if>
            <if test="mdcProcessCountVo.driveType != null and mdcProcessCountVo.driveType != ''">
                AND t2.drive_type = #{ mdcProcessCountVo.driveType }
            </if>
            <if test="mdcProcessCountVo.startTime != null and mdcProcessCountVo.startTime != '' and mdcProcessCountVo.endTime != '' and mdcProcessCountVo.endTime != null">
                AND t1.the_date BETWEEN #{ mdcProcessCountVo.startTime } AND #{ mdcProcessCountVo.endTime }
            </if>
            <if test="mdcProcessCountVo.mdcSectionIds != null and mdcProcessCountVo.mdcSectionIds.size() > 0 ">
                AND t1.equipment_id IN
                <foreach collection="mdcProcessCountVo.mdcSectionIds" item="id" index="index" open="(" close=")" separator=",">
                    #{ id }
                </foreach>
            </if>
        </where>
        GROUP BY
            t1.equipment_id,
            t1.the_date,
            t1.sequence_number
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml
@@ -28,4 +28,15 @@
            ORDER BY torque_date ASC
        </where>
    </select>
    <select id="findLast" resultType="org.jeecg.modules.mdc.entity.MdcTorqueConfig">
        SELECT TOP
            1 *
        FROM
            mdc_torque_config
        WHERE
            equipment_id = #{ equipmentId }
        ORDER BY
            torque_date DESC
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java
@@ -26,4 +26,6 @@
     * èŽ·å–è®¾å¤‡æŸä¸ªæ—¶é—´ç‚¹ä¹‹åŽçš„æœ€æ–°ä¸€æ¡æ•°æ®
     */
    EquipmentLog getRow(String equipmentid, Date startTime);
    Integer selectEquipmentOporation(String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java
@@ -5,6 +5,7 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @author: LiuS
@@ -25,4 +26,19 @@
     * åˆ¤æ–­è¡¨æ˜¯å¦å­˜åœ¨
     */
    Boolean isTableExist(String tableName);
    /**
     * æŸ¥è¯¢ä¸€æ®µæ—¶é—´å†…的数据
     */
    List<Map<String, Object>> findRunningData(String tableName, Date startTime, Date endTime);
    /**
     * æŸ¥æ‰¾æ³•兰克设备运行的程序号
     * @param drivetype
     * @param equipmentid
     * @param startTime
     * @param endTime
     * @return
     */
    List<EquipmentMachingDto> getEquipProgramNum(String drivetype, String equipmentid, Date startTime, Date endTime);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
@@ -70,4 +70,5 @@
     */
    void generateDeviceCalendar();
    MdcDeviceCalendar getFirstData(String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.jeecg.modules.mdc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
/**
 * @Description: è®¾å¤‡ç¨‹åºæ‰§è¡Œç»“束标志表
 * @Author: Lius
 * @Date: 2023-12-05
 * @Version: V1.0
 */
public interface IMdcEquipmentOverFlagService extends IService<MdcEquipmentOverFlag> {
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
@@ -77,4 +77,9 @@
     * æ ¹æ®æ—¥æœŸæŸ¥è¯¢æ¬¡æ•°
     */
    Integer findAlarmCountByDate(String startDate, String endDate, MdcAlarmAnalyzeQueryVo vo);
    /**
     * æŸ¥è¯¢æ—¶é—´æ®µå†…运行数据
     */
    List<MdcEquipmentRunningSection> selectRunningData(String equipmentId, Date startDate, Date endDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -169,4 +169,5 @@
     */
    IPage<MdcEquipment> getEquipmentByWorkshopId(Page<MdcEquipment> page, WorkshopEquipmentVo workshopEquipmentVo);
    List<String> listEquipmentId(String equipmentType, List<String> equipmentIdList);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package org.jeecg.modules.mdc.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdc.dto.MdcProcessCountDto;
import org.jeecg.modules.mdc.entity.MdcProcessCount;
import org.jeecg.modules.mdc.vo.MdcProcessCountVo;
import javax.servlet.http.HttpServletRequest;
/**
 * @author Lius
 * @date 2023/11/23 10:17
 */
public interface IProcessCountService extends IService<MdcProcessCount> {
    /**
     * è®¡ç®—加工工件个数和时间任务
     */
    void runningProcessCount();
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param userId
     * @param page
     * @param mdcProcessCountVo
     * @param req
     * @return
     */
    IPage<MdcProcessCountDto> pageList(String userId, Page<MdcProcessCountDto> page, MdcProcessCountVo mdcProcessCountVo, HttpServletRequest req);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java
@@ -48,4 +48,9 @@
    public EquipmentLog getRow(String equipmentid, Date startTime) {
        return this.baseMapper.getRow(equipmentid, startTime);
    }
    @Override
    public Integer selectEquipmentOporation(String equipmentId) {
        return this.baseMapper.selectEquipmentOporation(equipmentId);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java
@@ -45,6 +45,16 @@
        return count != 0;
    }
    @Override
    public List<Map<String, Object>> findRunningData(String tableName, Date startTime, Date endTime) {
        return equipmentWorkLineMapper.findRunningData(tableName, startTime, endTime);
    }
    @Override
    public List<EquipmentMachingDto> getEquipProgramNum(String drivetype, String equipmentid, Date startTime, Date endTime) {
        return equipmentWorkLineMapper.getEquipProgramNum(drivetype + "_" + equipmentid, startTime, endTime);
    }
    private List<EquipmentMachingDto> convertData(List<Map<String, Object>> list) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        List<EquipmentMachingDto> dto = new ArrayList<>();
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
@@ -5,10 +5,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.mdc.entity.MdcDeviceCalendar;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.entity.MdcShiftSub;
import org.jeecg.modules.mdc.entity.MdcVacationManagement;
import org.jeecg.modules.mdc.entity.*;
import org.jeecg.modules.mdc.mapper.MdcDeviceCalendarMapper;
import org.jeecg.modules.mdc.service.IMdcDeviceCalendarService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
@@ -119,22 +116,11 @@
    public List<MdcDeviceCalendarVo> listByEquipmentAndDate(String equipmentId, List<String> stringDates) {
        List<MdcDeviceCalendarVo> result = new ArrayList<>();
        try {
            //查询默认班制
//            List<MdcDeviceCalendarVo> acquiesceShift = this.baseMapper.findAcquiesceShift();
            for (String stringDate : stringDates) {
                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = this.baseMapper.listByEquipmentAndDate(equipmentId, stringDate);
                if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
                    result.addAll(mdcDeviceCalendarVos);
                }
//                else {
//                    acquiesceShift.forEach(mdcDeviceCalendarVo -> {
//                        mdcDeviceCalendarVo.setEquipmentId(equipmentId);
//                        mdcDeviceCalendarVo.setEffectiveDate(stringDate);
//                    });
//                    // è®¾ç½®é»˜è®¤ç­åˆ¶
//                    result.addAll(acquiesceShift);
//                }
            }
        } catch (Exception e) {
            e.printStackTrace();
@@ -218,4 +204,9 @@
        }
    }
    @Override
    public MdcDeviceCalendar getFirstData(String equipmentId) {
        return this.baseMapper.getFirstData(equipmentId);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -19,7 +19,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.Collator;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
@@ -94,20 +94,29 @@
        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
        result.setDates(dates);
        // åˆ©ç”¨çŽ‡ç­‰çº§
        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
            result.setMdcEfficiencyList(listDtos);
        } else {
            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
                if (equipmentList != null && !equipmentList.isEmpty()) {
                    vo.setEquipmentIdList(equipmentList);
                } else {
                    result.setMdcEfficiencyList(listDtos);
                    return result;
                }
            }
            // æŸ¥è¯¢åˆ©ç”¨çŽ‡æ•°æ®
            List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo);
            // åˆ©ç”¨çŽ‡ç­‰çº§
            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
            // å°è£…结果
            if ("2".equals(vo.getTypeTree())) {
                // éƒ¨é—¨å±‚级
                List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰éƒ¨é—¨ä¿¡æ¯
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
                for (MdcEquDepDto mdcEquDepDto : equipmentList) {
                    MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -159,9 +168,36 @@
                        }
                    }
                    List<MdcEfficiencyResultDto> list = new ArrayList<>();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto();
                    mdcEfficiencyResultDto1.setTheDate("合计");
                    mdcEfficiencyResultDto.setTheDate("平均值");
                    for (String date : dates) {
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto));
                    }
                    mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong());
                    mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate());
                    mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate());
                    mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate());
                    mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong());
                    mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong());
                    mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong());
                    mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyResultDto1);
                    list.add(mdcEfficiencyResultDto);
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
                }
@@ -169,7 +205,7 @@
                // äº§çº¿å±‚级
                List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰äº§çº¿ä¿¡æ¯
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
                for (MdcEquProDto mdcEquProDto : equipmentList) {
                    MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -220,17 +256,149 @@
                        }
                    }
                    List<MdcEfficiencyResultDto> list = new ArrayList<>();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto();
                    mdcEfficiencyResultDto1.setTheDate("合计");
                    mdcEfficiencyResultDto.setTheDate("平均值");
                    for (String date : dates) {
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto));
                    }
                    mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong());
                    mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate());
                    mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate());
                    mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate());
                    mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong());
                    mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong());
                    mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong());
                    mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyResultDto1);
                    list.add(mdcEfficiencyResultDto);
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
                }
            }
            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
            result.setMdcEfficiencyList(listDtos);
        }
        // æ·»åŠ åˆè®¡å€¼å’Œå¹³å‡å€¼
        result.getDates().add("合计");
        result.getDates().add("平均值");
        MdcEfficiencyListDto sum = new MdcEfficiencyListDto();
        sum.setLevel1("合计");
        sum.setLevel2("合计");
        sum.setLevel3("合计");
        sum.setEquipmentId("合计");
        sum.setEquipmentName("合计");
        sum.setEquipmentType("合计");
        //计算合计值
        sum.setDataList(this.calculateTotal(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        MdcEfficiencyListDto avg = new MdcEfficiencyListDto();
        avg.setLevel1("平均值");
        avg.setLevel2("平均值");
        avg.setLevel3("平均值");
        avg.setEquipmentId("平均值");
        avg.setEquipmentName("平均值");
        avg.setEquipmentType("平均值");
        //计算平均值
        avg.setDataList(this.calculateAverage(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        result.getMdcEfficiencyList().add(sum);
        result.getMdcEfficiencyList().add(avg);
        return result;
    }
    /**
     * è®¡ç®—平均值
     *
     * @param mdcEfficiencyList
     * @param mdcUtilizationRateList
     * @return
     */
    private List<MdcEfficiencyResultDto> calculateAverage(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyResultDto> result = new ArrayList<>();
        List<MdcEfficiencyResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
            mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate));
        return result;
    }
    /**
     * è®¡ç®—合计值
     *
     * @param mdcEfficiencyList
     * @return
     */
    private List<MdcEfficiencyResultDto> calculateTotal(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyResultDto> result = new ArrayList<>();
        List<MdcEfficiencyResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
            mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate));
        return result;
    }
@@ -274,20 +442,30 @@
        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
        result.setDates(dates);
        // åˆ©ç”¨çŽ‡ç­‰çº§
        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl");
        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
            result.setMdcEfficiencyList(listDtos);
        } else {
            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
                if (equipmentList != null && !equipmentList.isEmpty()) {
                    vo.setEquipmentIdList(equipmentList);
                } else {
                    result.setMdcEfficiencyList(listDtos);
                    return result;
                }
            }
            // æŸ¥è¯¢åˆ©ç”¨çŽ‡æ•°æ®
            List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyPOList(vo);
            // åˆ©ç”¨çŽ‡ç­‰çº§
            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl");
            // å°è£…结果
            if ("2".equals(vo.getTypeTree())) {
                // éƒ¨é—¨å±‚级
                List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰éƒ¨é—¨ä¿¡æ¯
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
                for (MdcEquDepDto mdcEquDepDto : equipmentList) {
                    MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -339,9 +517,36 @@
                        }
                    }
                    List<MdcEfficiencyResultDto> list = new ArrayList<>();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto();
                    mdcEfficiencyResultDto1.setTheDate("合计");
                    mdcEfficiencyResultDto.setTheDate("平均值");
                    for (String date : dates) {
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto));
                    }
                    mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong());
                    mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate());
                    mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate());
                    mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate());
                    mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong());
                    mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong());
                    mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong());
                    mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyResultDto1);
                    list.add(mdcEfficiencyResultDto);
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
                }
@@ -349,7 +554,7 @@
                // äº§çº¿å±‚级
                List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰äº§çº¿ä¿¡æ¯
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
                for (MdcEquProDto mdcEquProDto : equipmentList) {
                    MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -400,17 +605,149 @@
                        }
                    }
                    List<MdcEfficiencyResultDto> list = new ArrayList<>();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
                    MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto();
                    mdcEfficiencyResultDto1.setTheDate("合计");
                    mdcEfficiencyResultDto.setTheDate("平均值");
                    for (String date : dates) {
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto));
                    }
                    mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong());
                    mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate());
                    mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate());
                    mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate());
                    mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong());
                    mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong());
                    mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong());
                    mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyResultDto1);
                    list.add(mdcEfficiencyResultDto);
                    mdcEfficiencyListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyListDto);
                }
            }
            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
            result.setMdcEfficiencyList(listDtos);
        }
        result.getDates().add("合计");
        result.getDates().add("平均值");
        MdcEfficiencyListDto sum = new MdcEfficiencyListDto();
        sum.setLevel1("合计");
        sum.setLevel2("合计");
        sum.setLevel3("合计");
        sum.setEquipmentId("合计");
        sum.setEquipmentName("合计");
        sum.setEquipmentType("合计");
        //计算合计值
        sum.setDataList(this.calculateOpenTotal(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        MdcEfficiencyListDto avg = new MdcEfficiencyListDto();
        avg.setLevel1("平均值");
        avg.setLevel2("平均值");
        avg.setLevel3("平均值");
        avg.setEquipmentId("平均值");
        avg.setEquipmentName("平均值");
        avg.setEquipmentType("平均值");
        //计算平均值
        avg.setDataList(this.calculateOpenAverage(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        result.getMdcEfficiencyList().add(sum);
        result.getMdcEfficiencyList().add(avg);
        return result;
    }
    /**
     * è®¡ç®—平均值
     *
     * @param mdcEfficiencyList
     * @param mdcUtilizationRateList
     * @return
     */
    private List<MdcEfficiencyResultDto> calculateOpenAverage(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyResultDto> result = new ArrayList<>();
        List<MdcEfficiencyResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
            mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate));
        return result;
    }
    /**
     * è®¡ç®—合计值
     *
     * @param mdcEfficiencyList
     * @param mdcUtilizationRateList
     * @return
     */
    private List<MdcEfficiencyResultDto> calculateOpenTotal(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyResultDto> result = new ArrayList<>();
        List<MdcEfficiencyResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
            mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate));
        return result;
    }
@@ -451,14 +788,25 @@
            vo.setEquipmentIdList(equipmentIds);
        }
        // ç­æ¬¡åˆ©ç”¨çŽ‡ç­‰çº§
        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl");
        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
        result.setDates(dates);
        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
            result.setMdcEfficiencyList(listDtos);
        } else {
            // ç­æ¬¡åˆ©ç”¨çŽ‡ç­‰çº§
            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl");
            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
                if (equipmentList != null && !equipmentList.isEmpty()) {
                    vo.setEquipmentIdList(equipmentList);
                } else {
                    result.setMdcEfficiencyList(listDtos);
                    return result;
                }
            }
            // ç­æ¬¡åˆ©ç”¨çŽ‡æ•°æ®
            List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList = mdcEfficiencyReportMapper.efficiencyShiftSumList(vo);
@@ -467,7 +815,7 @@
                // éƒ¨é—¨å±‚级
                List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰éƒ¨é—¨ä¿¡æ¯
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
                // ç­æ¬¡åç§°æ˜¾ç¤ºå¤„理
                String shiftSubName = "";
                if (StringUtils.isBlank(vo.getShiftId())) {
@@ -540,9 +888,36 @@
                        }
                    }
                    List<MdcEfficiencyShiftResultDto> list = new ArrayList<>();
                    MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto();
                    MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto1 = new MdcEfficiencyShiftResultDto();
                    mdcEfficiencyShiftResultDto.setTheDate("平均值");
                    mdcEfficiencyShiftResultDto1.setTheDate("合计");
                    for (String date : dates) {
                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyShiftResultDto));
                    }
                    mdcEfficiencyShiftResultDto1.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong());
                    mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate());
                    mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setStartRate(mdcEfficiencyShiftResultDto.getStartRate());
                    mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate());
                    mdcEfficiencyShiftResultDto1.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong());
                    mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong());
                    mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong());
                    mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyShiftResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyShiftResultDto1);
                    list.add(mdcEfficiencyShiftResultDto);
                    mdcEfficiencyShiftListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyShiftListDto);
                }
@@ -550,7 +925,7 @@
                // äº§çº¿å±‚级
                List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                // æŸ¥è¯¢æ‰€æœ‰äº§çº¿ä¿¡æ¯
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
                // ç­æ¬¡åç§°æ˜¾ç¤ºå¤„理
                String shiftSubName = "";
@@ -623,21 +998,154 @@
                        }
                    }
                    List<MdcEfficiencyShiftResultDto> list = new ArrayList<>();
                    MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto();
                    MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto1 = new MdcEfficiencyShiftResultDto();
                    mdcEfficiencyShiftResultDto.setTheDate("平均值");
                    mdcEfficiencyShiftResultDto1.setTheDate("合计");
                    for (String date : dates) {
                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList));
                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyShiftResultDto));
                    }
                    mdcEfficiencyShiftResultDto1.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong());
                    mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate());
                    mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setStartRate(mdcEfficiencyShiftResultDto.getStartRate());
                    mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate());
                    mdcEfficiencyShiftResultDto1.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong());
                    mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong());
                    mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    mdcEfficiencyShiftResultDto1.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong());
                    mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
                    long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                            mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                            mdcEfficiencyShiftResultDto1.setColor(mdcUtilizationRate.getRateParameterColor());
                        }
                    }
                    list.add(mdcEfficiencyShiftResultDto1);
                    list.add(mdcEfficiencyShiftResultDto);
                    mdcEfficiencyShiftListDto.setDataList(list);
                    listDtos.add(mdcEfficiencyShiftListDto);
                }
            }
            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
//            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
            result.setMdcEfficiencyList(listDtos);
        }
        result.getDates().add("合计");
        result.getDates().add("平均值");
        MdcEfficiencyShiftListDto sum = new MdcEfficiencyShiftListDto();
        sum.setLevel1("合计");
        sum.setLevel2("合计");
        sum.setLevel3("合计");
        sum.setEquipmentId("合计");
        sum.setEquipmentName("合计");
        sum.setEquipmentType("合计");
        sum.setShiftSubName("合计");
        sum.setDataList(this.calculateShiftTotal(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        MdcEfficiencyShiftListDto avg = new MdcEfficiencyShiftListDto();
        avg.setLevel1("平均值");
        avg.setLevel2("平均值");
        avg.setLevel3("平均值");
        avg.setEquipmentId("平均值");
        avg.setEquipmentName("平均值");
        avg.setEquipmentType("平均值");
        avg.setShiftSubName("平均值");
        avg.setDataList(this.calculateShiftAverage(result.getMdcEfficiencyList(), mdcUtilizationRateList));
        result.getMdcEfficiencyList().add(sum);
        result.getMdcEfficiencyList().add(avg);
        return result;
    }
    /**
     * è®¡ç®—平均值
     *
     * @param mdcEfficiencyList
     * @param mdcUtilizationRateList
     * @return
     */
    private List<MdcEfficiencyShiftResultDto> calculateShiftAverage(List<MdcEfficiencyShiftListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyShiftResultDto> result = new ArrayList<>();
        List<MdcEfficiencyShiftResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyShiftListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyShiftResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyShiftResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto : result) {
            mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyShiftResultDto::getTheDate));
        return result;
    }
    /**
     * è®¡ç®—合计值
     *
     * @param mdcEfficiencyList
     * @param mdcUtilizationRateList
     * @return
     */
    private List<MdcEfficiencyShiftResultDto> calculateShiftTotal(List<MdcEfficiencyShiftListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
        List<MdcEfficiencyShiftResultDto> result = new ArrayList<>();
        List<MdcEfficiencyShiftResultDto> dataList = new ArrayList<>();
        for (MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto : mdcEfficiencyList) {
            dataList.addAll(mdcEfficiencyShiftListDto.getDataList());
        }
        dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyShiftResultDto::getTheDate, Collectors.toList()))
                .forEach((theDate, mert) -> {
                    mert.stream().reduce((a, b) -> new MdcEfficiencyShiftResultDto(
                            a.getTheDate(),
                            a.getProcessLong().add(b.getProcessLong()),
                            a.getUtilizationRate().add(b.getUtilizationRate()),
                            a.getStartRate().add(b.getStartRate()),
                            a.getOpenRate().add(b.getOpenRate()),
                            a.getOpenLong().add(b.getOpenLong()),
                            a.getWaitLong().add(b.getWaitLong()),
                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
                });
        for (MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto : result) {
            mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
            long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
            for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                    mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                }
            }
        }
        result.sort(Comparator.comparing(MdcEfficiencyShiftResultDto::getTheDate));
        return result;
    }
    private MdcEfficiencyShiftResultDto efficiencyShiftRate(List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList) {
    private MdcEfficiencyShiftResultDto efficiencyShiftRate(List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList, MdcEfficiencyShiftResultDto efficiencyShiftResultDto) {
        MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto();
        if (mdcEquipmentStatisticalShiftInfoList != null && !mdcEquipmentStatisticalShiftInfoList.isEmpty()) {
            for (MdcEquipmentStatisticalShiftInfo equipmentStatisticalShiftInfo : mdcEquipmentStatisticalShiftInfoList) {
@@ -687,6 +1195,13 @@
                }
            }
        }
        efficiencyShiftResultDto.setProcessLong(efficiencyShiftResultDto.getProcessLong().add(mdcEfficiencyShiftResultDto.getProcessLong()));
        efficiencyShiftResultDto.setUtilizationRate(efficiencyShiftResultDto.getUtilizationRate().add(mdcEfficiencyShiftResultDto.getUtilizationRate()));
        efficiencyShiftResultDto.setStartRate(efficiencyShiftResultDto.getStartRate().add(mdcEfficiencyShiftResultDto.getStartRate()));
        efficiencyShiftResultDto.setOpenRate(efficiencyShiftResultDto.getOpenRate().add(mdcEfficiencyShiftResultDto.getOpenRate()));
        efficiencyShiftResultDto.setOpenLong(efficiencyShiftResultDto.getOpenLong().add(mdcEfficiencyShiftResultDto.getOpenLong()));
        efficiencyShiftResultDto.setWaitLong(efficiencyShiftResultDto.getWaitLong().add(mdcEfficiencyShiftResultDto.getWaitLong()));
        efficiencyShiftResultDto.setCloseLong(efficiencyShiftResultDto.getCloseLong().add(mdcEfficiencyShiftResultDto.getCloseLong()));
        return mdcEfficiencyShiftResultDto;
    }
@@ -795,7 +1310,7 @@
            }
        } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) {
            // å•台设备信息
            vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId()));
            vo.setEquipmentIdList(Arrays.asList(vo.getEquipmentId().split(",")));
        } else {
            // æŸ¥è¯¢ç”¨æˆ·æ‹¥æœ‰çš„æ‰€æœ‰è®¾å¤‡ä¿¡æ¯
            if ("2".equals(vo.getTypeTree())) {
@@ -1263,7 +1778,7 @@
        return vo;
    }
    private MdcEfficiencyResultDto efficiencyRate(List<MdcEfficiencyDto> efficiencyList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList) {
    private MdcEfficiencyResultDto efficiencyRate(List<MdcEfficiencyDto> efficiencyList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList, MdcEfficiencyResultDto efficiencyResultDto) {
        MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
        if (efficiencyList != null && !efficiencyList.isEmpty()) {
            for (MdcEfficiencyDto efficiencyDto : efficiencyList) {
@@ -1314,6 +1829,13 @@
                }
            }
        }
        efficiencyResultDto.setProcessLong(efficiencyResultDto.getProcessLong().add(mdcEfficiencyResultDto.getProcessLong()));
        efficiencyResultDto.setUtilizationRate(efficiencyResultDto.getUtilizationRate().add(mdcEfficiencyResultDto.getUtilizationRate()));
        efficiencyResultDto.setStartRate(efficiencyResultDto.getStartRate().add(mdcEfficiencyResultDto.getStartRate()));
        efficiencyResultDto.setOpenRate(efficiencyResultDto.getOpenRate().add(mdcEfficiencyResultDto.getOpenRate()));
        efficiencyResultDto.setOpenLong(efficiencyResultDto.getOpenLong().add(mdcEfficiencyResultDto.getOpenLong()));
        efficiencyResultDto.setWaitLong(efficiencyResultDto.getWaitLong().add(mdcEfficiencyResultDto.getWaitLong()));
        efficiencyResultDto.setCloseLong(efficiencyResultDto.getCloseLong().add(mdcEfficiencyResultDto.getCloseLong()));
        return mdcEfficiencyResultDto;
    }
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package org.jeecg.modules.mdc.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
import org.jeecg.modules.mdc.mapper.MdcEquipmentOverFlagMapper;
import org.jeecg.modules.mdc.service.IMdcEquipmentOverFlagService;
import org.springframework.stereotype.Service;
/**
 * @Description: è®¾å¤‡ç¨‹åºæ‰§è¡Œç»“束标志表
 * @Author: Lius
 * @Date: 2023-12-05
 * @Version: V1.0
 */
@Service
public class MdcEquipmentOverFlagServiceImpl extends ServiceImpl<MdcEquipmentOverFlagMapper, MdcEquipmentOverFlag> implements IMdcEquipmentOverFlagService {
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
@@ -480,9 +480,9 @@
            //获取running运行的日志记录
            List<MdcEquipmentRunningSection> list = this.equipmentRunningTracesLog(equipment.getEquipmentid());
            if (list != null && !list.isEmpty()) {
                //List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //添加程序号
                this.ergodicTrim(list);
                super.saveBatch(list);
                List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //添加程序号
                this.ergodicTrim(equipList);
                super.saveBatch(equipList);
            }
            //获取报警的日志记录
            List<MdcEquipmentRunningSection> errorList = this.equipmentRunningTracesErrorLog(equipment.getEquipmentid());
@@ -496,6 +496,37 @@
                this.dataSynchronizationHandler(list, errorList);
            }
        }
    }
    /**
     * è®¾å¤‡è¿è¡Œæ—¥å¿—添加程序号
     *
     * @param list
     * @return
     */
    public List<MdcEquipmentRunningSection> addSequenceNumber(List<MdcEquipmentRunningSection> list) {
        if (list == null || list.size() < 1) {
            return Collections.emptyList();
        }
        Equipment equip = null;
        for (MdcEquipmentRunningSection e : list) {
            if (e.getStatus() == 3) {
                equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getEquipmentid, e.getEquipmentId()));
                if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("FANUC")) {
                    List<EquipmentMachingDto> esList = equipmentWorkLineService.getEquipProgramNum(equip.getDrivetype(), equip.getEquipmentid(),
                            e.getStartTime(), e.getEndTime());
                    if (esList != null && esList.size() > 1) {
                        e.setSequenceNumber(esList.get(0).getProgramnumber());
                    }
                } else if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("SIEMENS")) {
                    List<EquipmentMachingDto> esList = equipmentWorkLineService.getEquipmentSequencenumber(equip.getDrivetype() + "_" + equip.getEquipmentid(), e.getStartTime(), e.getEndTime());
                    if (esList != null && esList.size() > 1) {
                        e.setSequenceNumber(esList.get(0).getSequencenumber());
                    }
                }
            }
        }
        return list;
    }
    /**
@@ -655,6 +686,11 @@
        return this.baseMapper.findAlarmCountByDate(startDate, endDate, vo);
    }
    @Override
    public List<MdcEquipmentRunningSection> selectRunningData(String equipmentId, Date startDate, Date endDate) {
        return this.baseMapper.selectRunningData(equipmentId, startDate, endDate);
    }
    private Map<String, List<MdcEquipmentRunningSectionDto>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) {
        Map<String, List<MdcEquipmentRunningSectionDto>> map = new HashMap<>();
        List<MdcEquipmentRunningSectionDto> normal = new ArrayList<>();
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -11,23 +11,15 @@
import org.jeecg.modules.mdc.dto.MdcEquDepDto;
import org.jeecg.modules.mdc.dto.MdcEquProDto;
import org.jeecg.modules.mdc.dto.MdcEquipmentDto;
import org.jeecg.modules.mdc.entity.ControlSystem;
import org.jeecg.modules.mdc.entity.MdcDriveTypeParamConfig;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor;
import org.jeecg.modules.mdc.entity.*;
import org.jeecg.modules.mdc.mapper.MdcEquipmentMapper;
import org.jeecg.modules.mdc.mapper.MdcTorqueConfigMapper;
import org.jeecg.modules.mdc.model.MdcEquipmentTree;
import org.jeecg.modules.mdc.service.IControlSystemService;
import org.jeecg.modules.mdc.service.IEquipmentWorkLineService;
import org.jeecg.modules.mdc.service.IMdcDriveTypeParamConfigService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.service.*;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.FindsEquipmentDepartUtil;
import org.jeecg.modules.mdc.util.FindsEquipmentProductionUtil;
import org.jeecg.modules.mdc.vo.MdcEquipmentDepVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentProVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentVo;
import org.jeecg.modules.mdc.vo.WorkshopEquipmentVo;
import org.jeecg.modules.mdc.vo.*;
import org.jeecg.modules.system.entity.MdcEquipmentDepart;
import org.jeecg.modules.system.entity.MdcProduction;
import org.jeecg.modules.system.entity.MdcProductionEquipment;
@@ -43,6 +35,8 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -74,14 +68,14 @@
    private IEquipmentWorkLineService equipmentWorkLineService;
    @Resource
    private IMdcDriveTypeParamConfigService mdcDriveTypeParamConfigService;
//    @Resource
//    private XYZAliasesMapper xyzAliasesMapper;
//    @Resource
//    private IEquipmentXYZService equipmentXYZService;
//    @Resource
//    private IEquipmentBaseInfoService equipmentBaseInfoService;
//    @Resource
//    private IEquipmentTemperatureService equipmentTemperatureService;
    @Resource
    private MdcTorqueConfigMapper mdcTorqueConfigMapper;
    @Resource
    private IEquipmentLogService equipmentLogService;
    @Resource
    private IEquipmentBaseInfoService equipmentBaseInfoService;
    @Override
    public Map<String, String> getDepNamesByEquipmentIds(List<String> equipmentIds) {
@@ -363,6 +357,9 @@
        mdcEquipmentDto.setDataPort(mdcEquipment.getDataPort());
        mdcEquipmentDto.setDataFlag(Integer.parseInt(CommonConstant.STATUS_1));
        ControlSystem controlSystem = controlSystemService.getByDriveType(mdcEquipmentDto.getDriveType());
        // æŸ¥è¯¢è®¾å¤‡çŠ¶æ€
        Integer oporation = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
        if (controlSystem != null) {
            //获取工作数据并初始化
            String saveTableName = mdcEquipment.getSaveTableName();
@@ -378,6 +375,15 @@
                mdcEquipmentDto.setSequencenumber(dto.getSequencenumber());
                mdcEquipmentDto.setExecutingcode(dto.getExecutingcode());
                mdcEquipmentDto.setProductName(dto.getProductName());
                if ("LSV2".equals(mdcEquipment.getDriveType())) {
                    mdcEquipmentDto.setSpindlebeilv(dto.getSFeed());
                    mdcEquipmentDto.setFeedbeilv(dto.getFFeed());
                    mdcEquipmentDto.setRapidfeed(dto.getRapidfeed());
                    mdcEquipmentDto.setNCVersion(dto.getNCVersion());
                    mdcEquipmentDto.setTNCVersion(dto.getTNCVersion());
                    mdcEquipmentDto.setOPTVersion(dto.getOPTVersion());
                    mdcEquipmentDto.setPLCVersion(dto.getPLCVersion());
                }
                //获取 MDC é©±åŠ¨å¯¹åº”çš„å±•ç¤ºå‚æ•°   å¹¶æ ¹æ®key æ‹¼è£…从 workData  æŸ¥è¯¢çš„æ•°æ®
                List<MdcDriveTypeParamConfig> mdcDriveTypeParamList = mdcDriveTypeParamConfigService.getShowDriveParam(mdcEquipment.getDriveType());
@@ -393,75 +399,40 @@
                        } else {
                            value = result == null ? null : result.toString();
                        }
                        // ZUOLAN设备电流字段AI01
                        if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "AI01".equals(englishName) && oporation == 3) {
                            value = BigDecimal.valueOf(Math.random() * 15 + 0).setScale(1, RoundingMode.HALF_UP).toString();
                        }
                        // å…¶ä»–设备电流字段
                        if ("spindle_current".equals(englishName)) {
                            String devicePower = mdcEquipment.getDevicePower();
                            Object spindleload = jsonObject.get("spindleload");
                            BigDecimal load = spindleload == null ? BigDecimal.ZERO : new BigDecimal(spindleload.toString());
                            if (StringUtils.isNotEmpty(devicePower) && oporation == 3) {
                                value = new BigDecimal(devicePower).divide(new BigDecimal("380"), 2, BigDecimal.ROUND_HALF_UP).add(load).toString();
                            } else {
                                value = "0";
                            }
                        }
                        // æ‰­çŸ©å­—段
                        if ("torque".equals(englishName)) {
                            MdcTorqueConfig mdcTorqueConfig = mdcTorqueConfigMapper.findLast(mdcEquipment.getEquipmentId());
                            if (mdcTorqueConfig != null) {
                                value = String.valueOf(mdcTorqueConfig.getTorqueValue());
                            } else {
                                value = "0";
                            }
                        }
                        mdcDriveTypeParamConfig.setValue(value);
                    }
                    mdcEquipmentDto.setMdcDriveTypeParamConfigList(mdcDriveTypeParamList);
                }
                EquipmentBaseInfo equipmentBaseInfo = equipmentBaseInfoService.getByEquipmentId(mdcEquipment.getEquipmentId());
                if (equipmentBaseInfo != null) {
                    mdcEquipmentDto.setMaxAxis(equipmentBaseInfo.getMaxAxis());
                    mdcEquipmentDto.setValidAxis(equipmentBaseInfo.getValidAxis());
                }
            }
//            // è®¾å¤‡åæ ‡æ•° èŽ·å–è®¾å¤‡éœ€è¦é‡‡é›†çš„åæ ‡ä¿¡æ¯
//            List<XYZAliases> equipmentCoordinateList = xyzAliasesMapper.getCoordinateByEquipmentId(mdcEquipment.getEquipmentId());
//            // è®¾å¤‡é‡‡é›†çš„坐标信息
//            EquipmentXYZ equipmentXYZ = equipmentXYZService.getByEquipmentId(mdcEquipment.getEquipmentId());
//            JSONObject jsonEquipmentXYZ = (JSONObject) JSONObject.toJSON(equipmentXYZ);
//            if (equipmentCoordinateList != null && !equipmentCoordinateList.isEmpty()) {
//                for (XYZAliases xyzAliases : equipmentCoordinateList) {
//                    String englishName = xyzAliases.getXYZFieldName().toLowerCase();
//                    englishName = englishName.substring(0, 1) + "_" + englishName.substring(1, englishName.length());
//                    englishName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, englishName);
//                    Object orgValue = jsonEquipmentXYZ.get(englishName);
//                    String value = orgValue != null ? orgValue.toString() : null;
//                    //  åæ ‡æ•°æ®çš„title æ¥è‡ª xyzAliases è¡¨, æ ¹æ® æ˜¯å¦åŒ…含 absolute å’Œ  machine  åˆ¤æ–­æ˜¯ç»å¯¹åæ ‡è¿˜æ˜¯æœºåºŠåæ ‡
//                    String title = englishName.substring(0, 1).toUpperCase();
//                    title = englishName.contains("absolute") ? "绝对坐标" + title : "机床坐标" + title;
//                    xyzAliases.setTitle(title);
//                    xyzAliases.setValue(value);
//                }
//                mdcEquipmentDto.setXyzAliasesList(equipmentCoordinateList);
//            }
//            if (equipmentXYZ != null) {
//                mdcEquipmentDto.setXmachine(equipmentXYZ.getXMachine());
//                mdcEquipmentDto.setYmachine(equipmentXYZ.getYMachine());
//                mdcEquipmentDto.setZmachine(equipmentXYZ.getZMachine());
//                mdcEquipmentDto.setAmachine(equipmentXYZ.getAMachine());
//                mdcEquipmentDto.setBmachine(equipmentXYZ.getBMachine());
//                mdcEquipmentDto.setXabsolute(equipmentXYZ.getXAbsolute());
//                mdcEquipmentDto.setYabsolute(equipmentXYZ.getYAbsolute());
//                mdcEquipmentDto.setZabsolute(equipmentXYZ.getZAbsolute());
//                mdcEquipmentDto.setAabsolute(equipmentXYZ.getAAbsolute());
//                mdcEquipmentDto.setBabsolute(equipmentXYZ.getBAbsolute());
//            }
//            EquipmentBaseInfo equipmentBaseInfo = equipmentBaseInfoService.getByEquipmentId(mdcEquipment.getEquipmentId());
//            if (equipmentBaseInfo != null) {
//                mdcEquipmentDto.setMaxAxis(equipmentBaseInfo.getMaxAxis());
//                mdcEquipmentDto.setValidAxis(equipmentBaseInfo.getValidAxis());
//            }
//            if (controlSystem.getDriveType().equals("SIEMENS840DSL")) {
//                EquipmentTemperatureDto equipmentTemperature = equipmentTemperatureService.getEquipmentTemperature(mdcEquipment.getEquipmentId());
//                if (equipmentTemperature != null) {
//                    mdcEquipmentDto.setTemperatureX(equipmentTemperature.getX());
//                    mdcEquipmentDto.setTemperatureY(equipmentTemperature.getY());
//                    mdcEquipmentDto.setTemperatureZ(equipmentTemperature.getZ());
//                    mdcEquipmentDto.setTemperatureA(equipmentTemperature.getA());
//                    mdcEquipmentDto.setTemperatureB(equipmentTemperature.getB());
//                }
//                EquipmentTemperatureDto equipmentLagError = equipmentTemperatureService.getEquipmentLagError(mdcEquipment.getEquipmentId());
//                if (equipmentLagError != null) {
//                    mdcEquipmentDto.setEquipmentLagErrorX(equipmentLagError.getX());
//                    mdcEquipmentDto.setEquipmentLagErrorY(equipmentLagError.getY());
//                    mdcEquipmentDto.setEquipmentLagErrorZ(equipmentLagError.getZ());
//                    mdcEquipmentDto.setEquipmentLagErrorA(equipmentLagError.getA());
//                    mdcEquipmentDto.setEquipmentLagErrorB(equipmentLagError.getB());
//                }
//            }
//            EquipmentTemperatureDto equipmentCurrent = equipmentTemperatureService.getEquipmentCurrent(mdcEquipment.getEquipmentId());
//            if (equipmentCurrent != null) {
//                mdcEquipmentDto.setEquipmentCurrentX(equipmentCurrent.getX());
//                mdcEquipmentDto.setEquipmentCurrentY(equipmentCurrent.getY());
//                mdcEquipmentDto.setEquipmentCurrentZ(equipmentCurrent.getZ());
//                mdcEquipmentDto.setEquipmentCurrentA(equipmentCurrent.getA());
//                mdcEquipmentDto.setEquipmentCurrentB(equipmentCurrent.getB());
//            }
        }
        return mdcEquipmentDto;
    }
@@ -708,4 +679,10 @@
        return this.baseMapper.getEquipmentByWorkshopId(page, workshopEquipmentVo);
    }
    @Override
    public List<String> listEquipmentId(String equipmentType, List<String> equipmentIdList) {
        List<MdcEquipment> list = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentType, equipmentType).in(MdcEquipment::getEquipmentId, equipmentIdList));
        return list.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
@@ -80,7 +80,6 @@
     *
     * @param equipmentId
     * @param validDate
     * @param shiftSubId
     * @return
     */
    @Override
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java
@@ -12,7 +12,6 @@
import org.jeecg.modules.mdc.mapper.MdcTorqueConfigMapper;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.service.IMdcTorqueConfigService;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
@@ -21,7 +20,10 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
 * @Description: æ‰­çŸ©é…ç½®ç®¡ç†
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,365 @@
package org.jeecg.modules.mdc.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.mdc.dto.MdcProcessCountDto;
import org.jeecg.modules.mdc.entity.*;
import org.jeecg.modules.mdc.mapper.MdcProcessCountMapper;
import org.jeecg.modules.mdc.service.*;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.TimeFieldUtils;
import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
import org.jeecg.modules.mdc.vo.MdcProcessCountVo;
import org.jeecg.modules.mdc.vo.MdcShiftDateVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author Lius
 * @date 2023/11/23 10:17
 */
@Service
public class ProcessCountServiceImpl extends ServiceImpl<MdcProcessCountMapper, MdcProcessCount> implements IProcessCountService {
    @Resource
    private IMdcEquipmentService mdcEquipmentService;
    @Resource
    private IMdcDeviceCalendarService mdcDeviceCalendarService;
    @Resource
    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
    @Resource
    private IMdcEquipmentOverFlagService mdcEquipmentOverFlagService;
    @Resource
    private IEquipmentWorkLineService equipmentWorkLineService;
    /**
     * è®¡ç®—加工工件个数和时间任务
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void runningProcessCount() {
        // èŽ·å–æ‰€æœ‰è®¾å¤‡
        List<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list();
        List<MdcProcessCount> result = new ArrayList<>();
        for (MdcEquipment mdcEquipment : mdcEquipmentList) {
            List<MdcProcessCount> mdcProcessCountList = processCount(mdcEquipment);
            if (mdcProcessCountList != null && !mdcProcessCountList.isEmpty()) {
                result.addAll(mdcProcessCountList);
            }
        }
        if (!result.isEmpty()) {
            this.saveBatch(result);
        }
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param userId
     * @param page
     * @param mdcProcessCountVo
     * @param req
     * @return
     */
    @Override
    public IPage<MdcProcessCountDto> pageList(String userId, Page<MdcProcessCountDto> page, MdcProcessCountVo mdcProcessCountVo, HttpServletRequest req) {
        List<String> equipmentIds = new ArrayList<>();
        if (StringUtils.isNotEmpty(mdcProcessCountVo.getParentId()) && StringUtils.isEmpty(mdcProcessCountVo.getEquipmentId())) {
            if ("2".equals(mdcProcessCountVo.getTypeTree())) {
                //部门层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, mdcProcessCountVo.getParentId());
            } else {
                //产线层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcProcessCountVo.getParentId());
            }
        } else if (StringUtils.isNotEmpty(mdcProcessCountVo.getEquipmentId())) {
            //单台设备信息
            mdcProcessCountVo.setMdcSectionIds(Collections.singletonList(mdcProcessCountVo.getEquipmentId()));
        } else {
            //查询用户拥有的所有设备信息
            if ("2".equals(mdcProcessCountVo.getTypeTree())) {
                //部门层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null);
            } else {
                //产线层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
            }
        }
        if (mdcProcessCountVo.getMdcSectionIds() == null || mdcProcessCountVo.getMdcSectionIds().isEmpty()) {
            mdcProcessCountVo.setMdcSectionIds(equipmentIds);
        }
        if (mdcProcessCountVo.getMdcSectionIds() == null || mdcProcessCountVo.getMdcSectionIds().isEmpty()) {
            return null;
        }
        return this.baseMapper.pageList(page, mdcProcessCountVo);
    }
    @Transactional(readOnly = true)
    List<MdcProcessCount> processCount(MdcEquipment mdcEquipment) {
        Date initDate = null;
        //取最后的统计数据
        MdcProcessCount lastData = this.baseMapper.getLastData(mdcEquipment.getEquipmentId());
        Boolean flag = true;
        if (lastData != null) {
            initDate = DateUtils.toDate(lastData.getTheDate(), DateUtils.STRDATE);
            initDate = DateUtils.plusTime(initDate, 1);
        } else {
            //初次取值 å–最早时间
            MdcDeviceCalendar mdcDeviceCalendar = mdcDeviceCalendarService.getFirstData(mdcEquipment.getEquipmentId());
            if (mdcDeviceCalendar != null) {
                initDate = DateUtils.toDate(mdcDeviceCalendar.getEffectiveDate(), DateUtils.STRDATE);
            }
        }
        if (initDate == null) {
            return null;
        }
        Date endDate = DateUtils.plusTime(DateUtils.getNow(), 0);
        if (!DateUtils.less(initDate, endDate)) {
            return Collections.emptyList();
        }
        //获取两个时间段的差
        List<String> stringDates = DateUtils.getDatesStringList2(initDate, DateUtils.plusTime(endDate, -1));
        if (stringDates.isEmpty()) {
            return Collections.emptyList();
        }
        // èŽ·å–è®¾å¤‡ç­æ¬¡ä¿¡æ¯
        Map<String, List<MdcDeviceCalendarVo>> listMap = this.mdcDeviceCalendarMap(mdcEquipment.getEquipmentId(), stringDates);
        if (listMap.isEmpty()) {
            listMap = new HashMap<>();
        }
        List<MdcProcessCount> resultList = new ArrayList<>();
        for (String stringDate : stringDates) {
            if (listMap.containsKey(stringDate)) {
                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = listMap.get(stringDate);
                for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
                    // å¤„理班制班次时间
                    List<MdcShiftDateVo> datesListByMdcDeviceCalendarVo = this.getDatesListByMdcDeviceCalendarVo(mdcDeviceCalendarVo);
                    if (datesListByMdcDeviceCalendarVo == null || datesListByMdcDeviceCalendarVo.isEmpty()) {
                        break;
                    }
                    for (MdcShiftDateVo mdcShiftDateVo : datesListByMdcDeviceCalendarVo) {
                        Date startDate = null;
                        //处理数据
                        //List<MdcProcessCount> result = new ArrayList<>();
                        // æŸ¥è¯¢ç­æ¬¡å†…设备运行状态时间段
                        List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), mdcShiftDateVo.getStartDate(), mdcShiftDateVo.getEndDate());
                        if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) {
                            // æ—¶é—´ä¿®æ­£
                            equipmentRunningSectionList.get(0).setStartTime(mdcShiftDateVo.getStartDate());
                            if (equipmentRunningSectionList.size() > 1) {
                                equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(mdcShiftDateVo.getEndDate());
                            } else {
                                equipmentRunningSectionList.get(0).setEndTime(mdcShiftDateVo.getEndDate());
                            }
                            if (!"FANUC".equals(mdcEquipment.getDriveType())) {
                                MdcEquipmentOverFlag equipmentOverFlag = mdcEquipmentOverFlagService.getOne(new LambdaQueryWrapper<MdcEquipmentOverFlag>().eq(MdcEquipmentOverFlag::getDriveType, mdcEquipment.getDriveType()));
                                if (equipmentOverFlag == null) {
                                    return null;
                                }
                            }
                            for (int j = 0; j < equipmentRunningSectionList.size(); j++) {
                                MdcEquipmentRunningSection mdcEquipmentRunningSection = equipmentRunningSectionList.get(j);
                                // æŸ¥æ‰¾è®¾å¤‡å•表运行数据
                                List<Map<String, Object>> mdcEquipmentDtoList = equipmentWorkLineService.findRunningData(mdcEquipment.getSaveTableName(), mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime());
                                if (mdcEquipmentDtoList == null || mdcEquipmentDtoList.isEmpty()) {
                                    continue;
                                }
                                MdcProcessCount mdcProcessCount = new MdcProcessCount();
                                mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId());
                                mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName());
                                mdcProcessCount.setTheDate(mdcShiftDateVo.getDay());
                                if (lastData != null && flag) {
                                    mdcProcessCount.setStartTime(lastData.getEndTime());
                                    startDate = mdcProcessCount.getStartTime();
                                    flag = false;
                                } else if (startDate == null) {
                                    mdcProcessCount.setStartTime(mdcEquipmentRunningSection.getStartTime());
                                    startDate = mdcProcessCount.getStartTime();
                                } else {
                                    mdcProcessCount.setStartTime(startDate);
                                }
                                if ("FANUC".equals(mdcEquipment.getDriveType())) {
                                    // æ³•兰克设备根据ProductCount字段判断
                                    String productCount = mdcEquipmentDtoList.get(0).get("ProductCount").toString();
                                    for (int i = 0; i < mdcEquipmentDtoList.size(); i++) {
                                        if (!productCount.equals(mdcEquipmentDtoList.get(i).get("ProductCount").toString())) {
                                            productCount = mdcEquipmentDtoList.get(i).get("ProductCount").toString();
                                            if (mdcEquipmentDtoList.get(i - 1).get("CollectTime") != null) {
                                                mdcProcessCount.setEndTime(DateUtils.toDate(mdcEquipmentDtoList.get(i - 1).get("CollectTime").toString(), DateUtils.STR_DATE_TIME));
                                                mdcProcessCount.setDuration(TimeFieldUtils.duration(mdcProcessCount.getStartTime(), mdcProcessCount.getEndTime()));
                                                mdcProcessCount.setSequenceNumber(mdcEquipmentDtoList.get(i - 1).get("Sequencenumber").toString());
                                                resultList.add(mdcProcessCount);
                                                if (TimeFieldUtils.duration(mdcProcessCount.getEndTime(), mdcEquipmentRunningSection.getEndTime()) > 60) {
                                                    //mdcProcessCount.setStartTime(mdcProcessCount.getEndTime());
                                                    startDate = mdcProcessCount.getEndTime();
                                                } else if (j + 1 < equipmentRunningSectionList.size()) {
                                                    //mdcProcessCount.setStartTime(equipmentRunningSectionList.get(j + 1).getStartTime());
                                                    startDate = equipmentRunningSectionList.get(j + 1).getStartTime();
                                                } else {
                                                    startDate = null;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return resultList;
    }
    private List<MdcShiftDateVo> getDatesListByMdcDeviceCalendarVo(MdcDeviceCalendarVo temp) {
        List<MdcShiftDateVo> result = new ArrayList<>();
        String startDateStr = temp.getStartDate();
        String endDateStr = temp.getEndDate();
        String sleepStartDateStr = temp.getSleepStartDate();
        String sleepEndDateStr = temp.getSleepEndDate();
        String effectiveDateStr = temp.getEffectiveDate();
        String overtimeStartTime = temp.getOvertimeStartTime();
        String overtimeEndTime = temp.getOvertimeEndTime();
        String eff = DateUtils.format(DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE), DateUtils.STR_DATE);
        try {
            Date effectiveDate = new SimpleDateFormat("yyyyMMdd").parse(effectiveDateStr);
            long startDate = getLongDate(effectiveDate, startDateStr, "false");
            long endDate = getLongDate(effectiveDate, endDateStr, temp.getIsDaySpan());
            //处理最后的时间问题 æ˜¯å¦è¶…过当前时间 å¦‚果超过不列入计算 BUG
            Date endTime = null;
            if ("true".equals(temp.getIsDaySpan())) {
                Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE);
                day = DateUtils.plusTime(day, 1);
                String dayTime = DateUtils.format(day, DateUtils.STR_DATE);
                endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL);
            } else {
                Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE);
                String dayTime = DateUtils.format(day, DateUtils.STR_DATE);
                endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL);
            }
            if (endTime.getTime() > DateUtils.getNow().getTime()) {
                return null;
            }
            if (StringUtils.isNotEmpty(sleepStartDateStr)) {
                long sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, "false");
                long sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, "false");
                Date start1 = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL);
                Date end1 = DateUtils.getFormatDate(eff + " " + sleepStartDateStr, DateUtils.STR_DATE_TIME_SMALL);
                Date start2 = DateUtils.getFormatDate(eff + " " + sleepEndDateStr, DateUtils.STR_DATE_TIME_SMALL);
                Date end2 = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL);
                if ("true".equals(temp.getIsDaySpan())) {
                    //跨天 åˆ¤æ–­ç­æ¬¡å¼€å§‹æ—¶é—´å’Œç»“束时间是否跨天
                    if (startDateStr.compareTo(endDateStr) < 0) {
                        //班次开始时间和结束时间都跨天
                        startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan());
                        start1 = DateUtils.addDays(start1, 1);
                        end2 = DateUtils.addDays(end2, 1);
                        //班次开始时间和结束时间都跨天 ä¼‘息开始时间和结束时间也一定跨天
                        sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan());
                        end1 = DateUtils.addDays(end1, 1);
                        sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
                        start2 = DateUtils.addDays(start2, 1);
                    } else {
                        //班次开始时间不跨天, ç»“束时间跨天
                        end2 = DateUtils.addDays(end2, 1);
                        //判断休息开始时间是否跨天
                        if (startDateStr.compareTo(sleepStartDateStr) > 0) {
                            //开始休息时间跨天, ç»“束休息时间也一定跨天
                            sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan());
                            end1 = DateUtils.addDays(end1, 1);
                            sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
                            start2 = DateUtils.addDays(start2, 1);
                        } else {
                            //休息开始时间不跨天, åˆ¤æ–­ä¼‘息结束时间是否跨天
                            if (sleepStartDateStr.compareTo(sleepEndDateStr) > 0) {
                                //休息结束时间跨天
                                sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
                                start2 = DateUtils.addDays(start2, 1);
                            }
                        }
                    }
                }
                MdcShiftDateVo dates1 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, sleepStartDate, effectiveDateStr, endTime, start1, end1);
                result.add(dates1);
                MdcShiftDateVo dates2 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), sleepEndDate, endDate, effectiveDateStr, endTime, start2, end2);
                result.add(dates2);
            } else {
                /*获取班次的开始时间结束时间*/
                Date start = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL);
                Date end = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL);
                if ("true".equals(temp.getIsDaySpan())) {
                    if (startDateStr.compareTo(endDateStr) < 0) {
                        startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan());
                        start = DateUtils.addDays(start, 1);
                    }
                    end = DateUtils.addDays(end, 1);
                }
                MdcShiftDateVo dates = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, endDate, effectiveDateStr, endTime, start, end);
                result.add(dates);
            }
            // å¤„理加班时间
            if (StringUtils.isNotEmpty(overtimeStartTime)) {
                Date start = DateUtils.getFormatDate(eff + " " + overtimeStartTime, DateUtils.STR_DATE_TIME_SMALL);
                Date end = DateUtils.getFormatDate(eff + " " + overtimeEndTime, DateUtils.STR_DATE_TIME_SMALL);
                if ("true".equals(temp.getIsDaySpan())) {
                    start = DateUtils.addDays(start, 1);
                    end = DateUtils.addDays(end, 1);
                }
                MdcShiftDateVo dates = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, endDate, effectiveDateStr, endTime, start, end);
                result.add(dates);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    private Map<String, List<MdcDeviceCalendarVo>> mdcDeviceCalendarMap(String equipmentId, List<String> stringDates) {
        List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentId, stringDates);
        if (mdcDeviceCalendarVos.isEmpty()) {
            return null;
        }
        Map<String, List<MdcDeviceCalendarVo>> map = new HashMap<>();
        for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
            List<MdcDeviceCalendarVo> mdcDeviceCalendarVos1;
            if (map.containsKey(mdcDeviceCalendarVo.getEffectiveDate())) {
                mdcDeviceCalendarVos1 = map.get(mdcDeviceCalendarVo.getEffectiveDate());
            } else {
                mdcDeviceCalendarVos1 = new ArrayList<>();
            }
            mdcDeviceCalendarVos1.add(mdcDeviceCalendarVo);
            map.put(mdcDeviceCalendarVo.getEffectiveDate(), mdcDeviceCalendarVos1);
        }
        return map;
    }
    private long getLongDate(Date effectiveDate, String startDateStr, String isDaySpan) {
        String[] startDateArray = startDateStr.split(":");
        Calendar cal = Calendar.getInstance();
        cal.setTime(effectiveDate);
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startDateArray[0]));
        cal.set(Calendar.MINUTE, Integer.parseInt(startDateArray[1]));
        cal.set(Calendar.SECOND, Integer.parseInt(startDateArray[2]));
        if ("true".equals(isDaySpan)) {
            cal.add(Calendar.DAY_OF_YEAR, 1);
        }
        return cal.getTime().getTime();
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java
@@ -18,4 +18,7 @@
    private String isDaySpan;
    private String equipmentName;
//    private String equipmentId;
    private String overtimeStartTime;
    private String overtimeEndTime;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java
@@ -41,4 +41,9 @@
     */
    private List<String> equipmentIdList;
    /**
     * è®¾å¤‡ç±»åž‹
     */
    private String equipmentType;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java
@@ -44,5 +44,9 @@
     * è®¾å¤‡ids
     */
    private List<String> equipmentIdList;
    /**
     * è®¾å¤‡ç±»åž‹
     */
    private String equipmentType;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyVo.java
@@ -18,4 +18,5 @@
    private List<MdcEfficiencyListDto> mdcEfficiencyList;
    private List<String> dates;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.jeecg.modules.mdc.vo;
import lombok.Data;
import java.util.List;
/**
 * @author Lius
 * @date 2023/12/7 16:55
 */
@Data
public class MdcProcessCountVo {
    private String equipmentId;
    private String equipmentIds;
    private String equipmentName;
    private String driveType;
    private String sequenceNumber;
    private String startTime;
    private String endTime;
    private String parentId;
    private String typeTree;
    private List<String> mdcSectionIds;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,6 +15,7 @@
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.system.util.JwtUtil;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.*;
import org.jeecg.common.util.encryption.EncryptedString;
@@ -29,7 +31,6 @@
import org.jeecg.modules.system.util.RandImageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -103,7 +104,7 @@
            return result;
        }*/
        //update-end-author:taoyan date:20190828 for:校验验证码
        //1. æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•ˆ
        //update-begin-author:wangshuai date:20200601 for: ç™»å½•代码验证用户是否注销bug,if条件永远为false
        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
@@ -119,10 +120,61 @@
        String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
        String syspassword = sysUser.getPassword();
        if (!syspassword.equals(userpassword)) {
            result.error500("用户名或密码错误");
            // èŽ·å–ç”¨æˆ·å¤±è´¥æœ€å¤§æ¬¡æ•°
            //Integer maxAttempts = CommonConstant.MAX_ATTEMPTS;
            List<DictModel> dictModels = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_MAX_ATTEMPTS);
            if (dictModels != null && !dictModels.isEmpty()) {
                Integer maxAttempts = Integer.valueOf(dictModels.get(0).getValue());
                if (redisUtil.hasKey(CommonConstant.PREFIX_LOGIN_COUNT + username)) {
                    Integer loginCount = (Integer) redisUtil.get(CommonConstant.PREFIX_LOGIN_COUNT + username) + 1;
                    if (loginCount < maxAttempts) {
                        result.error500("用户名或密码错误,请重新尝试。剩余尝试次数:" + (maxAttempts - loginCount));
                        redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, loginCount + 1, 300);
                    } else if (loginCount.equals(maxAttempts)) {
                        // è¶…过最大登录次数 é”å®šç”¨æˆ·
                        //sysUserService.update(new SysUser().setStatus(CommonConstant.USER_FREEZE), new UpdateWrapper<SysUser>().lambda().eq(SysUser::getUsername, username));
                        // èŽ·å–ç”¨æˆ·å¤±è´¥é”å®šæ—¶é•¿
                        List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FREEZE);
                        if (dictModelList != null && !dictModelList.isEmpty()) {
                            Integer userFreezeTime = Integer.valueOf(dictModelList.get(0).getValue());
                            redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, loginCount + 1, userFreezeTime * 60);
                            result.error500("用户名或密码错误,已到达最大尝试次数,请稍后尝试!");
                        } else {
                            //修改数据库锁定用户
                            sysUserService.update(new SysUser().setStatus(CommonConstant.USER_FREEZE), new UpdateWrapper<SysUser>().lambda().eq(SysUser::getUsername, username));
                            //删除redis信息
                            redisUtil.del(CommonConstant.PREFIX_LOGIN_COUNT + username);
                            result.error500("用户名或密码错误,已到达最大尝试次数,请联系管理员解锁!");
                        }
                    } else {
                        result.error500("您的账户已锁定,请稍后尝试!");
                    }
                } else {
                    redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, 1, 300);
                    result.error500("用户名或密码错误,请重新尝试。剩余尝试次数:" + (maxAttempts - 1));
                }
            } else {
                result.error500("用户名或密码错误");
            }
            //result.error500("用户名或密码错误");
            return result;
        } else {
            if (redisUtil.hasKey(CommonConstant.PREFIX_LOGIN_COUNT + username)) {
                List<DictModel> dictModels = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_MAX_ATTEMPTS);
                if (dictModels != null && !dictModels.isEmpty()) {
                    Integer maxAttempts = Integer.valueOf(dictModels.get(0).getValue());
                    Integer loginCount = (Integer) redisUtil.get(CommonConstant.PREFIX_LOGIN_COUNT + username);
                    if (loginCount < maxAttempts) {
                        redisUtil.del(CommonConstant.PREFIX_LOGIN_COUNT + username);
                    } else {
                        result.error500("您的账户已锁定,请稍后尝试!");
                        return result;
                    }
                }
            }
        }
        //用户登录信息
        userInfo(sysUser, result);
        //update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
@@ -161,7 +213,7 @@
            }
            //update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
            //update-end---author:scott ---date::2022-06-20  for:vue3前端,支持自定义首页--------------
            obj.put("userInfo",sysUser);
            obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
            result.setResult(obj);
@@ -170,7 +222,7 @@
        return result;
    }
    /**
     * é€€å‡ºç™»å½•
     * @param request
@@ -204,7 +256,7 @@
            return Result.error("Token无效!");
        }
    }
    /**
     * èŽ·å–è®¿é—®é‡
     * @return
@@ -235,7 +287,7 @@
        result.success("登录成功");
        return result;
    }
    /**
     * èŽ·å–è®¿é—®é‡
     * @return
@@ -256,8 +308,8 @@
        result.setResult(oConvertUtils.toLowerCasePageList(list));
        return result;
    }
    /**
     * ç™»é™†æˆåŠŸé€‰æ‹©ç”¨æˆ·å½“å‰éƒ¨é—¨
     * @param user
@@ -282,7 +334,7 @@
    /**
     * çŸ­ä¿¡ç™»å½•接口
     *
     *
     * @param jsonObject
     * @return
     */
@@ -298,12 +350,12 @@
            result.setSuccess(false);
            return result;
        }
        //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile;
        Object object = redisUtil.get(redisKey);
        //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
        if (object != null) {
            result.setMessage("验证码10分钟内,仍然有效!");
            result.setSuccess(false);
@@ -337,7 +389,7 @@
                    }
                    return result;
                }
                /**
                 * smsmode çŸ­ä¿¡æ¨¡æ¿æ–¹å¼  0 .登录模板、1.注册模板、2.忘记密码模板
                 */
@@ -355,12 +407,12 @@
                result.setSuccess(false);
                return result;
            }
            //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
            //验证码10分钟内有效
            redisUtil.set(redisKey, captcha, 600);
            //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
            //update-begin--Author:scott  Date:20190812 for:issues#391
            //result.setResult(captcha);
            //update-end--Author:scott  Date:20190812 for:issues#391
@@ -373,11 +425,11 @@
        }
        return result;
    }
    /**
     * æ‰‹æœºå·ç™»å½•接口
     *
     *
     * @param jsonObject
     * @return
     */
@@ -386,14 +438,14 @@
    public Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject) {
        Result<JSONObject> result = new Result<JSONObject>();
        String phone = jsonObject.getString("mobile");
        //校验用户有效性
        SysUser sysUser = sysUserService.getUserByPhone(phone);
        result = sysUserService.checkUserIsEffective(sysUser);
        if(!result.isSuccess()) {
            return result;
        }
        String smscode = jsonObject.getString("captcha");
        //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
@@ -429,9 +481,16 @@
        // ç”Ÿæˆtoken
        String token = JwtUtil.sign(username, syspassword);
        // èŽ·å–token缓存有效时间
        Integer expireTime = CommonConstant.TOKEN_EXPIRE_TIME;
        List<DictModel> dictModels = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_TOKEN_EXPIRE_TIME);
        if (dictModels != null && !dictModels.isEmpty()) {
            expireTime = Integer.valueOf(dictModels.get(0).getValue());
        }
        // è®¾ç½®token缓存有效时间
        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token, (long) (expireTime + 1) * 60 * 60);
        //redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, );
        obj.put("token", token);
        // update-begin--Author:sunjianlei Date:20210802 for:获取用户租户信息
@@ -505,13 +564,13 @@
            String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
            //存到redis中
            String lowerCaseCode = code.toLowerCase();
            //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
            // åŠ å…¥å¯†é’¥ä½œä¸ºæ··æ·†ï¼Œé¿å…ç®€å•çš„æ‹¼æŽ¥ï¼Œè¢«å¤–éƒ¨åˆ©ç”¨ï¼Œç”¨æˆ·è‡ªå®šä¹‰è¯¥å¯†é’¥å³å¯
            String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret();
            String realKey = Md5Util.md5Encode(origin, "utf-8");
            //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 ã€æ¼æ´žã€‘发现新漏洞待处理20220906
            redisUtil.set(realKey, lowerCaseCode, 60);
            log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
            //返回前端
@@ -535,7 +594,7 @@
        sysPermissionService.switchVue3Menu();
        return res;
    }
    /**
     * app登录
     * @param sysLoginModel
@@ -547,14 +606,14 @@
        Result<JSONObject> result = new Result<JSONObject>();
        String username = sysLoginModel.getUsername();
        String password = sysLoginModel.getPassword();
        //1. æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•ˆ
        SysUser sysUser = sysUserService.getUserByName(username);
        result = sysUserService.checkUserIsEffective(sysUser);
        if(!result.isSuccess()) {
            return result;
        }
        //2. æ ¡éªŒç”¨æˆ·åæˆ–密码是否正确
        String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
        String syspassword = sysUser.getPassword();
@@ -562,7 +621,7 @@
            result.error500("用户名或密码错误");
            return result;
        }
        String orgCode = sysUser.getOrgCode();
        if(oConvertUtils.isEmpty(orgCode)) {
            //如果当前用户无选择部门 æŸ¥çœ‹éƒ¨é—¨å…³è”信息
@@ -581,7 +640,7 @@
        JSONObject obj = new JSONObject();
        //用户登录信息
        obj.put("userInfo", sysUser);
        // ç”Ÿæˆtoken
        String token = JwtUtil.sign(username, syspassword);
        // è®¾ç½®è¶…æ—¶æ—¶é—´
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
@@ -179,6 +179,8 @@
        try {
            SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);
            user.setCreateTime(new Date());//设置创建时间
            user.setPasswordTime(new Date());//设置密码时间
            user.setPasswordFlag(CommonConstant.DEL_FLAG_1);//设置密码首次标识
            String salt = oConvertUtils.randomGen(8);
            user.setSalt(salt);
            String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);
@@ -638,17 +640,17 @@
        String oldpassword = json.getString("oldpassword");
        String password = json.getString("password");
        String confirmpassword = json.getString("confirmpassword");
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (!sysUser.getUsername().equals(username)) {
            return Result.error("只允许修改自己的密码!");
        }
        //LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        //if (!sysUser.getUsername().equals(username)) {
        //    return Result.error("只允许修改自己的密码!");
        //}
        SysUser user = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
        if (user == null) {
            return Result.error("用户不存在!");
        }
        //update-begin---author:wangshuai ---date:20220316  for:[VUEN-234]修改密码添加敏感日志------------
        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        baseCommonService.addLog("修改密码,username: " + loginUser.getUsername(), CommonConstant.LOG_TYPE_2, 2);
        //LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        baseCommonService.addLog("修改密码,username: " + username, CommonConstant.LOG_TYPE_2, 2);
        //update-end---author:wangshuai ---date:20220316  for:[VUEN-234]修改密码添加敏感日志------------
        return sysUserService.resetPassword(username, oldpassword, password, confirmpassword);
    }
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java
@@ -200,5 +200,15 @@
    @Dict(dicCode = "id",dictTable = "mom_base_area",dicText = "name")
    private String areaId;
    /**
     * å¯†ç é¦–次使用标识 1是 0否
     */
    private Integer passwordFlag;
    /**
     * å¯†ç æ›´æ–°æ—¶é—´
     */
    private Date passwordTime;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -11,8 +11,10 @@
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
import org.jeecg.common.desensitization.annotation.SensitiveEncode;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.SysUserCacheInfo;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.PasswordUtil;
import org.jeecg.common.util.UUIDGenerator;
import org.jeecg.common.util.oConvertUtils;
@@ -20,6 +22,7 @@
import org.jeecg.modules.system.entity.*;
import org.jeecg.modules.system.mapper.*;
import org.jeecg.modules.system.model.SysUserSysDepartModel;
import org.jeecg.modules.system.service.ISysDictService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.system.vo.MdcUserProVo;
import org.jeecg.modules.system.vo.SysUserDepVo;
@@ -74,6 +77,8 @@
    SysRoleIndexMapper sysRoleIndexMapper;
    @Resource
    MdcUserProductionMapper mdcUserProductionMapper;
    @Resource
    private ISysDictService sysDictService;
    @Override
    @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
@@ -89,8 +94,12 @@
        if (!newpassword.equals(confirmpassword)) {
            return Result.error("两次输入密码不一致!");
        }
        //设置密码更新时间
        //sysUser.setPasswordTime(new Date());
        //设置密码首次登录失效
        //sysUser.setPasswordFlag(CommonConstant.DEL_FLAG_0);
        String password = PasswordUtil.encrypt(username, newpassword, user.getSalt());
        this.userMapper.update(new SysUser().setPassword(password), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
        this.userMapper.update(new SysUser().setPassword(password).setPasswordTime(new Date()).setPasswordFlag(CommonConstant.DEL_FLAG_0), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
        return Result.ok("密码重置成功!");
    }
@@ -99,6 +108,8 @@
    public Result<?> changePassword(SysUser sysUser) {
        String salt = oConvertUtils.randomGen(8);
        sysUser.setSalt(salt);
        //设置密码更新时间
        sysUser.setPasswordTime(new Date());
        String password = sysUser.getPassword();
        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
        sysUser.setPassword(passwordEncode);
@@ -442,6 +453,32 @@
            result.error500("该用户已冻结");
            return result;
        }
        //情况4:根据用户信息查询,该用户密码系首次使用,需修改密码
        List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FIRST_LOGIN);
        if (dictList != null && !dictList.isEmpty()) {
            if (CommonConstant.DEL_FLAG_1.equals(Integer.valueOf(dictList.get(0).getValue())) && CommonConstant.DEL_FLAG_1.equals(sysUser.getPasswordFlag())) {
                baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "系首次登录系统,请重置密码!", CommonConstant.LOG_TYPE_1, null);
                result.setCode(5001);
                result.setMessage("用户密码系默认密码,需重置密码后重新登录密码!");
                result.setSuccess(false);
                return result;
            }
        }
        //情况5:根据用户信息查询,该用户密码是否已过更改周期
        Date passwordTime = sysUser.getPasswordTime();
        //Integer passwordExpirationPeriod = CommonConstant.PASSWORD_EXPIRATION_PERIOD;
        List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_PASSWORD_EXPIRATION);
        if (dictModelList != null && !dictModelList.isEmpty()) {
            Integer passwordExpirationPeriod = Integer.valueOf(dictModelList.get(0).getValue());
            Date dayAfter = DateUtils.getDayAfter(passwordTime, passwordExpirationPeriod);
            if (new Date().after(dayAfter)) {
                baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "密码已过有效期,请重置密码!", CommonConstant.LOG_TYPE_1, null);
                result.setCode(5002);
                result.setMessage("用户密码已过有效期,请重置密码!");
                result.setSuccess(false);
                return result;
            }
        }
        return result;
    }