Bläddra i källkod

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
#	cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java
fangpy 1 år sedan
förälder
incheckning
376a234f98
20 ändrade filer med 559 tillägg och 94 borttagningar
  1. 18 2
      bs-common/src/main/java/com/rongwei/safecommon/utils/CXCommonUtils.java
  2. 5 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProductionOrderDao.java
  3. 4 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProcessOperationProcessEquService.java
  4. 3 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductionOrderService.java
  5. 25 16
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  6. 108 13
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  7. 64 32
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationServiceImpl.java
  8. 99 11
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  9. 8 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportOutputServiceImpl.java
  10. 37 18
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java
  11. 67 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/ApsUtils.java
  12. 1 1
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationDao.xml
  13. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsBlankOrderDo.java
  14. 1 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java
  15. 21 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProductDetailVo.java
  16. 31 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckAndSaveOrUpdateOrderReq.java
  17. 26 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/JobDetailsVo.java
  18. 15 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductDetailIdAndPlanOutPutRollCountAllVo.java
  19. 11 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java
  20. 10 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductionOrderController.java

+ 18 - 2
bs-common/src/main/java/com/rongwei/safecommon/utils/CXCommonUtils.java

@@ -7,6 +7,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.rongwei.commonservice.serial.service.SysSerialNumberService;
 import com.rongwei.commonservice.service.RedisService;
+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;
@@ -33,8 +35,7 @@ import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.rongwei.safecommon.utils.SaveConstans.AQ_ORG_CODE_MAP;
-import static com.rongwei.safecommon.utils.SaveConstans.ORG_CODE_MAP;
+import static com.rongwei.safecommon.utils.SaveConstans.*;
 
 /**
  * CXCommonUtils class
@@ -290,6 +291,21 @@ public class CXCommonUtils {
         }
         return currUser;
     }
+    public static String getCurrentUserFactoryId(SysUserVo currentUser) {
+        if(currentUser==null){
+            currentUser   = 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(","));
+        }
+        return factoryId;
+    }
 
     /**
      * 计算时间和当前时间相差几天

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

@@ -2,7 +2,9 @@ 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 org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -20,6 +22,9 @@ public interface ApsProductionOrderDao extends BaseMapper<ApsProductionOrderDo>
     List<String> getStartWorkByBlankId(@Param("ids") List<String> ids);
 
     List<ApsProductionOrderDo> getDataByBlankId(@Param("blankIds")List<String> blankids);
+
+    @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);
 }
 
 

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

@@ -5,6 +5,7 @@ import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
 import com.rongwei.bsentity.vo.ChangeStartTimeVo;
 import com.rongwei.bsentity.vo.ChangingWiresVo;
 import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
+import com.rongwei.bsentity.vo.JobDetailsVo;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.List;
@@ -23,4 +24,7 @@ public interface ApsProcessOperationProcessEquService extends IService<ApsProces
     R getOptionalEquipment(List<String> operationJobDetailsId);
 
     R changeStartTime(List<ChangeStartTimeVo> changeStartTimeVo);
+
+    R updateDetails(JobDetailsVo jobDetailsVo);
+
 }

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

@@ -2,6 +2,7 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsProductionOrderDo;
+import com.rongwei.bsentity.vo.CheckAndSaveOrUpdateOrderReq;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.List;
@@ -14,4 +15,6 @@ public interface ApsProductionOrderService extends IService<ApsProductionOrderDo
     R publish(List<String> productionOrderIds);
 
     R publishCancel(List<String> productionOrderIds) ;
+
+    R checkAndSaveOrUpdateOrder(CheckAndSaveOrUpdateOrderReq req);
 }

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

@@ -15,6 +15,7 @@ import com.google.common.collect.Lists;
 import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.fegin.RwApsServer;
 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.vo.SysUserVo;
@@ -203,8 +204,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         // 更新工序作业的状态
         apsProcessOperationDao.publish(collect);
         // 根据坯料ID 删除 备份数据
-        apsProcessOperationBackupDao.deletedByBlankId(blankIds, null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIds, null);
+        ApsUtils.clearBackup(null);
         return R.ok();
     }
 
@@ -255,8 +255,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         // 更新工序作业的状态
         apsProcessOperationDao.publishCancel(collect);
         // 根据坯料ID 删除 备份数据
-        apsProcessOperationBackupDao.deletedByBlankId(blankIds, null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIds, null);
+        ApsUtils.clearBackup(null);
         return R.ok();
     }
 
@@ -444,7 +443,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         blankOrderAps(resBlankList);
         //blankOrderAps(apsBlankOrders);
         //更新生产状态为“待发布”(20)
-        updateProductStatusByOrderIds(apsBlankOrders.stream().map(ApsBlankOrderVo::getProductionorderid).collect(Collectors.toSet()));
+        updateProductStatusByOrderIds(resBlankList.stream().map(ApsBlankOrderVo::getProductionorderid).collect(Collectors.toSet()));
     }
 
     /**
@@ -598,11 +597,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         List<String> apsProcessOperationIds = processes.stream().map(ProductionProcesses::getId).distinct().collect(Collectors.toList());
         SysUserVo currentUser = CXCommonUtils.getCurrentUser();
         //删除备份
-        //获取备份的坯料计划ID
-        Set<String> blankIds = apsProcessOperationProcessEquDos.stream().map(ApsProcessOperationProcessEquDo::getBlankid).collect(Collectors.toSet());
-        ArrayList<String> blankIdList = new ArrayList<>(blankIds);
-        apsProcessOperationBackupDao.deletedByBlankId(blankIdList, null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIdList, null);
+        ApsUtils.clearBackup(null);
         //增加备份
         List<List<String>> partition1 = Lists.partition(apsProcessOperationIds, 500);
         partition1.forEach(data -> {
@@ -1162,7 +1157,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         this.update(apsBlankOrderDo, new QueryWrapper<ApsBlankOrderDo>().lambda().in(ApsBlankOrderDo::getProductionorderid, orderIds).eq(ApsBlankOrderDo::getProductstatus, "10"));
         //更新所有产品明细的生产状态
         ApsProductDetailDo apsProductDetailDo = new ApsProductDetailDo();
-        apsBlankOrderDo.setProductstatus(TO_BE_PUBLISHED);
+        apsProductDetailDo.setProductstatus(TO_BE_PUBLISHED);
         apsProductDetailService.update(apsProductDetailDo, new QueryWrapper<ApsProductDetailDo>().lambda().in(ApsProductDetailDo::getMainid, orderIds).eq(ApsProductDetailDo::getProductstatus, "10"));
         //更新订单的生产状态
         ApsProductionOrderDo apsProductionOrderDo = new ApsProductionOrderDo();
@@ -1174,14 +1169,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      * 物理删除排程备份(工序作业备份【aps_process_operation_backup】、加工设备备份【aps_process_operation_process_equ_backup】)
      * 更新状态
      */
