Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

fangpy 1 tahun lalu
induk
melakukan
7a1867c6f0
15 mengubah file dengan 488 tambahan dan 84 penghapusan
  1. 46 6
      bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java
  2. 4 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProductionOrderDao.java
  3. 12 2
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsReportRecordsDao.java
  4. 3 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsReportRecordsService.java
  5. 114 65
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  6. 33 2
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  7. 218 6
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java
  8. 1 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsCheckParameterDo.java
  9. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsReportRecordsDo.java
  10. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsWorkInProgressInventoryDo.java
  11. 2 2
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/GanttVos.java
  12. 2 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/OrganizationCodeAndDeviceCodeVo.java
  13. 13 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductTypeIdAndPidVo.java
  14. 22 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/SaveReportReq.java
  15. 8 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsReportRecordController.java

+ 46 - 6
bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java

@@ -1,9 +1,6 @@
 package com.rongwei.safecommon.utils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class SaveConstans {
 
@@ -627,15 +624,53 @@ public class SaveConstans {
     }
 
     /**
-     * 冲突描述
+     * 强制冲突描述
      */
-    public static class ConflictDescription {
+    public static class ForcedConflictsDescription {
+        /**
+         * 工序作业所需的设备必须在工序的可选设备之内
+         */
+        public static final String EQ_TYPE_SAME="工序作业所需的设备必须在工序的可选设备之内";
+        /**
+         * 第一步工序作业要小于开始排程时间
+         */
+        public static final String NO_PRE_GB_AFTER_NOW="第一步工序作业要小于开始排程时间";
+        /**
+         * 当前工序作业开始时间违反上一步工序作业最大等待时间限制
+         */
+        public static final String HAS_ONE_PRE_GB_AFTER_NOW="当前工序作业开始时间违反上一步工序作业最大等待时间限制";
+        /**
+         * 设备已排产时间段不可排产其它工序作业
+         */
+        public static final String EQUIPMENT_RUN_TIME="设备已排产时间段不可排产其它工序作业";
+        /**
+         * 上一工序作业流转时间不能大于上一工序作业最大等待时间
+         */
+        public static final String LZ_TIME_LESS_MAX_WAIT="上一工序作业流转时间不能大于上一工序作业最大等待时间";
+        /**
+         * 排程过程中出现相同设备排产时间段有交叉
+         */
+        public static final String EQ_TIME_CROSS="排程过程中出现相同设备排产时间段有交叉";
+
         /**
          * 加工时间冲突描述
          */
         public static final String CONFLICTING_PROCESSING_TIMES = "与其他作业加工时间重叠";
     }
 
+    /**
+     * 非强制冲突描述
+     */
+    public static class UNForcedConflictsDescription {
+        /**
+         * 订单交货期不满足
+         */
+        public static final String DELIVERY_DATE="订单交货期不满足";
+        /**
+         * 订单的连续生产要求不满足
+         */
+        public static final String SERIES_PRODUCE="订单的连续生产要求不满足";
+    }
     /**
      * 产品类型的外观 字典ID
      */
@@ -699,4 +734,9 @@ public class SaveConstans {
          */
         public static final String WAITING = "备料中";
     }
+
+    /**
+     * 初始化月份代号
+     */
+    public static final List<String> MONTH_CODE_LIST = Arrays.asList("1","2","3","4","5","6","7","8","9","X","Y","Z");
 }

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

@@ -3,6 +3,7 @@ package com.rongwei.bscommon.sys.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.ApsProductionOrderDo;
 import com.rongwei.bsentity.vo.ProductDetailIdAndPlanOutPutRollCountAllVo;
+import com.rongwei.bsentity.vo.ProductTypeIdAndPidVo;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
@@ -25,6 +26,9 @@ public interface ApsProductionOrderDao extends BaseMapper<ApsProductionOrderDo>
 
     @Select("select apd.ID,SUM(apop.PLANOUTPUTROLLCOUNT) AS 'PLANOUTPUTROLLCOUNTALL' from aps_product_detail apd LEFT JOIN aps_process_output_product apop ON apd.ID = apop.PRODUCTID AND apop.DELETED = 0 where apd.DELETED = 0 AND apd.MAINID = #{mainid} GROUP BY apd.ID")
     List<ProductDetailIdAndPlanOutPutRollCountAllVo> getProductDetailIdAndPlanOutPutRollCountAll(@Param("mainid") String mainid);
+
+    @Select("select b.ID AS 'id',a.PID AS 'pid' from (select * from sys_dict where DICTTYPE = 'productType' AND DELETED = 0) a RIGHT JOIN (select * from sys_dict where DELETED = 0 AND ID in ('${join}')) b ON a.ID = b.PID")
+    List<ProductTypeIdAndPidVo> selectProductTypeIdAndPid(@Param("join") String join);
 }
 
 

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

