소스 검색

feature 报工检验代码提交

xiahan 11 달 전
부모
커밋
f071d9ea8f

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

@@ -103,6 +103,9 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
                                                                 @Param("oldStartDate")  Date oldStartDate,
                                                                 @Param("oldEndDate")  Date oldEndDate,
                                                                 @Param("currentProcessWay") String currentProcessWay);
+
+    List<ApsProcessOperationProcessEquDo> getDataByInputIdAndId(@Param("inputId")String inputId,
+                                                                @Param("ids")List<String> ids);
 }
 
 

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

@@ -2136,7 +2136,8 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
     processOperationProcessEquDo:作业明细
      */
     @Transactional
-    public R cancelProcessOperationEqu(Integer curEquCancelRoll, ApsProcessOperationDo apsProcessOperationDo, ApsProcessOperationProcessEquDo processOperationProcessEquDo) {
+    public R cancelProcessOperationEqu(Integer curEquCancelRoll, ApsProcessOperationDo apsProcessOperationDo,
+                                       ApsProcessOperationProcessEquDo processOperationProcessEquDo) {
         processOperationProcessEquDo.setCancelroll(processOperationProcessEquDo.getCancelroll() + curEquCancelRoll);
         if (processOperationProcessEquDo.getPlanprocessrall() == processOperationProcessEquDo.getCancelroll()) {
             processOperationProcessEquDo.setProcessdevice("");

+ 141 - 17
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java

@@ -182,15 +182,16 @@ public class ReportCheckServiceImpl implements ReportCheckService {
             currentProcessOperationMainDo.setCheckoutroll(currentProcessOperationMainDo.getCheckoutroll() + 1);
             currentProcessOperationEqu.setCheckoutroll(currentProcessOperationEqu.getCheckoutroll() + 1);
         }
-        apsProcessOperationService.updateById(currentProcessOperationMainDo);
         currentProcessOperationEqu.setWorkstatus(JOBSTATUS_TO_BE_END);
         currentProcessOperationEqu.setBachmaterialprocess("");
-        apsProcessOperationProcessEquService.updateById(currentProcessOperationEqu);
         // 更新 更新该报工检验记录所有输出物料 以及待加工料卷批次号
         updateProcessOutputMater(apsWorkInProgressInventoryDos, reportOutputDos,
                 operationOutMaterDoList,
                 currentProcessOperationMainDo,
                 currentProcessOperationEqu);
+        // 更新当前工序作业和作业明细的数据
+        apsProcessOperationService.updateById(currentProcessOperationMainDo);
+        apsProcessOperationProcessEquService.updateById(currentProcessOperationEqu);
         // 更新报工输出物料 检验状态
         apsReportOutputService.update(new LambdaUpdateWrapper<ApsReportOutputDo>()
                 .in(ApsReportOutputDo::getId, reportOutputDos.stream().map(ApsReportOutputDo::getId).collect(Collectors.toList()))
@@ -391,11 +392,11 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         log.info("开始更新工序作业的输出物料和在制品相关信息");
         // 需要作为待加工料卷批次号的批次号
         Map<String, List<String>> toBeProcessedDataMap = new HashMap<>();
-
+        List<String> unqualifiedOutPutIds = new ArrayList<>();
         // 循环报工输出物料信息
         reportOutputDos.forEach(reportOutputDo -> {
             String outputid = reportOutputDo.getOutputid();
-            // 获取报工记录对应的输出物料
+            // 获取工序作业对应的输出物料
             ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo = operationOutMaterDoList.stream()
                     .filter(materDo -> materDo.getId().equals(outputid)).findFirst().orElse(null);
             // 报工记录对应的
@@ -420,6 +421,7 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                 apsProcessOperationOutMaterDo.setFailrollnum(apsProcessOperationOutMaterDo.getFailrollnum() + 1);
                 apsWorkInProgressInventoryDo.setWorkinprocessstatus(WAITING);
                 apsWorkInProgressInventoryDo.setWorkinprocesstype(REJECTS);
+                unqualifiedOutPutIds.add(outputid);
             } else {
                 currentProcessOperationMainDo.setOutputqualifiednum(currentProcessOperationMainDo.getOutputqualifiednum() + 1);
                 apsProcessOperationOutMaterDo.setGoodrollnum(apsProcessOperationOutMaterDo.getGoodrollnum() + 1);
@@ -461,11 +463,12 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         log.debug("需要向下一节点流转的批次号:{}", toBeProcessedDataMap);
         // 当前工序的下一个工序作业信息
         String nextprocessid = currentProcessOperationMainDo.getNextprocessid();
+        List<ApsProcessOperationDo> nextProcessOperations;
         log.debug("当前工序的下一个工序:{}", nextprocessid);
         // 当前工序存在下一个工序且 存在代加工的在制品信息时
         if (!toBeProcessedDataMap.isEmpty() && StringUtils.isNotBlank(nextprocessid)) {
             log.debug("更新剩余代报工卷数和待开工卷数");
-            List<ApsProcessOperationDo> nextProcessOperations = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+            nextProcessOperations = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                     .in(ApsProcessOperationDo::getId, Arrays.asList(nextprocessid.split(",")))
                     .in(ApsProcessOperationDo::getPlaninputid, toBeProcessedDataMap.keySet())
                     .eq(BaseDo::getDeleted, NO_DELETED));
@@ -516,22 +519,136 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                 apsProcessOperationProcessEquService.saveOrUpdateBatch(updateProcessEquData);
             }
         }
+        //本次流转取消卷数
+        Map<String, Integer> circulationCancellationMap = new HashMap<>();
+        if (!unqualifiedOutPutIds.isEmpty()) {
+            Map<String, Long> unqualifiedOutPutMap = unqualifiedOutPutIds.stream().collect(Collectors.groupingBy(outputid -> outputid, Collectors.counting()));
+            for (Map.Entry<String, Long> entry : unqualifiedOutPutMap.entrySet()) {
+                String key = entry.getKey();
+                // 待分配取消卷数
+                int toBeAllocated = Math.toIntExact(entry.getValue());
+                ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo = operationOutMaterDoList.stream()
+                        .filter(outMater -> key.contains(outMater.getId()))
+                        .findFirst().orElse(null);
+                if (apsProcessOperationOutMaterDo == null) {
+                    log.error("无法获取到正确的工序作业输出物料");
+                    throw new CustomException("无法获取到正确的工序作业输出物料");
+                }
+                int cancellation;
+                if (toBeAllocated > 0) {
+                    log.info("开始更新备料相关数据!卷数:{},输出物料id:{}", toBeAllocated, key);
+                    // 该作业明细的计划加工卷数*该作业的输出物料的计划备料卷数/该作业的计划加工卷数
+                    apsProcessOperationOutMaterDo.setPlanstockrollnum((int) Math.floor((double) (currentProcessOperationEqu.getPlanprocessrall() *
+                            apsProcessOperationOutMaterDo.getPlanstockrollnum()) / currentProcessOperationMainDo.getPlanprocessrall()));
+                    // 如果该作业明细输出物料的计划备料卷数≥待分配取消卷,则本次备料取消卷数=待分配取消卷 否则 本次备料取消卷数=该作业明细输出物料的计划备料卷数;
+                    cancellation = apsProcessOperationOutMaterDo.getPlanstockrollnum() >= toBeAllocated ?
+                            toBeAllocated : apsProcessOperationOutMaterDo.getPlanstockrollnum();
+                    /**
+                     * 备料已取消卷数=备料已取消卷数+本次备料取消卷数
+                     * 备料剩余需输出卷数=备料剩余需输出卷数-本次备料取消卷数
+                     * 待分配取消卷=待分配取消卷-本次备料取消卷数
+                     */
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getStockcancelroll,
+                            ApsProcessOperationOutMaterDo::setStockcancelroll, cancellation, 1);
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getStockleaveoutroll,
+                            ApsProcessOperationOutMaterDo::setStockleaveoutroll, cancellation, -1);
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getStockleaveoutroll,
+                            ApsProcessOperationOutMaterDo::setStockleaveoutroll, cancellation, -1);
+                    toBeAllocated = toBeAllocated - cancellation;
+                }
+                // 流转卷数相关
+                if (toBeAllocated > 0) {
+                    log.info("开始更新流转卷数相关数据!卷数:{},输出物料id:{}", toBeAllocated, key);
+                    //计划流转卷数=该作业明细的计划加工卷数*该作业的输出物料的计划流转卷数/该作业的计划加工卷数
+                    apsProcessOperationOutMaterDo.setPlanmoverollnum((int) Math.floor((double) (currentProcessOperationEqu.getPlanprocessrall() *
+                            apsProcessOperationOutMaterDo.getPlanmoverollnum()) / currentProcessOperationMainDo.getPlanprocessrall()));
+                    // 如果该作业明细输出物料的计划流转卷数≥待分配取消卷,则本次流转取消卷数=待分配取消卷; 则本次成品取消卷数=该作业明细输出物料的计划流转卷数;
+                    cancellation = apsProcessOperationOutMaterDo.getPlanmoverollnum() >= toBeAllocated ?
+                            toBeAllocated : apsProcessOperationOutMaterDo.getPlanmoverollnum();
+                    /**
+                     * 流转已取消卷数=流转已取消卷数+本次流转取消卷数
+                     * 流转剩余需输出卷数=流转剩余需输出卷数-本次流转取消卷数
+                     * 更新后道作业取消卷数,参见【更新后道作业取消卷数】
+                     * 待分配取消卷=待分配取消卷-本次流转取消卷数
+                     */
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getMovecancelroll,
+                            ApsProcessOperationOutMaterDo::setMovecancelroll, cancellation, 1);
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getMoveleaveoutroll,
+                            ApsProcessOperationOutMaterDo::setMoveleaveoutroll, cancellation, -1);
+                    if (circulationCancellationMap.containsKey(key)) {
+                        circulationCancellationMap.put(key, circulationCancellationMap.get(key) + cancellation);
+                    } else {
+                        circulationCancellationMap.put(key, cancellation);
+                    }
+                    toBeAllocated = toBeAllocated - cancellation;
+                }
+                // 成品输出卷数
+                if (toBeAllocated > 0) {
+                    log.info("开始更新成品输出卷数相关数据!卷数:{},输出物料id:{}", toBeAllocated, key);
+                    //计算该作业明细输出物料的计划成品卷数=该作业明细的计划加工卷数*该作业的输出物料的计划成品卷数/该作业的计划加工卷数
+                    apsProcessOperationOutMaterDo.setPlanprodrollnum((int) Math.floor((double) (currentProcessOperationEqu.getPlanprocessrall() *
+                            apsProcessOperationOutMaterDo.getPlanprodrollnum()) / currentProcessOperationMainDo.getPlanprocessrall()));
+                    // 如果该作业明细输出物料的计划成品卷数≥待分配取消卷,则本次流转取消卷数=待分配取消卷; 则本次成品取消卷数=该作业明细输出物料的计划成品卷数;
+                    cancellation = apsProcessOperationOutMaterDo.getPlanprodrollnum() >= toBeAllocated ?
+                            toBeAllocated : apsProcessOperationOutMaterDo.getPlanprodrollnum();
+                    /**
+                     * 成品已取消卷数=成品已取消卷数+本次成品取消卷数
+                     * 成品剩余需输出卷数=成品剩余需输出卷数-本次成品取消卷数
+                     */
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getProdcancelroll,
+                            ApsProcessOperationOutMaterDo::setProdcancelroll, cancellation, 1);
+                    calculateAboutRollNum(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo::getProdleaveoutroll,
+                            ApsProcessOperationOutMaterDo::setProdleaveoutroll, cancellation, -1);
 
+                }
+            }
+        }
         log.info("开始更新在制品和工序作业输出物料信息");
         // 保存在制品
         apsWorkInProgressInventoryService.saveOrUpdateBatch(apsWorkInProgressInventoryDos);
         // 保存工序作业输出物料
         apsProcessOperationOutMaterService.saveOrUpdateBatch(operationOutMaterDoList);