-    private void deleteBackup(List<String> blankids, List<String> apsProductionOrderIds) {
+    public void deleteBackup(List<String> blankids, List<String> apsProductionOrderIds) {
         // 删除工序作业和工序作业明备份数据
-        apsProcessOperationBackupDao.deletedByBlankId(blankids, null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankids, null);
+        ApsUtils.clearBackup(null);
         // 更工序作业生产状态=待排程,是否锁定=否,
-        apsProcessOperationService.remove(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid, blankids));
+        apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
+                .in(ApsProcessOperationDo::getBlankid, blankids)
+                .set(ApsProcessOperationDo::getProcessstatus,TO_BE_SCHEDULED)
+                .set(ApsProcessOperationDo::getLockmark,LOCKMARK_N)
+        );
         // 清空作业明细
-        processOperationProcessEquService.remove(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
+        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                .in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
         // 更新订单的排程状态
         List<ApsProductionOrderDo> productionOrderDos = new ArrayList<>();
         for (String apsProductionOrderId : apsProductionOrderIds) {
@@ -1217,6 +1216,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     public R checkAndSaveOrUpdateBlank(CheckAndSaveOrUpdateBlankReq req) {
         //获取坯料计划内容
         ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
+        //获取当前用户信息
+        //获取当前用户的所属工厂
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
+
 
         //=============校验坯料长度=================
         //如果坯料产品类型对应产品外观类型是铝板或板锭,并且坯料长度为空,则提示:坯料是铝板和板锭时长度必填
@@ -1375,7 +1379,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
 
         //更新或保存坯料计划和输出成品
+        apsBlankOrderDo.setTenantid(tenantId);
         this.saveOrUpdate(apsBlankOrderDo);
+        for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
+            apsProcessOutputProductDo.setBlankid(apsBlankOrderDo.getId());
+            apsProcessOutputProductDo.setTenantid(tenantId);
+        }
         apsProcessOutputProductService.saveOrUpdateBatch(apsProcessOutputProductDoList);
 
         //如果在制品不为空,并且为新增备料

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

@@ -11,6 +11,7 @@ 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.bscommon.sys.utils.ApsUtils;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
@@ -95,7 +96,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
      */
     public void updateAboutStateByProcessId(List<ProcessIdRelationVo> updateIds) {
         // 防止sql 过长拆分
-        List<List<ProcessIdRelationVo>> partition = Lists.partition(updateIds, 8);
+        List<List<ProcessIdRelationVo>> partition = Lists.partition(updateIds, 20);
         partition.forEach(data -> {
             apsProcessOperationProcessEquDao.updateAboutStateByProcessId(data);
         });
@@ -317,17 +318,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         }
         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);
+            // 删除工序作业备份
+            ApsUtils.clearBackup(currentUser);
         }
         this.saveOrUpdateBatch(saveList);
         return R.ok();
@@ -394,7 +386,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             }
             // 获取更新之前的存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getConflictId(changeStartTimeVo.getQeuId(), changeStartTimeVo.getId(),
-                    changeStartTimeVo.getPlanStartTime(), changeStartTimeVo.getPlanEndTime());
+                    processEquDo.getPlanstartdate(), processEquDo.getPlanenddate());
 
             // 找到更新时间之后存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(changeStartTimeVo.getQeuId(), changeStartTimeVo.getId(),
@@ -439,6 +431,109 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         return R.ok();
     }
 