@@ -5,6 +5,7 @@ import com.rongwei.bsentity.domain.ApsCheckParameterDo;
 import com.rongwei.bsentity.domain.ApsParameterDo;
 import com.rongwei.bsentity.domain.ApsReportRecordsDo;
 import com.rongwei.bsentity.vo.OrganizationCodeAndDeviceCodeVo;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -34,8 +35,17 @@ public interface ApsReportRecordsDao extends BaseMapper<ApsReportRecordsDo> {
     @Select("select acp.ID AS 'id',acp.CKECKPARAMETER AS 'checkparameter' from aps_production_processes app LEFT JOIN aps_check_parameter acp ON app.ID = acp.MAINID AND acp.DELETED = 0 where app.PRODUCTPROCESSNAME = #{process}")
     List<ApsCheckParameterDo> selectApsCheckParameterByProcess(@Param("process") String process);
 
-//    @Select("select aci.EQUIPMENTCODE AS 'deviceCode',so.ROPTION AS 'organizationCode',aci.WAITREPORTID AS 'waitReportId' from asp_check_items aci LEFT JOIN sys_organization so ON aci.USEDEPTID = so.ID AND so.DELETED = 0 where aci.ID = #{processdeviceid} limit 1")
-//    OrganizationCodeAndDeviceCodeVo selectOrganizationCodeAndDeviceCode(@Param("processdeviceid") String processdeviceid);
+    @Update("update aps_process_operation set REPORTROLL = REPORTROLL+1 where ID = #{id}")
+    void updateProcessReportRoll(@Param("id") String id);
+
+    @Update("update asp_check_items set WAITREPORTID = null where ID = #{processdeviceid}")
+    void updateDeviceWorkId(@Param("processdeviceid") String processdeviceid);
+
+    @Delete("DELETE from aps_report_output where MAINID = #{id}")
+    void deleteOutputmaterialbyMainId(@Param("id") String id);
+
+    @Select("select aci.EQUIPMENTCODE AS 'deviceCode',so.ROPTION AS 'organizationCode',aci.WAITREPORTID AS 'waitReportId',aci.OWNEDFACTORY AS 'ownedFactory' from asp_check_items aci LEFT JOIN sys_organization so ON aci.USEDEPTID = so.ID AND so.DELETED = 0 where aci.ID = #{processdeviceid} limit 1")
+    OrganizationCodeAndDeviceCodeVo selectOrganizationCodeAndDeviceCode(@Param("processdeviceid") String processdeviceid);
 }
 
 

+ 3 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsReportRecordsService.java

@@ -2,6 +2,7 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsReportRecordsDo;
+import com.rongwei.bsentity.vo.SaveReportReq;
 import com.rongwei.bsentity.vo.StartRePortReq;
 import com.rongwei.rwcommon.base.R;
 
@@ -15,4 +16,6 @@ public interface ApsReportRecordsService extends IService<ApsReportRecordsDo> {
     R cancelRecord(Map<String, String> req);
 
     R startReport(StartRePortReq req);
+
+    R saveReport(SaveReportReq req);
 }

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

@@ -14,8 +14,6 @@ import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bscommon.sys.utils.ApsUtils;
 import com.rongwei.bsentity.domain.*;
 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;