-
-        int unqualifiedCount = (int) reportOutputDos.stream().filter(info -> NO.equals(info.getQualified())).count();
-        if (unqualifiedCount > 0) {
-            CancelProcessOperationVo cancelProcessOperationVo = new CancelProcessOperationVo();
-            cancelProcessOperationVo.setCraftrouteid(null);
-            cancelProcessOperationVo.setCurcancelroll(unqualifiedCount);
-            cancelProcessOperationVo.setApsprocessoperationdo(currentProcessOperationMainDo);
-            cancelProcessOperationVo.setSetincancelroll(false);
-            cancelProcessOperationVo.setUpdatecuropration(false);
-            apsProcessOperationService.cancelProcessOperation(cancelProcessOperationVo);
+        // 更新后道作业取消卷数
+        if (StringUtils.isNotBlank(nextprocessid) && !circulationCancellationMap.isEmpty()) {
+            ApsProcessOperationDo apsProcessOperationDo;
+            CancelProcessOperationVo cancelProcessOperationVo;
+            for (Map.Entry<String, Integer> entry : circulationCancellationMap.entrySet()) {
+                String outPutId = entry.getKey();
+                Integer value = entry.getValue();
+                List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = apsProcessOperationProcessEquService.getBaseMapper().getDataByInputIdAndId(outPutId, Arrays.asList(currentProcessOperationEqu.getNextprocessesids().split(",")));
+                for (ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo : apsProcessOperationProcessEquDos) {
+                    if (value <= 0) {
+                        return;
+                    }
+                    apsProcessOperationDo = apsProcessOperationService.getById(apsProcessOperationProcessEquDo.getProcessid());
+                    if (apsProcessOperationDo == null) {
+                        log.error("无法根据id:{}获取工序作业信息", apsProcessOperationProcessEquDo.getProcessid());
+                        throw new CustomException("无法获取工序作业信息");
+                    }
+                    // 剩余待开工卷数
+                    int toBeStartedQty = apsProcessOperationProcessEquDo.getPlanprocessrall() - apsProcessOperationProcessEquDo.getStartingroll() - apsProcessOperationProcessEquDo.getCancelroll();
+                    // 本次取消卷数
+                    int cancelQty = toBeStartedQty >= value ? value : toBeStartedQty;
+                    log.debug("工序作业:{}的本次取消卷数:{}",apsProcessOperationProcessEquDo.getId(),cancelQty);
+                    //取消和更新作业明细
+                    apsProcessOperationService.cancelProcessOperationEqu(cancelQty,apsProcessOperationDo, apsProcessOperationProcessEquDo);
+                    //取消和更新工序作业
+                    cancelProcessOperationVo = new CancelProcessOperationVo();
+                    cancelProcessOperationVo.setCraftrouteid(null);
+                    cancelProcessOperationVo.setCurcancelroll(cancelQty);
+                    cancelProcessOperationVo.setCurcancelroll(cancelQty);
+                    cancelProcessOperationVo.setApsprocessoperationdo(apsProcessOperationDo);
+                    cancelProcessOperationVo.setSetincancelroll(false);
+                    cancelProcessOperationVo.setUpdatecuropration(false);
+                    apsProcessOperationService.cancelProcessOperation(cancelProcessOperationVo);
+                    // TODO:XH add 2024/9/3 不在更新使用方法中的更新逻辑
+//                    apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+//                            .eq(ApsProcessOperationProcessEquDo::getId, apsProcessOperationProcessEquDo.getId())
+//                            .set(ApsProcessOperationProcessEquDo::getCancelroll,cancelQty+apsProcessOperationProcessEquDo.getCancelroll())
+//                    );
+                    value = value - cancelQty;
+                }
+            }
         }
         log.info("更新工序作业的输出物料和在制品相关信息结束");
         return;
@@ -626,13 +743,20 @@ public class ReportCheckServiceImpl implements ReportCheckService {
      * @param getPojoData
      * @param setPojoData
      * @param changeRollNum
+     * @param type          1:加法 -1:减法
      * @return
      */
     public void calculateAboutRollNum(ApsProcessOperationOutMaterDo materDo,
                                       Function<ApsProcessOperationOutMaterDo, Integer> getPojoData,
                                       BiConsumer<ApsProcessOperationOutMaterDo, Integer> setPojoData,
-                                      int changeRollNum) {
-        setPojoData.accept(materDo, getPojoData.apply(materDo) + changeRollNum);
+                                      int changeRollNum,
+                                      int type) {
+        if (1 == type) {
+            setPojoData.accept(materDo, getPojoData.apply(materDo) + changeRollNum);
+        } else {
+            setPojoData.accept(materDo, getPojoData.apply(materDo) - changeRollNum);
+        }
+
     }
 
     /**

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

@@ -470,4 +470,20 @@
             </if>
         </where>
     </select>
+    <select id="getDataByInputIdAndId" resultType="com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo">
+        select apope.*
+        from aps_process_operation_process_equ apope
+        left join aps_process_operation app on apope.PROCESSID = app.ID
+        <where>
+            apope.DELETED='0'
+            and app.DELETED='0'
+            and apope.PLANPROCESSRALL - apope.STARTINGROLL - apope.CANCELROLL >0
+            and app.PLANINPUTID =#{inputId}
+            AND apope.ID IN
+            <foreach collection="ids" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+            ORDER BY PLANSTARTDATE desc
+        </where>
+    </select>
 </mapper>