+
+    /**
+     * 更新工序作业明细
+     *
+     * @param jobDetailsVo
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R updateDetails(JobDetailsVo jobDetailsVo) {
+        String id = jobDetailsVo.getId();
+        if (StringUtils.isBlank(id)) {
+            log.error("工序作业ID 必传");
+            return R.error("参数异常");
+        }
+        ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = this.getById(id);
+        if (apsProcessOperationProcessEquDo == null) {
+            log.error("无法根据ID:{}获取到工序作业明细", id);
+            return R.error("无法获取到工序作业信息");
+        }
+        if (!JOBSTATUS_TO_BE_START.equals(apsProcessOperationProcessEquDo.getWorkstatus())) {
+            log.error("当前工序作业已开工");
+            return R.error("当前工序作业已开工无法更新工序作业信息");
+        }
+        if (StringUtils.isBlank(apsProcessOperationProcessEquDo.getProcessid())) {
+            log.error("工序作业明细对应工序作业ID为空");
+            return R.error("无法获取作业明细对应的工序作业");
+        }
+        // 判断工序作业是否待发布
+        ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationService.getById(apsProcessOperationProcessEquDo.getProcessid());
+        if (apsProcessOperationDo == null) {
+            log.error("根据ID:{} 获取工序作业失败", apsProcessOperationProcessEquDo.getProcessid());
+        }
+        if (!TO_BE_PUBLISHED.equals(apsProcessOperationDo.getProcessstatus())) {
+            log.error("工序作业状态:{}异常",apsProcessOperationDo.getProcessstatus());
+            return R.error("只有待发布的工序作业才可以修改");
+        }
+        // 更新开工时间 jobDetailsVo
+        String equId = jobDetailsVo.getEquId();
+        String equName = jobDetailsVo.getEquName();
+        String oldEquId = apsProcessOperationProcessEquDo.getProcessdeviceid();
+        if (StringUtils.isNotBlank(equId)) {
+            apsProcessOperationProcessEquDo.setProcessdevice(equName);
+            apsProcessOperationProcessEquDo.setProcessdeviceid(equId);
+            apsProcessOperationProcessEquDo.setProcessworkshop(jobDetailsVo.getWorkshopName());
+            apsProcessOperationProcessEquDo.setProcessworkshopid(jobDetailsVo.getWorkshopId());
+        }
+        // 更新计划开工时间
+        Date planStartTime = jobDetailsVo.getPlanStartTime();
+        if (planStartTime != null) {
+            Date oldPlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
+            Date oldPlanenddate = apsProcessOperationProcessEquDo.getPlanenddate();
+            // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
+            long timeInterval = DateUtil.between(planStartTime, oldPlanstartdate, DateUnit.SECOND, false);
+            apsProcessOperationProcessEquDo.setPlanstartdate(planStartTime);
+            // 自动计算计划完工时间=原完工时间+新计划开工时间-原计划开工时间
+            apsProcessOperationProcessEquDo.setPlanenddate(DateUtil.offsetSecond(apsProcessOperationProcessEquDo.getPlanenddate(), (int) timeInterval));
+            // 获取更新之前的存在冲突的工序作业
+            List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getConflictId(
+                    oldEquId, id, oldPlanstartdate, oldPlanenddate);
+            // 找到更新时间之后存在冲突的工序作业
+            List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(
+                    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);
+                    }
+                });
+                this.updateBatchById(afterTheUpdateConflictId);
+            }
+        }
+        this.updateById(apsProcessOperationProcessEquDo);
+        return R.ok();
+    }
+
     private void updateBlank(String processOperationId) {
         //查询此工序的所属订单ID
         String orderId = this.baseMapper.selectOrderIdByProcessOperationId(processOperationId);

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

@@ -9,6 +9,7 @@ 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.*;
+import com.rongwei.bscommon.sys.utils.ApsUtils;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
 import com.rongwei.bsentity.vo.PreviousProcessVo;
@@ -91,6 +92,8 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
     private ApsProcessOperationProcessEquDao apsProcessOperationProcessEquDao;
     @Autowired
     private ApsProcessOperationProcessEquBackupDao apsProcessOperationProcessEquBackupDao;
+    @Autowired
+    private ApsScheduleConfigService apsScheduleConfigService;
 
 
     private final static Map<String, String> UNIT_MAP = new HashMap<String, String>() {{
@@ -107,7 +110,7 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
      * @param ids
      * @param batchNumn
      */
-    public void updateBachmaterialprocessByIds(List<String> ids, String batchNumn,int unqualifiedQuantity) {
+    public void updateBachmaterialprocessByIds(List<String> ids, String batchNumn, int unqualifiedQuantity) {
         apsProcessOperationDao.updateBachmaterialprocessByIds(ids, batchNumn, unqualifiedQuantity);
     }
 
@@ -145,6 +148,10 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             JSONObject blanckdata = new JSONObject(params.get("BLANKDATA"));
             String craftrouteid = params.get("CRAFTROUTEID").toString();
 
+            // 获取排程参数设置
+            List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
+            BigDecimal aluminumdensity = apsConfigs.get(0).getAluminumdensity();
+
             //先清空之前的相关数据
             Map<String, Object> blanckMap = new HashMap<>();
             blanckMap.put("BLANKID", blanckdata.getStr("ID"));
@@ -234,6 +241,10 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             //输入物料ID对应前道工序作业输出物料只有一个后道工序作业),则不可编辑,自动计算=计划输入卷数
                             if (apsCraftRouteStepDoList1.size() == 1) {
                                 apsProcessOperationDo.setPlanprocessrall(processVo.get(0).getPlanprocessrall());
+                                if (!apsProcessOperationDo.getProcessway().equals("合并加工")) {
+                                    //计划作业时长
+                                    apsProcessOperationDo.setProcesstotaltime(getProcesstotaltime(apsProcessOperationDo, aluminumdensity));
+                                }
                             } else {
                                 apsProcessOperationDo.setPlanprocessrall(0);
                             }
@@ -382,6 +393,11 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                         apsProcessOperationDo.setBlankid(blanckdata.getStr("ID"));
                         apsProcessOperationDo.setCraftstepid(apsCraftRouteStepDo.getId());
 
+                        if (!apsProcessOperationDo.getProcessway().equals("合并加工")) {
+                            //计划作业时长
+                            apsProcessOperationDo.setProcesstotaltime(getProcesstotaltime(apsProcessOperationDo, aluminumdensity));
+                        }
+
                         //本道工序信息
                         previousProcessVo.setProcessId(processId);
                         previousProcessVo.setProcessName(apsProcessOperationDo.getProcessname());
@@ -669,6 +685,9 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
     public List<ApsProcessOperationOutMaterDo> resetProcessOperation(List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterDoList) {
         List<ApsProcessOperationOutMaterDo> operationOutMaterDos = new ArrayList<>();//递归的数据源
         try {
+            // 获取排程参数设置
+            List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
+            BigDecimal aluminumdensity = apsConfigs.get(0).getAluminumdensity();
 //            List<ApsProcessOperationDo> processOperationDos = apsProcessOperationDao.getProcessOperation(apsProcessOperationOutMaterDoList.get(0).getBlankid());
             //该坯料计划所有的工序及输出
             Map<String, Object> map = new HashMap<>();
@@ -697,6 +716,10 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                     //输入物料ID对应前道工序作业输出物料只有一个后道工序作业),则不可编辑,自动计算=计划输入卷数
                     if (apsProcessOperationDos.size() == 1) {
                         apsProcessOperationDo.setPlanprocessrall(planinrall);
+                        if (!apsProcessOperationDo.getProcessway().equals("合并加工")) {
+                            //计划作业时长
+                            apsProcessOperationDo.setProcesstotaltime(getProcesstotaltime(apsProcessOperationDo, aluminumdensity));
+                        }
 //                        ApsProcessOperationDo operationDo = processOperationDos.stream().filter(item -> item.getId().equals(apsProcessOperationDo.getPreviousprocessid())).findFirst().get();
 //                        apsProcessOperationDo.setPlanprocessrall(operationDo.getPlanprocessrall());
                     }
@@ -852,34 +875,25 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
 
     /**
      * 工序作业备份
+     *
      * @return
      */
     @Override
     public R backupProcessOperation() {
         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);
+        ApsUtils.clearBackup(currentUser);
         List<ApsProcessOperationDo> apsProcessOperationDos = apsProcessOperationDao.selectList(
                 new LambdaQueryWrapper<ApsProcessOperationDo>()
-                .in(ApsProcessOperationDo::getProcessstatus, "20"));
+                        .in(ApsProcessOperationDo::getProcessstatus, "20"));
         // 再备份
         List<String> collect = apsProcessOperationDos.stream().map(ApsProcessOperationDo::getId).collect(Collectors.toList());
         apsProcessOperationBackupDao.processOperationBackup(collect,
-                currentUser ==null?"":currentUser.getId(),
-                currentUser ==null?"":currentUser.getName());
+                currentUser == null ? "" : currentUser.getId(),
+                currentUser == null ? "" : currentUser.getName());
         apsProcessOperationProcessEquBackupDao.processOperationEquCopy(collect,
-                currentUser ==null?"":currentUser.getId(),
-                currentUser ==null?"":currentUser.getName());
+                currentUser == null ? "" : currentUser.getId(),
+                currentUser == null ? "" : currentUser.getName());
         return R.ok();
     }
 