@@ -34,11 +32,10 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
-import static com.rongwei.safecommon.utils.SaveConstans.ConflictDescription.CONFLICTING_PROCESSING_TIMES;
+import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.CONFLICTING_PROCESSING_TIMES;
 import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.*;
 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.MINUS_ONE;
 import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.*;
 
 /**
@@ -169,8 +166,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         ApsProcessOperationDo processOperationDo = apsProcessOperationService.getById(processId);
         //已开工卷数
         Integer startingroll = processOperationDo.getStartingroll();
+        //计划加工卷数
+        Integer planprocessrall = processOperationDo.getPlanprocessrall();
         //未完工卷数
-        Integer unfinishroll = processOperationDo.getUnfinishroll();
+        Integer unfinishroll = planprocessrall - startingroll;
         //计算作业状态
         /**
          * 如果已开工卷数=0,则=待开工;
@@ -185,7 +184,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         if (startingroll > 0 && apsProcessOperationDo.getClosestatus().equals("未完工")) {
             apsProcessOperationDo.setWorkstatus("加工中");
         }
-        if (unfinishroll == 0 && apsProcessOperationDo.getClosestatus().equals("已完工")) {
+        if (unfinishroll <= 0 && apsProcessOperationDo.getClosestatus().equals("已完工")) {
             apsProcessOperationDo.setWorkstatus("已完工");
         }
 
@@ -391,39 +390,26 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             // 找到更新时间之后存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(changeStartTimeVo.getQeuId(), changeStartTimeVo.getId(),
                     changeStartTimeVo.getPlanStartTime(), changeStartTimeVo.getPlanEndTime());
-            if (!beforeUpdatingConflictId.isEmpty()) {
-                beforeUpdatingConflictId.forEach(info->{
-                    String conflictdes = info.getConflictdes();
-                    if(StringUtils.isNotBlank(conflictdes)){
-                        List<String> conflictdeList = new ArrayList<>(Arrays.asList(conflictdes.split(",")));
-                        // 删除加工时间冲突描述
-                        conflictdeList.remove(CONFLICTING_PROCESSING_TIMES);
-                        if(conflictdeList.isEmpty()){
-                            info.setHasconflict(LOCKMARK_N);
-                        }
-                        info.setConflictdes(CollUtil.join(conflictdeList, ","));
-                    }
-                });
-                this.updateBatchById(beforeUpdatingConflictId);
-            }
+
             if (!afterTheUpdateConflictId.isEmpty()) {
                 processEquDo.setHasconflict(LOCKMARK_Y);
-                processEquDo.setConflictdes(CONFLICTING_PROCESSING_TIMES);
-                afterTheUpdateConflictId.forEach(info->{
-                    info.setHasconflict(LOCKMARK_Y);
-                    String conflictdes = info.getConflictdes();
-                    if(StringUtils.isNotBlank(conflictdes)){
-                        List<String> conflictdeList = new ArrayList<>(Arrays.asList(conflictdes.split(",")));
-                        if(!conflictdeList.contains(CONFLICTING_PROCESSING_TIMES)){
-                            conflictdeList.add(CONFLICTING_PROCESSING_TIMES);
-                        }
-                        info.setConflictdes(CollUtil.join(conflictdeList, ","));
-                    } else {
-                        info.setConflictdes(CONFLICTING_PROCESSING_TIMES);
-                    }
-                });
-                this.updateBatchById(afterTheUpdateConflictId);
+                // 更当前工序作业增加新的冲突
+                String newConflictsDesc = addNewConflictsDesc(processEquDo.getConflictdes(), CONFLICTING_PROCESSING_TIMES);
+                processEquDo.setConflictdes(newConflictsDesc);
+                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId,CONFLICTING_PROCESSING_TIMES);
+            }else{
+                String newConflictsDesc = removeConflictsDesc(processEquDo.getConflictdes(), CONFLICTING_PROCESSING_TIMES);
+                processEquDo.setConflictdes(newConflictsDesc);
+                processEquDo.setHasconflict(StringUtils.isBlank(processEquDo.getConflictdes()) &&
+                        StringUtils.isBlank(processEquDo.getSoftconflictdes()) ?
+                        LOCKMARK_N : LOCKMARK_Y);
+            }
+
+            if (!beforeUpdatingConflictId.isEmpty()) {
+                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId,CONFLICTING_PROCESSING_TIMES);
             }
+
+
             processEquDo.setPlanstartdate(changeStartTimeVo.getPlanStartTime());
             processEquDo.setPlanenddate(changeStartTimeVo.getPlanEndTime());
             this.updateById(processEquDo);
@@ -496,39 +482,26 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                     apsProcessOperationProcessEquDo.getProcessdeviceid(), id,
                     apsProcessOperationProcessEquDo.getPlanstartdate(), apsProcessOperationProcessEquDo.getPlanenddate());
 
-            if (!beforeUpdatingConflictId.isEmpty()) {
-                beforeUpdatingConflictId.forEach(info -> {
-                    String conflictdes = info.getConflictdes();
-                    if (StringUtils.isNotBlank(conflictdes)) {
-                        List<String> conflictdeList = new ArrayList<>(Arrays.asList(conflictdes.split(",")));
-                        // 删除加工时间冲突描述
-                        conflictdeList.remove(CONFLICTING_PROCESSING_TIMES);
-                        if (conflictdeList.isEmpty()) {
-                            info.setHasconflict(LOCKMARK_N);
-                        }
-                        info.setConflictdes(CollUtil.join(conflictdeList, ","));
-                    }
-                });
-                this.updateBatchById(beforeUpdatingConflictId);
-            }
             if (!afterTheUpdateConflictId.isEmpty()) {
                 apsProcessOperationProcessEquDo.setHasconflict(LOCKMARK_Y);
-                apsProcessOperationProcessEquDo.setConflictdes(CONFLICTING_PROCESSING_TIMES);
-                afterTheUpdateConflictId.forEach(info -> {
-                    info.setHasconflict(LOCKMARK_Y);
-                    String conflictdes = info.getConflictdes();
-                    if (StringUtils.isNotBlank(conflictdes)) {
-                        List<String> conflictdeList = new ArrayList<>(Arrays.asList(conflictdes.split(",")));
-                        if (!conflictdeList.contains(CONFLICTING_PROCESSING_TIMES)) {
-                            conflictdeList.add(CONFLICTING_PROCESSING_TIMES);
-                        }
-                        info.setConflictdes(CollUtil.join(conflictdeList, ","));
-                    } else {
-                        info.setConflictdes(CONFLICTING_PROCESSING_TIMES);
-                    }
-                });
+                // 更当前工序作业增加新的冲突
+                String newConflictsDesc = addNewConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), CONFLICTING_PROCESSING_TIMES);
+                apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId,CONFLICTING_PROCESSING_TIMES);
                 this.updateBatchById(afterTheUpdateConflictId);
+            }else{
+                // 更当前工序作业增加新的冲突
+                String newConflictsDesc = removeConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), CONFLICTING_PROCESSING_TIMES);
+                apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+                apsProcessOperationProcessEquDo.setHasconflict(StringUtils.isBlank(apsProcessOperationProcessEquDo.getConflictdes()) &&
+                        StringUtils.isBlank(apsProcessOperationProcessEquDo.getSoftconflictdes()) ?
+                        LOCKMARK_N : LOCKMARK_Y);
             }
+
+            if (!beforeUpdatingConflictId.isEmpty()) {
+                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId,CONFLICTING_PROCESSING_TIMES);
+            }
+
         }
         this.updateById(apsProcessOperationProcessEquDo);
         return R.ok();
@@ -689,6 +662,82 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             }
         }
     }
+
+    /**
+     * 更新设备或者时间之后 更新冲突描述
+     * @param beforeUpdatingConflictId 当前作业更新设备或者时间之后与该作业存在冲突的工序作业信息
+     * @param removeConflictsDesc 需要被删除的冲突描述
+     */
+    public void updateProcessEquBeforeAddConflictsDesc(List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId,
+                                                      String removeConflictsDesc) {
+        if (beforeUpdatingConflictId.isEmpty()) {
+            return;
+        }
+        beforeUpdatingConflictId.forEach(info->{
+            // 判断是否和其他工序作业明细存在从头
+            List<ApsProcessOperationProcessEquDo> conflictId = this.baseMapper.getConflictId(info.getProcessdeviceid(), info.getId(), info.getPlanstartdate(), info.getPlanenddate());
+            if(!conflictId.isEmpty()){
+                info.setConflictdes(removeConflictsDesc(info.getConflictdes(), removeConflictsDesc));
+                info.setHasconflict(StringUtils.isBlank(info.getConflictdes()) &&
+                        StringUtils.isBlank(info.getSoftconflictdes()) ?
+                        LOCKMARK_N : LOCKMARK_Y);
+            }
+
+        });
+        this.updateBatchById(beforeUpdatingConflictId);
+    }
+
+
+    /**
+     * 更新设备或者时间之后 更新冲突描述
+     * @param afterTheUpdateConflictId 当前作业更新设备或者时间之后与该作业存在冲突的工序作业信息
+     * @param conflictsDesc 冲突描述
+     */
+    public void updateProcessEquAfterAddConflictsDesc(List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId,
+                                                      String conflictsDesc) {
+        if (afterTheUpdateConflictId.isEmpty()) {
+            return;
+        }
+        afterTheUpdateConflictId.forEach(info -> {
+            String newConflictsDesc = addNewConflictsDesc(info.getConflictdes(), conflictsDesc);
+            info.setConflictdes(newConflictsDesc);
+            info.setHasconflict(StringUtils.isBlank(info.getConflictdes()) && StringUtils.isBlank(info.getSoftconflictdes()) ?
+                    LOCKMARK_N : LOCKMARK_Y);
+        });
+        this.updateBatchById(afterTheUpdateConflictId);
+    }
+
+    /**
+     *  增加 新的冲突
+     * @param oldConflictDesc 工序作业的旧冲突
+     * @param newConflictDesc 需要新增的冲突
+     * @return
+     */
+    public String addNewConflictsDesc(String oldConflictDesc, String newConflictDesc){
+        if(StringUtils.isBlank(oldConflictDesc)){
+            return newConflictDesc;
+        }
+        List<String> conflictdeList = new ArrayList<>(Arrays.asList(oldConflictDesc.split(";")));
+        if (!conflictdeList.contains(newConflictDesc)) {
+            conflictdeList.add(newConflictDesc);
+        }
+       return CollUtil.join(conflictdeList, ";");
+    }
+
+    /**
+     * 删除旧冲突
+     * @param oldConflictDesc 工序作业的旧冲突
+     * @param removeConflictDesc 需要删除的冲突
+     * @return
+     */
+    public String removeConflictsDesc(String oldConflictDesc, String removeConflictDesc){
+        if(StringUtils.isBlank(oldConflictDesc)){
+            return oldConflictDesc;
+        }
+        List<String> conflictdeList = new ArrayList<>(Arrays.asList(oldConflictDesc.split(";")));
+        conflictdeList.remove(removeConflictDesc);
+        return CollUtil.join(conflictdeList, ";");
+    }
 }
 
 

