浏览代码

feature 换线接口提交

xiahan 1 年之前
父节点
当前提交
96bf9ede20

+ 11 - 0
bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java

@@ -612,4 +612,15 @@ public class SaveConstans {
          */
         public static final String JOBSTATUS_TO_BE_END = "已完工";
     }
+
+    public static class CloseStatus{
+        /**
+         * 未完工
+         */
+        public static final String UNFINISHED="未完工";
+        /**
+         * 已完工
+         */
+        public static final String COMPLETED= "已完工";
+    }
 }

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsBlankOrderDao.java

@@ -62,4 +62,6 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
     BlankIdAndProcessStatusVo selectProcessStatusByProcessId(@Param("productProcessId") String productProcessId);
 
     List<String> getIdByLockTime(@Param("lockTime") Date LockTime,@Param("lockMark") String lockMark);
+
+    int checkConflictByBlankId(@Param("blankIds") List<String> blankIds);
 }

+ 3 - 4
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -3,10 +3,7 @@ package com.rongwei.bscommon.sys.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
 import com.rongwei.bsentity.domain.ApsProductDetailDo;
-import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
-import com.rongwei.bsentity.vo.GanttVos;
-import com.rongwei.bsentity.vo.OptionalEquipmentVo;
-import com.rongwei.bsentity.vo.ProcessIdRelationVo;
+import com.rongwei.bsentity.vo.*;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -75,6 +72,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
     void publishCancel(@Param("productIdList") List<String> productIdList);
 
     List<OptionalEquipmentVo> getOptionalEquipmentById(@Param("idList")List<String> id);
+
+    List<String> checkConflict(@Param("checkConflictVos") List<CheckConflictVo> checkConflictVos);
 }
 
 

+ 10 - 5
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java

@@ -31,7 +31,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.ZoneId;
 import java.util.*;
@@ -42,9 +41,9 @@ import static com.rongwei.safecommon.utils.SaveConstans.DatePattern.DATE_PATTERN
 import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.JOBSTATUS_TO_BE_START;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_N;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_Y;
-import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.*;
+import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.TO_BE_PUBLISHED;
+import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.TO_BE_SCHEDULED;
 import static com.rongwei.safecommon.utils.SaveConstans.SchedulingStatus.PUBLISHED;
-import static com.rongwei.safecommon.utils.SaveConstans.SchedulstatusTyep.SCHEDULSTATUS_TORELEASE;
 
 /**
  * <p>
@@ -148,13 +147,19 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             log.debug("坯料计划为空");
             return R.error("坯料计划id 必传");
         }
+        // 校验是否存在冲突的工序作业明细
+        int i = this.baseMapper.checkConflictByBlankId(blankIds);
+        if (i != 0) {
+            logger.error("所选坯料计划:{}存在冲突", blankIds);
+            return R.error("所选批量计划存在冲突");
+        }
+        // 判断是否存在已发布的工序作业
+        List<ApsBlankOrderDo> apsBlankOrderDos = this.baseMapper.selectBatchIds(blankIds);
         List<String> searchCondition = new ArrayList<String>() {{
             add("30");
             add("20");
             add("10");
         }};
-        // 判断是否存在已发布的工序作业
-        List<ApsBlankOrderDo> apsBlankOrderDos = this.baseMapper.selectBatchIds(blankIds);
         List<ApsBlankOrderDo> collect1 = apsBlankOrderDos.stream().filter(info -> !searchCondition.contains(info.getProductstatus())).collect(Collectors.toList());
         if (!collect1.isEmpty()) {
             logger.error("存在已开工的坯料计划:{}", collect1);

+ 155 - 5
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -1,28 +1,42 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationBackupDao;
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquBackupDao;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bsentity.domain.*;
-import com.rongwei.bsentity.vo.ChangingWiresVo;
-import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
-import com.rongwei.bsentity.vo.OptionalEquipmentVo;
-import com.rongwei.bsentity.vo.ProcessIdRelationVo;
+import com.rongwei.bsentity.vo.*;
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommon.utils.StringUtils;
+import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.*;
+import static com.rongwei.safecommon.utils.SaveConstans.MINUS_ONE;
 import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.*;
 
 /**
@@ -42,6 +56,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     private ApsProductionOrderService apsProductionOrderService;
     @Autowired
     private ApsProductDetailService apsProductDetailService;
+    @Autowired
+    private ApsProcessOperationBackupDao apsProcessOperationBackupDao;
+    @Autowired
+    private ApsProcessOperationProcessEquBackupDao apsProcessOperationProcessEquBackupDao;
 
     /**
      * 更新工序的待加工批次号信息
@@ -193,8 +211,140 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
      * @return
      */
     @Override