@@ -892,10 +906,10 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
     public R backupRestoreProcessOperation() {
         log.debug("开始恢复工序作业备份信息");
         SysUserVo currentUser = CXCommonUtils.getCurrentUser();
-        String factoryId =null;
-        if(currentUser!=null){
+        String factoryId = null;
+        if (currentUser != null) {
             List<SysOrganizationVo> organizationDoList = currentUser.getOrganizationDoList();
-             factoryId = organizationDoList.stream()
+            factoryId = organizationDoList.stream()
                     .filter(org -> MINUS_ONE.equals(org.getPid()))
                     .map(SysOrganizationDo::getId)
                     .distinct()
@@ -908,26 +922,26 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
         }
         List<ApsProcessOperationProcessEquBackupDo> apsProcessOperationProcessEquBackupDos = apsProcessOperationProcessEquBackupDao
                 .selectList(new LambdaQueryWrapper<ApsProcessOperationProcessEquBackupDo>()
-                .eq(StringUtils.isNotBlank(factoryId),ApsProcessOperationProcessEquBackupDo::getTenantid, factoryId));
+                        .eq(StringUtils.isNotBlank(factoryId), ApsProcessOperationProcessEquBackupDo::getTenantid, factoryId));
         List<ApsProcessOperationBackupDo> apsProcessOperationBackupDos = apsProcessOperationBackupDao.selectList(new LambdaQueryWrapper<ApsProcessOperationBackupDo>()
-                .eq(StringUtils.isNotBlank(factoryId),ApsProcessOperationBackupDo::getTenantid, factoryId));
+                .eq(StringUtils.isNotBlank(factoryId), ApsProcessOperationBackupDo::getTenantid, factoryId));
         List<ApsProcessOperationDo> saveList = new ArrayList<>();
         List<ApsProcessOperationProcessEquDo> equSaveList = new ArrayList<>();
