From 5677ab158fb78d1267c16bbbf29eb690e0b4039f Mon Sep 17 00:00:00 2001
From: qushaowei <qushaowei@163.com>
Date: 星期三, 13 十二月 2023 16:53:39 +0800
Subject: [PATCH] Merge branch 'master' of http://117.34.109.166:18448/r/mdc_430 into develop

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java |  365 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 365 insertions(+), 0 deletions(-)

diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java
new file mode 100644
index 0000000..7db1dce
--- /dev/null
+++ b/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())) {
+                                    // 娉曞叞鍏嬭澶囨牴鎹甈roductCount瀛楁鍒ゆ柇
+                                    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();
+    }
+}

--
Gitblit v1.9.3