+ 33 - 2
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.rongwei.bscommon.sys.service.impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.service.ApsProductionOrderService;
@@ -14,6 +15,7 @@ import com.rongwei.bsentity.domain.ApsProductionOrderDo;
 import com.rongwei.bsentity.vo.ApsProductDetailVo;
 import com.rongwei.bsentity.vo.CheckAndSaveOrUpdateOrderReq;
 import com.rongwei.bsentity.vo.ProductDetailIdAndPlanOutPutRollCountAllVo;
+import com.rongwei.bsentity.vo.ProductTypeIdAndPidVo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.safecommon.utils.SaveConstans;
 import org.slf4j.Logger;
@@ -23,6 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -123,8 +126,8 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         List<ApsProductionMergeOrderDo> apsProductionMergeOrderDoList = req.getApsProductionMergeOrderDoList();
         //产品明细信息
         List<ApsProductDetailVo> apsProductDetailVoList = req.getApsProductDetailVoList();
-        //坯料计划信息
-        List<ApsBlankOrderDo> apsBlankOrderDoList = req.getApsBlankOrderDoList();
+        //坯料计划信息(坯料计划是一保存的状态,校验直接通过数据库查询)
+        List<ApsBlankOrderDo> apsBlankOrderDoList = apsBlankOrderDao.selectList(new QueryWrapper<ApsBlankOrderDo>().lambda().eq(ApsBlankOrderDo::getProductionorderid, apsProductionOrderDo.getId()));
         //是否需要检验坯料计划是否已排程
         Boolean checkSchedule = req.getCheckSchedule();
 