-        apsProcessOperationProcessEquBackupDos.forEach(data->{
-            ApsProcessOperationProcessEquDo equDo= new ApsProcessOperationProcessEquDo();
-            BeanUtils.copyProperties(data,equDo);
+        apsProcessOperationProcessEquBackupDos.forEach(data -> {
+            ApsProcessOperationProcessEquDo equDo = new ApsProcessOperationProcessEquDo();
+            BeanUtils.copyProperties(data, equDo);
             equSaveList.add(equDo);
         });
-        apsProcessOperationBackupDos.forEach(data->{
-            ApsProcessOperationDo operationDo= new ApsProcessOperationDo();
-            BeanUtils.copyProperties(data,operationDo);
+        apsProcessOperationBackupDos.forEach(data -> {
+            ApsProcessOperationDo operationDo = new ApsProcessOperationDo();
+            BeanUtils.copyProperties(data, operationDo);
             saveList.add(operationDo);
         });
-        if(!saveList.isEmpty()){
-            apsProcessOperationService.saveOrUpdateBatch(saveList,100);
+        if (!saveList.isEmpty()) {
+            apsProcessOperationService.saveOrUpdateBatch(saveList, 100);
         }
-        if(!equSaveList.isEmpty()){
-            apsProcessOperationProcessEquService.saveOrUpdateBatch(equSaveList,100);
+        if (!equSaveList.isEmpty()) {
+            apsProcessOperationProcessEquService.saveOrUpdateBatch(equSaveList, 100);
         }
         return R.ok();
     }
@@ -1157,4 +1171,22 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
         }
         return String.join(",", equIds);
     }
+
+    /*
+     计划作业时长
+     */
+    private BigDecimal getProcesstotaltime(ApsProcessOperationDo apsProcessOperationDo, BigDecimal aluminumdensity) {
+        String processtotaltime = null;
+        if (apsProcessOperationDo.getTimeway().equals("10")) {
+            //如果计时方式=按设备运转速度计时,计划作业时长=计划加工卷数*输入单卷重/(输入物料宽度/1000*输入物料厚度/1000*设备运转速度/1000*铝的密度)
+            BigDecimal prowidth = apsProcessOperationDo.getProwidth() == null ? BigDecimal.valueOf(1) : apsProcessOperationDo.getProwidth();
+            BigDecimal thickness = apsProcessOperationDo.getThickness() == null ? BigDecimal.valueOf(1) : apsProcessOperationDo.getThickness();
+            BigDecimal workspeed = apsProcessOperationDo.getWorkspeed() == null ? BigDecimal.valueOf(1) : apsProcessOperationDo.getWorkspeed();
+            processtotaltime = df.format(apsProcessOperationDo.getSinglerollweight().multiply(BigDecimal.valueOf(apsProcessOperationDo.getPlanprocessrall())).multiply(BigDecimal.valueOf(1000000000)).divide(prowidth.multiply(thickness).multiply(workspeed).multiply(aluminumdensity), 2, BigDecimal.ROUND_HALF_UP));
+        } else if (apsProcessOperationDo.getTimeway().equals("40")) {
+            //如果计时方式=按单次加工时长计时,计划作业时长=单次加工时长*计划加工卷数
+            processtotaltime = df.format(apsProcessOperationDo.getOnceprocessmin().multiply(BigDecimal.valueOf(apsProcessOperationDo.getPlanprocessrall())));
+        }
+        return new BigDecimal(processtotaltime);
+    }
 }

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

@@ -1,12 +1,21 @@
 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.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.service.ApsProductionOrderService;
+import com.rongwei.bscommon.sys.utils.ApsUtils;
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+import com.rongwei.bsentity.domain.ApsProductionMergeOrderDo;
 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.rwcommon.base.R;
+import com.rongwei.safecommon.utils.SaveConstans;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,29 +45,30 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
     @Autowired
     private ApsProcessOperationProcessEquBackupDao apsProcessOperationProcessEquBackupDao;
 
-    public static final String ERROR_MSG ="%s上诉订单的排程交货期大于承诺交货期";
+    public static final String ERROR_MSG = "%s上诉订单的排程交货期大于承诺交货期";
 
     /**
      * 发布订单排程
+     *
      * @param productionOrderIds
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R publish(List<String> productionOrderIds) {
-        if(productionOrderIds.isEmpty()){
-            return  R.ok();
+        if (productionOrderIds.isEmpty()) {
+            return R.ok();
         }
         // 如果 订单排程交货期>承诺交货期 抛出异常信息
         List<ApsProductionOrderDo> list = this.list(new LambdaQueryWrapper<ApsProductionOrderDo>()
                 .in(ApsProductionOrderDo::getId, productionOrderIds)
                 .apply(" SCHEDULEDELIVERYDATE>PROMISEDELIVERYDATE"));
-        if(!list.isEmpty()){
+        if (!list.isEmpty()) {
             String collect = list.stream()
                     .map(info -> info.getOrderno() + "-" + info.getCustomname())
                     .collect(Collectors.joining(";"));
-            log.error("存在排程交货期大于承诺交货期 的订单:{}",collect);
-            return R.error(String.format(ERROR_MSG,collect));
+            log.error("存在排程交货期大于承诺交货期 的订单:{}", collect);
+            return R.error(String.format(ERROR_MSG, collect));
         }
 
         // 更新工序作业的生产状态和是否锁定=是
@@ -74,14 +84,13 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         // 根据坯料ID 删除 备份数据
         List<ApsBlankOrderDo> apsBlankOrderDos = apsBlankOrderDao.selectList(new LambdaQueryWrapper<ApsBlankOrderDo>()
                 .in(ApsBlankOrderDo::getProductionorderid, productionOrderIds));
-        List<String> blankIds = apsBlankOrderDos.stream().map(ApsBlankOrderDo::getId).collect(Collectors.toList());
-        apsProcessOperationBackupDao.deletedByBlankId(blankIds,null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIds,null);
+        ApsUtils.clearBackup(null);
         return R.ok();
     }
 
     /**
      * 取消发布订单排程
+     *
      * @param productionOrderIds
      * @return
      */
@@ -101,11 +110,90 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
                 .in(ApsBlankOrderDo::getProductionorderid, productionOrderIds));
         List<String> blankIds = apsBlankOrderDos.stream().map(ApsBlankOrderDo::getId).collect(Collectors.toList());
         // 根据坯料ID 删除 备份数据
-        apsProcessOperationBackupDao.deletedByBlankId(blankIds,null);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIds,null);
+        ApsUtils.clearBackup(null);
         return R.ok();
     }
 
+    @Override
+    @Transactional
+    public R checkAndSaveOrUpdateOrder(CheckAndSaveOrUpdateOrderReq req) {
+        //订单信息
+        ApsProductionOrderDo apsProductionOrderDo = req.getApsProductionOrderDo();
+        //合并订单信息
+        List<ApsProductionMergeOrderDo> apsProductionMergeOrderDoList = req.getApsProductionMergeOrderDoList();
+        //产品明细信息
+        List<ApsProductDetailVo> apsProductDetailVoList = req.getApsProductDetailVoList();
+        //坯料计划信息
+        List<ApsBlankOrderDo> apsBlankOrderDoList = req.getApsBlankOrderDoList();
+        //是否需要检验坯料计划是否已排程
+        Boolean checkSchedule = req.getCheckSchedule();
+
+        //=========检查坯料计划的个数和状态=============
+        if (ObjectUtil.isEmpty(apsBlankOrderDoList)) {
+            return R.error("坯料计划至少有一个");
+        }
+        for (int i = 0; i < apsBlankOrderDoList.size(); i++) {
+            if (apsBlankOrderDoList.get(i).getIsstag().equals("是")) {
+                return R.error("第" + (i + 1) + "个坯料计划为暂存数据,请先保存再提交");
+            }
+        }
+
+        //提交时需要校验是否已排程
+        if (checkSchedule) {
+            //如果坯料计划生产状态=待排程;错误提示:坯料计划 {输入物料描述} 还未排程
+            for (ApsBlankOrderDo apsBlankOrderDo : apsBlankOrderDoList) {
+                if (ObjectUtil.isNotEmpty(apsBlankOrderDo.getProductstatus()) && apsBlankOrderDo.getProductstatus().equals(SaveConstans.ProductionStatus.TO_BE_SCHEDULED)) {
+                    return R.error("坯料计划 " + apsBlankOrderDo.getInputreportdescribe() + " 还未排程");
+                }
+            }
+        }
+
+        //============校验承诺交期============
+        //如果承诺交货期为空,错误提示:请填写订单{订单号}{客户简称}的承诺交货期
+        if (ObjectUtil.isEmpty(apsProductionOrderDo.getPromisedeliverydate())) {
+            return R.error("请填写订单" + apsProductionOrderDo.getOrderno() + apsProductionOrderDo.getCustomname() + "的承诺交货期");
+        }
+        //如果承诺交货期<排程交货期,错误提示:承诺交货期不能早于排程交货期{排程交货期}
+        if (apsProductionOrderDo.getPromisedeliverydate().compareTo(apsProductionOrderDo.getScheduledeliverydate()) < 0) {
+            return R.error("承诺交货期不能早于排程交货期" + DateUtil.format(apsProductionOrderDo.getScheduledeliverydate(), "yyyy-MM-dd"));
+        }
+
+        //============校验计划输出订单总重量==============
+        //检查每个订单产品,如果该订单产品坯料计划输出总重量 不等于 该订单产品订单总数量;
+        //错误提示:订单产品 {输入物料描述} 订单总数量与坯料计划输出总重量不一致
+        if (ObjectUtil.isEmpty(apsProductDetailVoList) || apsProductDetailVoList.size() <= 0) {
+            return R.error("产品明细至少有一个");
+        }
+        for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
+            if (apsProductDetailVo.getTotalordercount().compareTo(apsProductDetailVo.getPlanout()) != 0) {
+                return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + " 订单总数量与坯料计划输出总重量不一致");
+            }
+        }
+
+        //查询此订单所有产品明细对应的输出成品的卷数和
+        List<ProductDetailIdAndPlanOutPutRollCountAllVo> planOutPutRollCountAllVos = this.baseMapper.getProductDetailIdAndPlanOutPutRollCountAll(apsProductDetailVoList.get(0).getMainid());
+        //检查每个订单产品,如果该订单产品填写了卷数,
+        //并且该订单产品对应坯料输出成品的计划输出订单卷数合计不等于订单产品的卷数,
+        //错误提示:订单产品 {输入物料描述} 的卷数与坯料计划的计划输出订单卷数不一致
+        for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
+            if (ObjectUtil.isNotEmpty(apsProductDetailVo.getRollnum())) {
+                for (ProductDetailIdAndPlanOutPutRollCountAllVo planOutPutRollCountAllVo : planOutPutRollCountAllVos) {
+                    if (planOutPutRollCountAllVo.getProductDetailId().equals(apsProductDetailVo.getId())) {
+                        if (planOutPutRollCountAllVo.getPlanOutPutRollCountAll().equals(apsProductDetailVo.getRollnum())) {
+                            break;
+                        } else {
+                            return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + " 的卷数与坯料计划的计划输出订单卷数不一致");
+                        }
+                    }
+                }
+            }
+        }
+
+
+
+        return null;
+    }
+
 }
 
 