+    @Transactional
     public R changingWires(List<ChangingWiresVo> changingWiresVos) {
-        return null;
+        if (changingWiresVos.isEmpty()) {
+            log.error("换线作业的工序作业不为空");
+            return R.error("工序作业不能为空");
+        }
+        // 工序作业明细ID
+        List<String> detailIds = changingWiresVos.stream().map(ChangingWiresVo::getId).collect(Collectors.toList());
+        if (detailIds.isEmpty()) {
+            log.error("需要换线的工序作业id为空");
+            return R.error("需要换线的工序作业id为空");
+        }
+        // 获取工序作业明细
+        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = this.baseMapper.selectBatchIds(detailIds);
+        if (apsProcessOperationProcessEquDos.isEmpty()) {
+            log.error("无法获取到工序作业明细");
+            return R.error("无法获取到工序作业明细");
+        }
+        // 校验是否存在已完工的工序作业
+        boolean hasCompletedWork = apsProcessOperationProcessEquDos.stream()
+                .anyMatch(info -> JOBSTATUS_TO_BE_END.equals(info.getWorkstatus()));
+        if (hasCompletedWork) {
+            log.error("存在已完工的工序作业无法换线");
+            return R.error("存在已完工的工序作业无法换线");
+        }
+        // 是否需要清空备份
+        AtomicReference<Boolean> emptyBackup = new AtomicReference<>(false);
+        List<CheckConflictVo> checkConflictVos = new ArrayList<>();
+        List<ApsProcessOperationProcessEquDo> saveList = new ArrayList<>();
+        changingWiresVos.forEach(changingWiresVo -> {
+            // 工序作业明细
+            ApsProcessOperationProcessEquDo processEqus = apsProcessOperationProcessEquDos.stream()
+                    .filter(info -> changingWiresVo.getId().equals(info.getId()))
+                    .findFirst().orElse(null);
+
+            // 获取该工序作业最早的计划开始时间
+            Date planstartdate = processEqus.getPlanstartdate();
+            // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
+            long timeInterval = DateUtil.between(changingWiresVo.getProcessingTime(), planstartdate, DateUnit.SECOND,false);
+
+            // 待开工的直接修改
+            if (JOBSTATUS_TO_BE_START.equals(processEqus.getWorkstatus())) {
+                // 待开工的工序作业明细 直接更换加工设备 和车间
+                processEqus.setProcessworkshopid(changingWiresVo.getWorkshopId());
+                processEqus.setProcessworkshop(changingWiresVo.getWorkshopName());
+                processEqus.setProcessdeviceid(changingWiresVo.getEquId());
+                processEqus.setProcessdevice(changingWiresVo.getEquName());
+                processEqus.setPlanstartdate(DateUtil.offsetSecond(processEqus.getPlanstartdate(), (int) timeInterval));
+                processEqus.setPlanenddate(DateUtil.offsetSecond(processEqus.getPlanenddate(), (int) timeInterval));
+                checkConflictVos.add(new CheckConflictVo(processEqus.getId(), processEqus.getProcessdeviceid(),
+                        processEqus.getPlanstartdate(), processEqus.getPlanenddate()));
+                saveList.add(processEqus);
+            }
+            //加工中的状态 将未加工的改变为重新生成
+            if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus())) {
+                emptyBackup.set(true);
+                ApsProcessOperationProcessEquDo saveProcessEqu = new ApsProcessOperationProcessEquDo();
+                BeanUtils.copyProperties(processEqus, saveProcessEqu);
+
+                // 获取加工时长
+                long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND,false);
+                /************更新换线后工序作业的信息********************/
+                saveProcessEqu.setId(SecurityUtil.getUUID());
+                saveProcessEqu.setProcessworkshopid(changingWiresVo.getWorkshopId());
+                saveProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
+                saveProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
+                saveProcessEqu.setProcessdevice(changingWiresVo.getEquName());
+                // 更新计划完工时间
+                saveProcessEqu.setPlanenddate(CalculateCompletionTime(saveProcessEqu.getPlanstartdate(), processingTime,
+                        saveProcessEqu.getPlanprocessrall() - saveProcessEqu.getStartingroll(),
+                        saveProcessEqu.getPlanprocessrall()));
+                //计划加工卷数=计划加工卷数-已开工卷数
+                saveProcessEqu.setPlanprocessrall(saveProcessEqu.getPlanprocessrall() - saveProcessEqu.getStartingroll());
+                saveProcessEqu.setStartingroll(0);
+                saveProcessEqu.setReportroll(0);
+                saveProcessEqu.setCheckoutroll(0);
+                saveProcessEqu.setUnfinishroll(saveProcessEqu.getPlanprocessrall());
+                saveProcessEqu.setWorkstatus(JOBSTATUS_TO_BE_START);
+                saveProcessEqu.setClosestatus(SaveConstans.CloseStatus.UNFINISHED);
+                checkConflictVos.add(new CheckConflictVo(processEqus.getId(),saveProcessEqu.getProcessdeviceid(),
+                        saveProcessEqu.getPlanstartdate(), saveProcessEqu.getPlanenddate()));
+                saveList.add(saveProcessEqu);
+                /************更新原数据的数量信息***********************/
+                // 更新计划完工时间
+                processEqus.setPlanenddate(CalculateCompletionTime(processEqus.getPlanstartdate(), processingTime,
+                        processEqus.getStartingroll(), processEqus.getPlanprocessrall()));
+                //更新计划加工卷数
+                processEqus.setPlanprocessrall(processEqus.getStartingroll());
+                // 更新未完工卷数
+                processEqus.setUnfinishroll(processEqus.getPlanprocessrall() - processEqus.getReportroll());
+                processEqus.setWorkstatus(processEqus.getUnfinishroll() == 0 ? JOBSTATUS_TO_BE_END : JOBSTATUS_TO_BE_STARTING);
+                processEqus.setClosestatus(processEqus.getUnfinishroll() > 0 ? SaveConstans.CloseStatus.UNFINISHED : SaveConstans.CloseStatus.COMPLETED);
+                saveList.add(processEqus);
+            }
+        });
+        // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
+        if (!checkConflictVos.isEmpty()) {
+            List<String> promptInformation = this.baseMapper.checkConflict(checkConflictVos);
+            if(!promptInformation.isEmpty()){
+                log.error("存在冲突的工序作业");
+                return R.error(promptInformation.get(0));
+            }
+        }
+        if (emptyBackup.get()) {
+            SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+            List<SysOrganizationVo> organizationDoList = currentUser.getOrganizationDoList();
+            String factoryId = organizationDoList.stream()
+                    .filter(org -> MINUS_ONE.equals(org.getPid()))
+                    .map(SysOrganizationDo::getId)
+                    .distinct()
+                    .collect(Collectors.joining(","));
+            if (StringUtils.isBlank(factoryId)) {
+                factoryId = organizationDoList.stream().map(info -> info.getFullpid().split(",")[1]).distinct().collect(Collectors.joining(","));
+            }
+            apsProcessOperationBackupDao.deletedByBlankId(null, factoryId);
+            apsProcessOperationProcessEquBackupDao.deletedByBlankId(null, factoryId);
+        }
+        this.saveOrUpdateBatch(saveList);
+        return R.ok();
+    }
+
+    /**
+     * 计算计划完工时间
+     * = 计划开工时间+加工时长*已开工卷数/计划加工卷数
+     *
+     * @param planStartTime
+     * @param processingTime
+     * @param startingroll
+     * @param planprocessrall
+     * @return
+     */
+    private Date CalculateCompletionTime(Date planStartTime, long processingTime, int startingroll, int planprocessrall) {
+        int i = new BigDecimal(processingTime).multiply(new BigDecimal(startingroll)).divide(new BigDecimal(planprocessrall)).intValue();
+        return DateUtil.offsetSecond(planStartTime, i);
     }
 
     /**

+ 11 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml

@@ -173,4 +173,15 @@
             </foreach>
         </where>
     </update>
+    <select id="checkConflictByBlankId" resultType="java.lang.Integer">
+        select count(*) from aps_process_operation_process_equ
+            <where>
+                DELETED='0'
+                AND BLANKID in
+                <foreach collection="blankIds" item="id" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>">
+                AND (CONFLICTDES is not null or  CONFLICTDES !='' )
+            </where>
+    </select>
 </mapper>

+ 28 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -347,4 +347,32 @@
             </if>
         </where>
     </select>
+    <select id="checkConflict" resultType="java.lang.String">
+        select CONCAT("订单",apo1.ORDERNO,"-",
+            acm.CUSTOMERABBREVIATION,"的作业-",a.PROCESSNAME,"已发布,换线后存在冲突,不能换线") from
+        <foreach collection="checkConflictVos" separator="union all" item="data" open="(" close=")">
+            select apope.ID,apo.PROCESSNAME,apo.BLANKID  from aps_process_operation_process_equ  apope
+                left join aps_process_operation apo on apope.PROCESSID =apo.ID and apo.DELETED='0'
+            <where>
+                apope.DELETED='0'
+                AND apope.PROCESSDEVICEID =#{data.equId}
+                AND (
+                    (#{data.planStartDate} &lt; apope.PLANENDDATE and #{data.planEndDate} > apope.PLANSTARTDATE) or
+                    (apope.PLANSTARTDATE &lt;  #{data.planEndDate} and apope.PLANENDDATE > #{data.planStartDate})
+                    )
+                AND apope.ID != #{data.id}
+                AND apope.WORKSTATUS = '待开工'
+                AND apo.PROCESSSTATUS IN ('30','40')
+                limit 0,1
+            </where>
+        </foreach>
+                a left join aps_blank_order abo on a.BLANKID =abo.ID AND abo.DELETED='0'
+                  LEFT JOIN aps_production_order apo1 on apo1.ID=abo.PRODUCTIONORDERID and apo1.DELETED='0'
+                  LEFT JOIN aps_customer_management acm on acm.ID = apo1.CUSTOMID AND acm.DELETED='0'
+        <where>
+            a.ID IS NOT NULL
+            AND a.BLANKID is not null
+            limit 0,1
+        </where>
+    </select>
 </mapper>

+ 1 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ChangingWiresVo.java

@@ -7,6 +7,7 @@ import javax.validation.constraints.Future;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.List;
 
 /**
  * ChangingWiresVo class

+ 31 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckConflictVo.java

@@ -0,0 +1,31 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * CheckConflictVo class
+ *
+ * @author XH
+ * @date 2024/04/28
+ */
+@Data
+public class CheckConflictVo {
+    private String id;
+    /**
+     * 设备ID
+     */
+    private String equId;
+
+    private Date planStartDate;
+
+    private Date planEndDate;
+
+    public CheckConflictVo(String id,String equId, Date planStartDate, Date planEndDate) {
+        this.id = id;
+        this.equId = equId;
+        this.planStartDate = planStartDate;
+        this.planEndDate = planEndDate;
+    }
+}