@@ -189,6 +192,34 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
             }
         }
 
+        //===============校验产品明细的长===================
+        if (ObjectUtil.isEmpty(apsProductDetailVoList)) {
+            return R.error("产品明细至少有一个");
+        }
+
+        //获取产品明细的所有产品类型ID(去重)
+        Set<String> productTypeIds = apsProductDetailVoList.stream().map(ApsProductDetailVo::getProducttypeid).collect(Collectors.toSet());
+        String join = String.join("','", productTypeIds);
+
+        List<ProductTypeIdAndPidVo> productTypeIdAndPidList = this.baseMapper.selectProductTypeIdAndPid(join);
+        if (ObjectUtil.isNotEmpty(productTypeIdAndPidList)) {
+            for (ProductTypeIdAndPidVo productTypeIdAndPidVo : productTypeIdAndPidList) {
+                for (int i = 0; i < apsProductDetailVoList.size(); i++) {
+                    ApsProductDetailVo apsProductDetailVo = apsProductDetailVoList.get(i);
+                    if (apsProductDetailVo.getProducttypeid().equals(productTypeIdAndPidVo.getId())) {
+                        //如果是铝板或铝锭
+                        if (productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.LVBAN_ID) || productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.BANDING_ID)) {
+                            //判断长度是否为空
+                            if (ObjectUtil.isEmpty(apsProductDetailVo.getProlength())) {
+                                return R.error("第" + (i + 1) + "个产品明细,产品类型是铝板或板锭时长度必填");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        //================循环校验坯料计划===============
 
 
         return null;

+ 218 - 6
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java

@@ -8,14 +8,14 @@ import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bsentity.domain.*;
 
-import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
-import com.rongwei.bsentity.vo.InsertMyReportOutputReq;
-import com.rongwei.bsentity.vo.OrganizationCodeAndDeviceCodeVo;
-import com.rongwei.bsentity.vo.StartRePortReq;
+import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
+import com.rongwei.safecommon.fegin.CXAdminFeginClient;
 import com.rongwei.safecommon.utils.CXCommonUtils;
+import com.rongwei.safecommon.utils.SaveConstans;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -60,6 +60,8 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
     private ApsAlloyCompositionService apsAlloyCompositionService;
     @Autowired
     private ApsReportBlankCompentService apsReportBlankCompentService;
+    @Resource
+    private CXAdminFeginClient cxAdminFeginClient;
 
     @Override
     @Transactional
@@ -207,6 +209,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         apsReportRecordsDo.setReportworktime(DateUtil.date());
         //报工状态
         apsReportRecordsDo.setReportworkstatus("已开工");
+        apsReportRecordsDo.setCheckstatus("待检验");
 
         //保存主表
         this.save(apsReportRecordsDo);
@@ -287,7 +290,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 apsReportCheckoutDo.setId(SecurityUtil.getUUID());
                 apsReportCheckoutDo.setTenantid(tenantId);
                 apsReportCheckoutDo.setMainid(apsReportRecordsDo.getId());
-                apsReportCheckoutDo.setCheckitem(apsCheckParameterDo.getCkeckparameter());
+                apsReportCheckoutDo.setCheckitem(apsCheckParameterDo.getCheckparameter());
                 needInsertApsReportCheckList.add(apsReportCheckoutDo);
             }
             if (ObjectUtil.isNotEmpty(needInsertApsReportCheckList)) {
@@ -311,7 +314,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             } else {//查询国标
                 List<ApsAlloyDo> collect1 = apsAlloyDoList.stream().filter(item -> ObjectUtil.isEmpty(item.getCustomerid())).collect(Collectors.toList());
                 if (ObjectUtil.isNotEmpty(collect1)) {
-                    alloyId = collect.get(0).getId();
+                    alloyId = collect1.get(0).getId();
                 }
             }
         }
@@ -348,6 +351,215 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         return R.ok(apsReportRecordsDo);
     }
 
+    @Override
+    @Transactional
+    public R saveReport(SaveReportReq req) {
+        //报工主表
+        ApsReportRecordsDo apsReportRecordsDo = req.getApsReportRecordsDo();
+        //报工输出物料
+        List<ApsReportOutputDo> apsReportOutputDoList = req.getApsReportOutputDoList();
+        //报工加工参数
+        List<ApsReportMachiningDo> apsReportMachiningDoList = req.getApsReportMachiningDoList();
+
+        //没有新增,只会更新
+        apsReportRecordsDo.setCheckstatus("待检验");
+
+        if (ObjectUtil.isNotEmpty(apsReportOutputDoList)) {
+            apsReportOutputService.updateBatchById(apsReportOutputDoList);
+        }
+        if (ObjectUtil.isNotEmpty(apsReportMachiningDoList)) {
+            apsReportMachiningService.updateBatchById(apsReportMachiningDoList);
+        }
+
+        //查询当前的报工记录信息
+        ApsReportRecordsDo nowReportRecordsDo = this.getById(apsReportRecordsDo.getId());
+
+        //查询对应的工序作业信息
+        ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationService.getById(nowReportRecordsDo.getProcessoperationid());
+        //查询对应的工序作业明细信息
+        ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = apsProcessOperationProcessEquService.getById(nowReportRecordsDo.getProcessequid());
+        //查询对应的坯料计划信息
+        ApsBlankOrderDo apsBlankOrderDo = apsBlankOrderService.getById(apsProcessOperationDo.getBlankid());
+        //查询对应的订单评审信息
+        ApsProductionOrderDo apsProductionOrderDo = apsProductionOrderService.getById(apsBlankOrderDo.getProductionorderid());
+
+        //=============更新作业明细信息=============
+        //更新待报工记录ID、已报工卷数
+        //已报工卷数
+        Integer reportroll = apsProcessOperationProcessEquDo.getReportroll();
+        ApsProcessOperationProcessEquDo needUpdateProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
+        needUpdateProcessOperationProcessEquDo.setId(apsProcessOperationProcessEquDo.getId());
+        //已报工卷数+1
+        needUpdateProcessOperationProcessEquDo.setReportroll(reportroll + 1);
+        /**
+         * 更新作业明细的完工状态
+         * 如果未完工卷数=0,或者工序作业已完工状态=已完工,则=已完工
+         * 如果未完工卷数>0,并且工序作业已完工状态=未完工,则=未完工
+         */
+        //计划加工卷数
+        Integer planprocessrall = apsProcessOperationProcessEquDo.getPlanprocessrall();
+        //未完工卷数=计划加工卷数-已报工卷数
+        int unfinishroll = planprocessrall - needUpdateProcessOperationProcessEquDo.getReportroll();
+        if(unfinishroll <= 0 || apsProcessOperationDo.getClosestatus().equals("已完工")){
+            needUpdateProcessOperationProcessEquDo.setClosestatus("已完工");
+        }
+        if(unfinishroll > 0 && apsProcessOperationDo.getClosestatus().equals("未完工")){
+            needUpdateProcessOperationProcessEquDo.setClosestatus("未完工");
+        }
+
+        //带报工记录ID清空
+        needUpdateProcessOperationProcessEquDo.setWaitreportid("");
+        if (apsProcessOperationProcessEquDo.getClosestatus().equals("未完工") && apsProcessOperationProcessEquDo.getStartingroll() > 0) {
+            needUpdateProcessOperationProcessEquDo.setWorkstatus("加工中");
+        }
+        apsProcessOperationProcessEquService.updateById(needUpdateProcessOperationProcessEquDo);
+
+        //==============更新工序作业信息==============
+        this.baseMapper.updateProcessReportRoll(apsProcessOperationDo.getId());
+
+        //=============更新设备的报工记录ID===========
+        this.baseMapper.updateDeviceWorkId(apsProcessOperationProcessEquDo.getProcessdeviceid());
+
+        //============保存(报工)时,生成炉号和批次号=============
+        //获取设备/炉 的炉号(每月、每个设备/炉 更新)
+        String heatNumber;//初始化炉号
+        //调用通用接口生成炉号
+        SysSerialVo vo = new SysSerialVo();
+        vo.setModulecode("aps_report_output_heat_" + apsProcessOperationProcessEquDo.getProcessdeviceid());
+        vo.setRuleTemplateStr("@{serialNumber:#000}");
+        vo.setResetrule("date:yyyyMM");
+        vo.setIfautomaticreset("y");
+        vo.setInitValue(0L);
+        Map<String, Object> codeData = cxAdminFeginClient.getSerialNumberCode(vo).getData();
+        heatNumber = codeData.get("code").toString();
+
+        apsReportRecordsDo.setHeatnumber(heatNumber);
+        //报工状态
+        apsReportRecordsDo.setReportworkstatus("已报工");
+        this.updateById(apsReportRecordsDo);
+
+        //物理删除原来的报工记录输出物料
+        this.baseMapper.deleteOutputmaterialbyMainId(apsReportRecordsDo.getId());
+
+        OrganizationCodeAndDeviceCodeVo organizationCodeAndDeviceCodeVo = this.baseMapper.selectOrganizationCodeAndDeviceCode(apsProcessOperationProcessEquDo.getProcessdeviceid());
+        if (ObjectUtil.isEmpty(organizationCodeAndDeviceCodeVo)) {
+            return R.error("未找到对应的车间代号和设备代号");
+        }
+        InsertMyReportOutputReq insertMyReportOutputReq = new InsertMyReportOutputReq();
+        insertMyReportOutputReq.setMainId(apsReportRecordsDo.getId());
+        insertMyReportOutputReq.setProcessId(apsProcessOperationDo.getId());
+        insertMyReportOutputReq.setIfBlankProcess(apsProcessOperationDo.getIfblankprocess());
+        insertMyReportOutputReq.setDeviceId(apsProcessOperationProcessEquDo.getProcessdeviceid());
+        insertMyReportOutputReq.setMark(organizationCodeAndDeviceCodeVo.getOrganizationCode());
+        insertMyReportOutputReq.setYearCode((DateUtil.year(DateUtil.date()) % 100) + "");
+        insertMyReportOutputReq.setMonthCode(SaveConstans.MONTH_CODE_LIST.get(DateUtil.month(DateUtil.date())));
+        insertMyReportOutputReq.setEquipmentCode(organizationCodeAndDeviceCodeVo.getDeviceCode());
+        insertMyReportOutputReq.setHeatNumber(heatNumber);
+        insertMyReportOutputReq.setInputBatchNumber(apsReportRecordsDo.getBatchnumber());
+        insertMyReportOutputReq.setBlankType(apsBlankOrderDo.getBlanktype());
+
+        R r = apsReportOutputService.insertMyReportOutput(insertMyReportOutputReq);
+        if (!r.getCode().equals("200")) {
+            return R.error(r.getMsg());
+        }
+
+        //=================新增在制品库存=================
+        //查询报工记录对应的物料子表
+        List<ApsReportOutputDo> apsReportOutputDos = apsReportOutputService.list(new QueryWrapper<ApsReportOutputDo>().lambda().eq(ApsReportOutputDo::getMainid, apsReportRecordsDo.getId()));
+
+        if (ObjectUtil.isNotEmpty(apsReportOutputDos)) {
+            //如果主表的批次号不为空,查找 在制品库存中是否有此 批次号 的数据,有 复制并删除原数据,坯料批次号 等坯料数据不变,其余数据变更
+            if (ObjectUtil.isNotEmpty(apsReportRecordsDo.getBatchnumber())) {
+                ApsWorkInProgressInventoryDo apsWorkInProgressInventoryDo = apsWorkInProgressInventoryService.getOne(new QueryWrapper<ApsWorkInProgressInventoryDo>().lambda().eq(ApsWorkInProgressInventoryDo::getDeleted, "0").eq(ApsWorkInProgressInventoryDo::getBatchnumber, apsReportRecordsDo.getBatchnumber()));
+                //不为空,则删除数据(逻辑删除)
+                if(ObjectUtil.isNotEmpty(apsWorkInProgressInventoryDo)){
+                    apsWorkInProgressInventoryService.removeById(apsWorkInProgressInventoryDo.getId());
+                }
+                //增加或者复制在制品库存
+                addOrCopyWorkInProgress(apsReportOutputDos,
+                        apsWorkInProgressInventoryDo,
+                        apsProcessOperationProcessEquDo,
+                        apsProcessOperationDo,
+                        organizationCodeAndDeviceCodeVo,
+                        apsProductionOrderDo);
+            } else {
+                addOrCopyWorkInProgress(apsReportOutputDos,
+                        null,
+                        apsProcessOperationProcessEquDo,
+                        apsProcessOperationDo,
+                        organizationCodeAndDeviceCodeVo,
+                        apsProductionOrderDo);
+            }
+        }
+
+        //=========更新生产状态等=============
+        //更新生产状态
+        CommonUpdateProductionStatusReq req3 = new CommonUpdateProductionStatusReq();
+        req3.setProcessOperationEquId(apsProcessOperationProcessEquDo.getId());
+        R r2 = apsProcessOperationProcessEquService.updateProductionStatus(req3);
+        if (!r2.getCode().equals("200")) {
+            return R.error(r2.getMsg());
+        }
+
+        return R.ok();
+    }
+
+    private void addOrCopyWorkInProgress(List<ApsReportOutputDo> apsReportOutputDos,
+                                         ApsWorkInProgressInventoryDo apsWorkInProgressInventoryDo,
+                                         ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo,
+                                         ApsProcessOperationDo apsProcessOperationDo,
+                                         OrganizationCodeAndDeviceCodeVo organizationCodeAndDeviceCodeVo,
+                                         ApsProductionOrderDo apsProductionOrderDo) {
+        List<ApsWorkInProgressInventoryDo> needAddWorkInProgressInventoryList = new LinkedList<>();
+        for (ApsReportOutputDo apsReportOutputDo : apsReportOutputDos) {
+            ApsWorkInProgressInventoryDo workInProgressInventoryDo = new ApsWorkInProgressInventoryDo();
+            workInProgressInventoryDo.setId(SecurityUtil.getUUID());
+            //报工输出物料的批次号
+            workInProgressInventoryDo.setBlankbatchnumber(apsReportOutputDo.getOutputnumber());
+            //报工输出物料的主键ID
+            workInProgressInventoryDo.setBlankid(apsReportOutputDo.getId());
+            //报工输出物料的报工物料描述
+            workInProgressInventoryDo.setBlankname(apsReportOutputDo.getOutputmaterial());
+            if (ObjectUtil.isNotEmpty(apsWorkInProgressInventoryDo)) {
+                workInProgressInventoryDo.setBlankbatchnumber(apsWorkInProgressInventoryDo.getBlankbatchnumber());
+                workInProgressInventoryDo.setBlankid(apsWorkInProgressInventoryDo.getBlankid());
+                workInProgressInventoryDo.setBlankname(apsWorkInProgressInventoryDo.getBlankname());
+            }
+            //报工记录对应的作业明细ID
+            workInProgressInventoryDo.setProcessoperationequid(apsProcessOperationProcessEquDo.getId());
+            //报工记录对应的工序作业ID
+            workInProgressInventoryDo.setProcessoperationid(apsProcessOperationDo.getId());
+            //报工记录ID
+            workInProgressInventoryDo.setWorkreportrecordid(apsProcessOperationProcessEquDo.getWaitreportid());
+            //报工记录输出物料对应的工序作业输出物料的主键ID
+            workInProgressInventoryDo.setJoboutputmaterialid(apsReportOutputDo.getOutputid());
+            //报工记录输出物料的主键ID
+            workInProgressInventoryDo.setReportoutputmaterialid(apsReportOutputDo.getId());
+            //输出物料的批次号
+            workInProgressInventoryDo.setBatchnumber(apsReportOutputDo.getOutputnumber());
+            //报工记录输出物料的报工物料描述
+            workInProgressInventoryDo.setWorkinprocess(apsReportOutputDo.getOutputmaterial());
+            //报工记录的报工日期
+            workInProgressInventoryDo.setProductdate(DateUtil.date());
+            //报工记录对应工序作业的加工设备所属工厂名称
+            workInProgressInventoryDo.setProductfactory(organizationCodeAndDeviceCodeVo.getOwnedFactory());
+            //报工记录对应工序作业明细的加工车间
+            workInProgressInventoryDo.setProductworkshop(apsProcessOperationProcessEquDo.getProcessworkshop());
+            //报工记录对应工序作业明细的加工设备
+            workInProgressInventoryDo.setProductdevice(apsProcessOperationProcessEquDo.getProcessdevice());
+            //工序作业的客户名称
+            workInProgressInventoryDo.setCustomername(apsProductionOrderDo.getCustomname());
+            //报工记录对应工序作业的订单号
+            workInProgressInventoryDo.setOrdernumber(apsProductionOrderDo.getOrderno());
+            workInProgressInventoryDo.setWorkinprocessstatus("待检验");
+
+            needAddWorkInProgressInventoryList.add(workInProgressInventoryDo);
+        }
+        if (ObjectUtil.isNotEmpty(needAddWorkInProgressInventoryList)) {
+            apsWorkInProgressInventoryService.saveBatch(needAddWorkInProgressInventoryList);
+        }
+    }
+
 }
 
 