+ 8 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportOutputServiceImpl.java

@@ -11,6 +11,7 @@ import com.rongwei.bsentity.domain.ApsProcessOperationOutMaterDo;
 import com.rongwei.bsentity.domain.ApsReportOutputDo;
 import com.rongwei.bsentity.domain.ApsReportRecordsDo;
 import com.rongwei.bsentity.vo.InsertMyReportOutputReq;
+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;
@@ -157,6 +158,13 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
         }
 
         //插入子表
+        //获取当前用户信息
+        //获取当前用户的所属工厂
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
+        for (ApsReportOutputDo apsReportOutputDo : resList) {
+            apsReportOutputDo.setTenantid(tenantId);
+        }
         this.saveBatch(resList);
 
         //更新主表中的待检验批次号

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

@@ -75,73 +75,83 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         log.info("保存检验结果后更新相关信息");
         if (StringUtil.isBlank(id)) {
             log.debug("参数为空");
-            return R.ok();
+            return R.error("报工检验参数异常");
         }
         // 获取报工记录
         ApsReportRecordsDo reportRecordsDo = apsReportRecordsService.getById(id);
         if (reportRecordsDo == null) {
             log.error("无法根据ID:{}获取到报工记录", id);
-            return R.error();
+            return R.error("无法获取到报工记录");
         }
         if (VERIFIED.equals(reportRecordsDo.getCheckstatus())) {
             log.error("当前报工记录已检验无法再次检验");
-            return R.error();
+            return R.error("当前报工记录已检验无法再次检验");
         }
         // 获取当前报工记录对应的工序作业记录
         ApsProcessOperationProcessEquDo currentProcessOperationEqu = apsProcessOperationProcessEquService.getById(reportRecordsDo.getProcessequid());
+        if(currentProcessOperationEqu==null){
+            log.error("无法找到当前报工记录对应的工序作业信息");
+            return R.error("无法找到当前报工记录对应的工序作业信息");
+        }
         String processOperationEquId = currentProcessOperationEqu.getId();
         // 获取工序作业主表信息
         ApsProcessOperationDo currentProcessOperationMainDo = apsProcessOperationService.getOne(new LambdaQueryWrapper<ApsProcessOperationDo>()
                 .eq(ApsProcessOperationDo::getId, reportRecordsDo.getProcessoperationid()).eq(BaseDo::getDeleted, NO_DELETED));
         if (currentProcessOperationMainDo == null) {
             log.error("无法根据ID:{}获取到工序作业信息", id);
-            return R.error();
+            return R.error("无法获取到工序作业信息");
         }
         if (StringUtils.isBlank(currentProcessOperationMainDo.getBlankid())) {
             log.error("无法根据工序获取到生产订单信息");
-            return R.error();
+            return R.error("无法获取到生产订单信息");
         }
         // 前道工序作业ID
         String previousprocessid = currentProcessOperationMainDo.getPreviousprocessid();
         // 获取工序作业对应的输出物料信息
         ApsProcessOperationOutMaterDo operationOutMaterDoList = apsProcessOperationOutMaterService.getOne(new LambdaQueryWrapper<ApsProcessOperationOutMaterDo>()
-                .eq(ApsProcessOperationOutMaterDo::getMainid, processOperationEquId)
+                .eq(ApsProcessOperationOutMaterDo::getMainid, currentProcessOperationMainDo.getId())
                 .eq(BaseDo::getDeleted, NO_DELETED), false);
         if (operationOutMaterDoList == null) {
-            log.error("无法根据工序作业ID:{}获取对应的输出物料信息", processOperationEquId);
-            return R.error();
+            log.error("无法根据工序作业ID:{}获取对应的输出物料信息", currentProcessOperationMainDo.getId());
+            return R.error("无法获取到对应的输出物料信息");
         }
         // 获取该工序生成的物料输出信息
         List<ApsReportOutputDo> reportOutputDos = apsReportOutputService.list(new LambdaQueryWrapper<ApsReportOutputDo>()
-                .eq(ApsReportOutputDo::getMainid, id).eq(BaseDo::getDeleted, NO_DELETED));
+                 .eq(ApsReportOutputDo::getCheckstatus,"待检验")
+                .eq(ApsReportOutputDo::getMainid, id)
+                .eq(BaseDo::getDeleted, NO_DELETED));
         if (reportOutputDos.isEmpty()) {
             log.error("无法根据ID:{}获取到输出物料信息", id);
-            return R.error();
+            return R.error("无法获取到输出物料信息");
         }
         //获取批量计划
         ApsBlankOrderDo blankOrderDo = apsBlankOrderDao.selectById(currentProcessOperationMainDo.getBlankid());
         if (blankOrderDo == null) {
             log.error("无法根据ID:{}找到对应的订单信息", currentProcessOperationMainDo.getBlankid());
-            return R.error();
+            return R.error("无法获取订单信息");
         }
         if (StringUtils.isBlank(blankOrderDo.getProductionorderid())) {
             log.error("坯料计划对应的订单ID为空");
-            return R.error();
+            return R.error("无法通过坯料计划找到订单信息");
         }
         // 获取订单信息
         ApsProductionOrderDo productionOrderDo = apsProductionOrderService.getById(blankOrderDo.getProductionorderid());
         if (productionOrderDo == null) {
             log.error("无法根据ID:{},获取到订单信息", blankOrderDo.getProductionorderid());
-            return R.error();
+            return R.error("无法找到订单信息");
         }
 
         // 获取检验不合格批次的数量
-        List<ApsReportOutputDo> unqualificationOutPutList = reportOutputDos.stream().filter(info -> NO.equals(info.getQualified())).collect(Collectors.toList());
+        List<ApsReportOutputDo> unqualificationOutPutList = reportOutputDos.stream()
+                .filter(info -> NO.equals(info.getQualified()))
+                .collect(Collectors.toList());
         // 检验合格的数量信息
-        List<ApsReportOutputDo> qualifiedOutPutList = reportOutputDos.stream().filter(info -> YES.equals(info.getQualified())).collect(Collectors.toList());
+        List<ApsReportOutputDo> qualifiedOutPutList = reportOutputDos.stream()
+                .filter(info -> YES.equals(info.getQualified()))
+                .collect(Collectors.toList());
         if (unqualificationOutPutList.isEmpty() && qualifiedOutPutList.isEmpty()) {
             log.debug("暂无检验的数据");
-            return R.ok();
+            return R.ok("暂无需要检验的数据");
         }
         String nextProcessId = currentProcessOperationMainDo.getNextprocessid();
         // 获取当前工序对应的后道工序信息
@@ -167,7 +177,7 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         // 更新已检验卷数
         int inspectQuantity = reportOutputDos.size();
         // 订单信息
-        currentProductionOrderDoDispose(productionOrderDo, unqualificationOutPutList);
+        //currentProductionOrderDoDispose(productionOrderDo, unqualificationOutPutList);
         // 在制品
         updateArticlesProcessData(unqualificationOutPutList, qualifiedOutPutList, reportRecordsDo,
                 apsWorkInProgressInventoryDos, nextProcessOperationDos, currentProcessOperationMainDo,
@@ -245,6 +255,10 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         req.setBlankId(blankOrderDo.getId());
         // 更新
         apsProcessOperationProcessEquService.updateProductionStatus(req);
+        apsReportOutputService.update(new LambdaUpdateWrapper<ApsReportOutputDo>()
+                .in(ApsReportOutputDo::getId,reportOutputDos.stream().map(ApsReportOutputDo::getId).collect(Collectors.toList()))
+                .set(ApsReportOutputDo::getCheckstatus,VERIFIED));
+        reportRecordsDo.setCheckstatus(VERIFIED);
         return R.ok();
     }
 