+ 1 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsCheckParameterDo.java

@@ -68,7 +68,7 @@ public class ApsCheckParameterDo implements Serializable {
     /**
      * 检查项
      */
-    private String ckeckparameter;
+    private String checkparameter;
 
     /**
      * 工序表ID

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsReportRecordsDo.java

@@ -113,6 +113,11 @@ public class ApsReportRecordsDo extends BaseDo implements Serializable {
      */
     private String processequid;
 
+    /**
+     * 炉次/炉号
+     */
+    private String heatnumber;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsWorkInProgressInventoryDo.java

@@ -48,6 +48,11 @@ public class ApsWorkInProgressInventoryDo extends BaseDo implements Serializable
      */
     private String blankname;
 
+    /**
+     * 工序作业明细ID
+     */
+    private String processoperationequid;
+
     /**
      * 工序作业ID
      */

+ 2 - 2
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/GanttVos.java

@@ -145,10 +145,10 @@ public class GanttVos {
     /**
      *非强制冲突描述
      */
-    private String conflictdes;
+    private String conflictdes ="";
 
     /**
      * 强制冲突描述
      */
-    private String softconflictdes;
+    private String softconflictdes  ="";
 }

+ 2 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/OrganizationCodeAndDeviceCodeVo.java

@@ -14,4 +14,6 @@ public class OrganizationCodeAndDeviceCodeVo {
     private String deviceCode;
     //此设备带报工记录ID
     private String waitReportId;
+    //设备所属工厂
+    private String ownedFactory;
 }

+ 13 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductTypeIdAndPidVo.java

@@ -0,0 +1,13 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2024/5/11
+ */
+@Data
+public class ProductTypeIdAndPidVo {
+    private String id;
+    private String pid;
+}

+ 22 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/SaveReportReq.java

@@ -0,0 +1,22 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.ApsReportMachiningDo;
+import com.rongwei.bsentity.domain.ApsReportOutputDo;
+import com.rongwei.bsentity.domain.ApsReportRecordsDo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author :sc
+ * @since :2024/5/10
+ */
+@Data
+public class SaveReportReq {
+    //报工记录主表
+    private ApsReportRecordsDo apsReportRecordsDo;
+    //报工记录物料子表
+    private List<ApsReportOutputDo> apsReportOutputDoList;
+    //报工记录加工参数子表
+    private List<ApsReportMachiningDo> apsReportMachiningDoList;
+}

+ 8 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsReportRecordController.java

@@ -2,6 +2,7 @@ package com.rongwei.bsserver.controller;
 
 
 import com.rongwei.bscommon.sys.service.ApsReportRecordsService;
+import com.rongwei.bsentity.vo.SaveReportReq;
 import com.rongwei.bsentity.vo.StartRePortReq;
 import com.rongwei.rwcommon.base.R;
 import lombok.extern.slf4j.Slf4j;
@@ -52,5 +53,12 @@ public class ApsReportRecordController {
         return apsReportRecordsService.startReport(req);
     }
 
+    /**
+     * 报工保存
+     */
+    @PostMapping("/saveReport")
+    public R saveReport(@RequestBody SaveReportReq req){
+        return apsReportRecordsService.saveReport(req);
+    }
 }