@@ -301,8 +315,13 @@ public class ReportCheckServiceImpl implements ReportCheckService {
          */
         List<String> qualificationNum = qualifiedOutPutList.stream().map(ApsReportOutputDo::getOutputnumber).collect(Collectors.toList());
         int nextProcessingPlannedNum = nextProcessOperationDo.stream().mapToInt(info -> info.getPlanprocessrall() - (info.getCancelroll() == null ? 0 : info.getCancelroll())).sum();
-
+        // 判断在制品是否存在库存信息
+        List<String> collect = apsWorkInProgressInventoryDos.stream().map(ApsWorkInProgressInventoryDo::getBatchnumber).collect(Collectors.toList());
+        if(qualificationNum.stream().anyMatch(info -> !collect.contains(info))){
+            throw new RuntimeException("无法获取当前检验产品的库存信息");
+        }
         apsWorkInProgressInventoryDos.forEach(info -> {
+            // 如果当前合格的批次号在在制品中不存在 不更新在制品库存信息
             if (!qualificationNum.contains(info.getBatchnumber())) {
                 return;
             }

+ 67 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/ApsUtils.java

@@ -0,0 +1,67 @@
+package com.rongwei.bscommon.sys.utils;
+
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationBackupDao;
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquBackupDao;
+import com.rongwei.commonservice.serial.service.SysSerialNumberService;
+import com.rongwei.commonservice.service.RedisService;
+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.utils.StringUtils;
+import com.rongwei.safecommon.fegin.CXAdminFeginClient;
+import com.rongwei.safecommon.fegin.CXCommonFeginClient;
+import com.rongwei.safecommon.utils.CXCommonUtils;
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.rongwei.safecommon.utils.SaveConstans.MINUS_ONE;
+
+/**
+ * ApsUtils class
+ *
+ * @author XH
+ * @date 2024/05/07
+ */
+@Component
+public class ApsUtils {
+    private static final Logger log = LoggerFactory.getLogger(ApsUtils.class.getName());
+    @Autowired
+    private ApsProcessOperationBackupDao autoApsProcessOperationBackupDao;
+    @Autowired
+    private ApsProcessOperationProcessEquBackupDao autoApsProcessOperationProcessEquBackupDao;
+
+
+    private static ApsProcessOperationBackupDao apsProcessOperationBackupDao;
+    private static ApsProcessOperationProcessEquBackupDao apsProcessOperationProcessEquBackupDao;
+
+
+    @PostConstruct
+    public void info() {
+        apsProcessOperationBackupDao = autoApsProcessOperationBackupDao;
+        apsProcessOperationProcessEquBackupDao = autoApsProcessOperationProcessEquBackupDao;
+    }
+
+    /**
+     * 删除当前员工所属工厂的排程备份信息
+     * @param currentUser
+     */
+    public static void clearBackup(SysUserVo currentUser) {
+        if(currentUser==null){
+            currentUser = CXCommonUtils.getCurrentUser();
+        }
+        String factoryId = CXCommonUtils.getCurrentUserFactoryId(currentUser);
+        log.info("开始删除工厂:{}的排除备份数据",factoryId);
+        // 先删除
+        apsProcessOperationBackupDao.deletedByBlankId(null, factoryId);
+        apsProcessOperationProcessEquBackupDao.deletedByBlankId(null, factoryId);
+    }
+
+}

+ 1 - 1
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationDao.xml

@@ -5,7 +5,7 @@
 <mapper namespace="com.rongwei.bscommon.sys.dao.ApsProcessOperationDao">
     <update id="updateBachmaterialprocessByIds">
         update aps_process_operation set BACHMATERIALPROCESS = CONCAT_WS(',',BACHMATERIALPROCESS,#{batchNum}),
-                                    set INPUTUNQUALIFIEDROLL = INPUTUNQUALIFIEDROLL +#{unqualifiedQuantity}
+                                     INPUTUNQUALIFIEDROLL = INPUTUNQUALIFIEDROLL +#{unqualifiedQuantity}
         <where>
             ID in
             <foreach collection="ids" separator="," open="(" close=")" item="id">

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

@@ -35,6 +35,11 @@ public class ApsBlankOrderDo extends BaseDo {
      */
     @TableField("PRODUCTIONORDERID")
     private String productionorderid;
+    /**
+     * 坯料计划编号
+     */
+    @TableField("BLANKNUMBER")
+    private String blanknumber;
     /**
      * 物料名称
      */

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

@@ -126,7 +126,7 @@ public class ApsScheduleConfigDo extends BaseDo {
      * 铝密度
      */
     @TableField("ALUMINUMDENSITY")
-    private Double aluminumdensity;
+    private BigDecimal aluminumdensity;
 
 
 }

+ 21 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProductDetailVo.java

@@ -0,0 +1,21 @@
+package com.rongwei.bsentity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+import com.rongwei.rwcommon.base.BaseDo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+
+@Data
+public class ApsProductDetailVo extends ApsProductDetailDo {
+
+//    /**
+//     *坯料计划输出总重量
+//     */
+//    private BigDecimal planout;
+}
+

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

@@ -0,0 +1,31 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.ApsBlankOrderDo;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+import com.rongwei.bsentity.domain.ApsProductionMergeOrderDo;
+import com.rongwei.bsentity.domain.ApsProductionOrderDo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author :sc
+ * @since :2024/5/6
+ */
+@Data
+public class CheckAndSaveOrUpdateOrderReq {
+    //订单主表
+    private ApsProductionOrderDo apsProductionOrderDo;
+
+    //产品明细子表
+    private List<ApsProductDetailVo> apsProductDetailVoList;
+
+    //合并订单
+    private List<ApsProductionMergeOrderDo> apsProductionMergeOrderDoList;
+
+    //坯料计划
+    private List<ApsBlankOrderDo> apsBlankOrderDoList;
+
+    //是否需要检验坯料计划是否已排程
+    private Boolean checkSchedule = false;
+}

+ 26 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/JobDetailsVo.java

@@ -0,0 +1,26 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * JobDetailsVo class
+ *
+ * @author XH
+ * @date 2024/05/06
+ */
+@Data
+public class JobDetailsVo  extends  ChangingWiresVo{
+    /**
+     * 计划开工时间
+     */
+    @NotNull(message = "计划开工时间必填")
+    private Date planStartTime;
+    /**
+     * 计划完工时间
+     */
+    @NotNull(message = "计划完工时间必填")
+    private Date planEndTime;
+}

+ 15 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductDetailIdAndPlanOutPutRollCountAllVo.java

@@ -0,0 +1,15 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2024/5/6
+ */
+@Data
+public class ProductDetailIdAndPlanOutPutRollCountAllVo {
+    //产品明细ID
+    private String productDetailId;
+    //输出成品的卷数和
+    private Integer planOutPutRollCountAll;
+}

+ 11 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java

@@ -5,6 +5,7 @@ import com.rongwei.bscommon.sys.service.ApsProcessOperationProcessEquService;
 import com.rongwei.bsentity.vo.ChangeStartTimeVo;
 import com.rongwei.bsentity.vo.ChangingWiresVo;
 import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
+import com.rongwei.bsentity.vo.JobDetailsVo;
 import com.rongwei.rwcommon.base.R;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -79,5 +80,15 @@ public class ApsProcessOperationProcessEquController {
         log.info("开修改工序作业开工时间");
         return  apsProcessOperationProcessEquService.changeStartTime(changeStartTimeVo);
     }
+
+    /**
+     * 修改作业详情
+     * @return
+     */
+    @PostMapping("/update")
+    public  R updateDetails(@RequestBody JobDetailsVo jobDetailsVo ){
+        log.info("开修改作业详情");
+        return  apsProcessOperationProcessEquService.updateDetails(jobDetailsVo);
+    }
 }
 

+ 10 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductionOrderController.java

@@ -1,6 +1,7 @@
 package com.rongwei.bsserver.controller;
 
 import com.rongwei.bscommon.sys.service.ApsProductionOrderService;
+import com.rongwei.bsentity.vo.CheckAndSaveOrUpdateOrderReq;
 import com.rongwei.rwcommon.base.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,4 +46,13 @@ public class ApsProductionOrderController {
     public R publishCancel(@RequestBody List<String> productionOrderIds){
         return apsProductionOrderService.publishCancel(productionOrderIds);
     }
+
+    /**
+     * 订单评审,提交计划评审(校验和保存)
+     */
+    @PostMapping("/checkAndSaveOrUpdateOrder")
+    public R checkAndSaveOrUpdateOrder(@RequestBody CheckAndSaveOrUpdateOrderReq req){
+        return apsProductionOrderService.checkAndSaveOrUpdateOrder(req);
+    }
+
 }