Jelajahi Sumber

Merge branch 'mode-min-unit' of http://192.168.0.43:8086/AI_SAFE_PRODUCE/safe_produce_core into mode-min-unit

huangpeng 3 bulan lalu
induk
melakukan
64d9acb625
31 mengubah file dengan 1048 tambahan dan 124 penghapusan
  1. 3 0
      bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClient.java
  2. 6 0
      bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClientError.java
  3. 8 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java
  4. 73 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/listener/SpecificRowDropDownHandler.java
  5. 32 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/listener/WorkShopImportListener.java
  6. 1 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsBlankOrderService.java
  7. 8 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProcessOperationProcessEquService.java
  8. 117 77
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  9. 373 8
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  10. 1 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductDetailServiceImpl.java
  11. 14 12
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  12. 8 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java
  13. 6 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java
  14. 41 17
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java
  15. 47 0
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml
  16. 2 1
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProductDetailDao.xml
  17. 5 0
      cx-aps/cx-aps-entity/pom.xml
  18. 15 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsBlankOrderDo.java
  19. 15 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsBlankOrderHistoryDo.java
  20. 18 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductDo.java
  21. 18 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductHistoryDo.java
  22. 8 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsReportRecordsDo.java
  23. 16 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsWorkInProgressInventoryDo.java
  24. 18 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProcessOperationProcessEquDoAndWidthVo.java
  25. 14 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/DeviceCodeAndNameDownVo.java
  26. 13 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java
  27. 15 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/RollerTypeDownVo.java
  28. 20 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/RollerTypeExcelLookVo.java
  29. 105 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/WorkShopExportVo.java
  30. 5 3
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsBlankOrderController.java
  31. 23 4
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java

+ 3 - 0
bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClient.java

@@ -33,4 +33,7 @@ public interface CXAdminFeginClient {
 
     @PostMapping("sys/generalCRUD/generalMsUpdate")
     R generalMsUpdate(@RequestBody MasterSlaveUpdateVo masterSlaveUpdate);
+
+    @PostMapping("/sys/generalCRUD/getListData")
+    R getListData(@RequestBody CriteriaQuery query);
 }

+ 6 - 0
bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClientError.java

@@ -50,5 +50,11 @@ public class CXAdminFeginClientError implements CXAdminFeginClient {
         return R.error();
     }
 
+    @Override
+    public R getListData(CriteriaQuery query) {
+        log.error("查询失败:{}",query);
+        return R.error();
+    }
+
 
 }

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

@@ -141,6 +141,14 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
     void myUpdateConflictdes(@Param("apsProcessOperationProcessEquDo") ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo);
 
     void updateProcessPlanTimeByProcessIds(@Param("processIdList") Set<String> processIdList);
+
+    List<ApsProcessOperationProcessEquDoAndWidthVo> getAllWaitDoList();
+
+    List<DeviceCodeAndNameDownVo> selectAllDevice(@Param("tenantId") String tenantId);
+
+    List<RollerTypeDownVo> selectAllRollerType(@Param("tenantId") String tenantId);
+
+    List<RollerTypeExcelLookVo> selectAllRollerTypeAndWorkShopAndDevice(@Param("tenantId") String tenantId);
 }
 
 

+ 73 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/listener/SpecificRowDropDownHandler.java

@@ -0,0 +1,73 @@
+package com.rongwei.bscommon.sys.listener;
+
+/**
+ * @author :sc
+ * @since :2025/4/19
+ */
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+
+import java.util.List;
+import java.util.function.IntPredicate;
+import java.util.function.Supplier;
+
+/**
+ * 为指定行设置动态下拉框的处理器
+ */
+public class SpecificRowDropDownHandler implements CellWriteHandler {
+    private final int columnIndex;  // 要设置下拉的列索引
+    private final IntPredicate rowPredicate;  // 行判断条件
+    private final Supplier<List<String>> optionsSupplier;  // 动态选项提供者
+    private final String expression;
+
+    /**
+     * @param columnIndex 列索引(从0开始)
+     * @param rowPredicate 行判断条件(参数为行索引,返回true表示需要设置下拉)
+     * @param optionsSupplier 动态下拉选项提供者
+     */
+    public SpecificRowDropDownHandler(int columnIndex,
+                                      IntPredicate rowPredicate,
+                                      Supplier<List<String>> optionsSupplier,
+                                      String expression) {
+        this.columnIndex = columnIndex;
+        this.rowPredicate = rowPredicate;
+        this.optionsSupplier = optionsSupplier;
+        this.expression = expression;
+    }
+
+    @Override
+    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
+                                Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        // 跳过表头和非目标列
+        if (isHead || cell.getColumnIndex() != columnIndex) {
+            return;
+        }
+
+        // 检查是否目标行(relativeRowIndex从0开始,对应数据的第一行)
+        if (rowPredicate.test(relativeRowIndex)) {
+            Sheet sheet = writeSheetHolder.getSheet();
+            DataValidationHelper helper = sheet.getDataValidationHelper();
+
+            // 获取动态选项
+//            List<String> options = optionsSupplier.get();
+
+            // 创建下拉约束
+            DataValidationConstraint constraint = helper.createFormulaListConstraint(expression);
+
+            // 只对当前单元格设置下拉(单单元格范围)
+            CellRangeAddressList addressList = new CellRangeAddressList(
+                    cell.getRowIndex(), cell.getRowIndex(),
+                    columnIndex, columnIndex
+            );
+
+            DataValidation validation = helper.createValidation(constraint, addressList);
+            validation.setSuppressDropDownArrow(true);  // 显示下拉箭头
+            sheet.addValidationData(validation);
+        }
+    }
+}

+ 32 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/listener/WorkShopImportListener.java

@@ -0,0 +1,32 @@
+package com.rongwei.bscommon.sys.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.rongwei.bsentity.vo.WorkShopExportVo;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.StringUtils;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author :sc
+ * @since :2025/4/18
+ */
+@Getter
+public class WorkShopImportListener extends AnalysisEventListener<WorkShopExportVo> {
+    private final List<String> errorMessages = new ArrayList<>();
+    private final List<WorkShopExportVo> resData = new ArrayList<>();
+
+    @Override
+    public void invoke(WorkShopExportVo data, AnalysisContext context) {
+        resData.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+    }
+
+}

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

@@ -70,7 +70,7 @@ public interface ApsBlankOrderService extends IService<ApsBlankOrderDo> {
 
     R checkAddMaterial(AddMaterialReq req);
 
-    void apsScheduleRestart(Integer hour,String chongpaiStartDateStr,String chongpaiEndDateStr,SysUserVo currentUser, String blankId);
+    void apsScheduleRestart(Integer hour,String chongpaiStartDateStr,String chongpaiEndDateStr,SysUserVo currentUser, String blankId, Boolean haveLenZha, Boolean haveTuiHuo);
 
     void sortLenZha(DateTime chongpaiEndDate, String tenantId);
 

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

@@ -5,7 +5,11 @@ import com.rongwei.bsentity.domain.ApsProcessOperationDo;
 import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
 import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.vo.CriteriaQuery;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 
@@ -50,4 +54,8 @@ public interface ApsProcessOperationProcessEquService extends IService<ApsProces
                          List<ApsProcessOperationProcessEquDo> waitInsertEquList);
 
     List<String> updateDetails2(JobDetailsVo jobDetailsVo);
+
+    void workShopExport(CriteriaQuery query, HttpServletResponse response) throws IOException;
+
+    R workShopImport(MultipartFile multipartFile, HttpServletResponse response) throws IOException;
 }

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

@@ -2398,6 +2398,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             blankUpdateWrapper.set(ApsBlankOrderDo::getExpecteddays, apsBlankOrderDo.getExpecteddays());
             blankUpdateWrapper.set(ApsBlankOrderDo::getIssubmitprocessroute, apsBlankOrderDo.getIssubmitprocessroute());
             blankUpdateWrapper.set(ApsBlankOrderDo::getIswaitgetmaterial, apsBlankOrderDo.getIswaitgetmaterial());
+            blankUpdateWrapper.set(ApsBlankOrderDo::getOrderno, apsBlankOrderDo.getOrderno());
+            blankUpdateWrapper.set(ApsBlankOrderDo::getCustomorderno, apsBlankOrderDo.getCustomorderno());
+            blankUpdateWrapper.set(ApsBlankOrderDo::getCustomname, apsBlankOrderDo.getCustomname());
 
             this.update(blankUpdateWrapper);
         } else {
@@ -2443,7 +2446,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         ApsProductionOrderDo apsProductionOrderDo = apsProductionOrderService.getById(apsBlankOrderDo.getProductionorderid());
         if (ObjectUtil.isNotEmpty(apsProductionOrderDo)
                 && ObjectUtil.isNotEmpty(apsProductionOrderDo.getAuditstatus())
-                && Arrays.asList("待排程", "待交期评审", "待回复交期", "已发布计划").contains(apsProductionOrderDo.getAuditstatus())) {
+                && Arrays.asList("待工艺评审", "待部长审核", "待排程", "待交期评审", "待副总终审", "待回复交期", "已发布计划").contains(apsProductionOrderDo.getAuditstatus())) {
             List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterDoList = apsProcessOperationOutMaterService.list(new LambdaQueryWrapper<ApsProcessOperationOutMaterDo>()
                     .eq(ApsProcessOperationOutMaterDo::getBlankid, apsBlankOrderDo.getId())
                     .ne(ApsProcessOperationOutMaterDo::getOutputfinishproduct, "")
@@ -4302,11 +4305,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     }
 
     @Override
-    public void apsScheduleRestart(Integer hour, String chongpaiStartDateStr, String chongpaiEndDateStr, SysUserVo currentUser, String blankIds) {
+    public void apsScheduleRestart(Integer hour, String chongpaiStartDateStr, String chongpaiEndDateStr, SysUserVo currentUser, String blankIds, Boolean haveLenZha, Boolean haveTuiHuo) {
         if (currentUser == null) {
             currentUser = CXCommonUtils.getCurrentUser();
         }
         ApsUtils.checkScheduling(currentUser);
+        if (haveLenZha == null) {
+            haveLenZha = true;
+        }
+        if (haveTuiHuo == null) {
+            haveTuiHuo = true;
+        }
         String needScheduleDate = "";
         DateTime chongpaiStartDate = null;
         DateTime chongpaiEndDate = null;
@@ -4341,13 +4350,16 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             String tenantId = CXCommonUtils.getCurrentUserFactoryId(currentUser);
             //查询所有已解锁的作业和作业明细
             List<ApsProcessOperationProcessEquDo> unLockingEquList = apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                    .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n"));
+                    .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n")
+                    .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
             List<String> unLockingEquIdList = unLockingEquList.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList());
             List<ApsProcessOperationDo> unLockingProcessList = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
-                    .eq(ApsProcessOperationDo::getLockmark, "n"));
+                    .eq(ApsProcessOperationDo::getLockmark, "n")
+                    .eq(ApsProcessOperationDo::getTenantid, tenantId));
             List<String> unLockingProcessIdList = unLockingProcessList.stream().map(ApsProcessOperationDo::getId).collect(Collectors.toList());
             List<ApsProcessOperationProcessEquDo> unLockingEquList2 = apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "n"));
+                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "n")
+                    .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
             List<String> unLockingEquIdList2 = unLockingEquList2.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList());
 
             //将实际完工时间大于明天的作业挪到实际完工时间
@@ -4394,51 +4406,55 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             if (StringUtils.isNotBlank(blankIds)) {
                 blankIdList = new LinkedList<>(Arrays.asList(blankIds.split(",")));
             }
-            try {
-                log.info("开始冷轧重排");
-                //冷轧重排
-                lenzhaChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo, currentUser, blankIdList);
-                log.info("冷轧重排结束");
-            } catch (Exception e) {
-                log.error("冷轧重排失败");
-                log.error(e);
-            } finally {
-                //锁定所有 未锁定的 作业和作业明细
-                apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                        .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
-                        .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n")
-                        .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
-                apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                        .set(ApsProcessOperationProcessEquDo::getLockmark, "y")
-                        .eq(ApsProcessOperationProcessEquDo::getLockmark, "n")
-                        .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
-                apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
-                        .set(ApsProcessOperationDo::getLockmark, "y")
-                        .eq(ApsProcessOperationDo::getLockmark, "n")
-                        .eq(ApsProcessOperationDo::getTenantid, tenantId));
-            }
-            try {
-                log.info("开始退火重排");
-                //退火重排
-                tuihuoChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo, currentUser, blankIdList);
-                log.info("退火重排结束");
-            } catch (Exception e) {
-                log.error("退火重排失败");
-                log.error(e);
-            } finally {
-                //锁定所有 未锁定的 作业和作业明细
-                apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                        .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
-                        .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n")
-                        .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
-                apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                        .set(ApsProcessOperationProcessEquDo::getLockmark, "y")
-                        .eq(ApsProcessOperationProcessEquDo::getLockmark, "n")
-                        .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
-                apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
-                        .set(ApsProcessOperationDo::getLockmark, "y")
-                        .eq(ApsProcessOperationDo::getLockmark, "n")
-                        .eq(ApsProcessOperationDo::getTenantid, tenantId));
+            if (haveLenZha) {
+                try {
+                    log.info("开始冷轧重排");
+                    //冷轧重排
+                    lenzhaChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo, currentUser, blankIdList);
+                    log.info("冷轧重排结束");
+                } catch (Exception e) {
+                    log.error("冷轧重排失败");
+                    log.error(e);
+                } finally {
+                    //锁定所有 未锁定的 作业和作业明细
+                    apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                            .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
+                            .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n")
+                            .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
+                    apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                            .set(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                            .eq(ApsProcessOperationProcessEquDo::getLockmark, "n")
+                            .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
+                    apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
+                            .set(ApsProcessOperationDo::getLockmark, "y")
+                            .eq(ApsProcessOperationDo::getLockmark, "n")
+                            .eq(ApsProcessOperationDo::getTenantid, tenantId));
+                }
+            }
+            if (haveTuiHuo) {
+                try {
+                    log.info("开始退火重排");
+                    //退火重排
+                    tuihuoChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo, currentUser, blankIdList);
+                    log.info("退火重排结束");
+                } catch (Exception e) {
+                    log.error("退火重排失败");
+                    log.error(e);
+                } finally {
+                    //锁定所有 未锁定的 作业和作业明细
+                    apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                            .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
+                            .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n")
+                            .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
+                    apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                            .set(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                            .eq(ApsProcessOperationProcessEquDo::getLockmark, "n")
+                            .eq(ApsProcessOperationProcessEquDo::getTenantid, tenantId));
+                    apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
+                            .set(ApsProcessOperationDo::getLockmark, "y")
+                            .eq(ApsProcessOperationDo::getLockmark, "n")
+                            .eq(ApsProcessOperationDo::getTenantid, tenantId));
+                }
             }
             //调度排程结束
             //将之前锁定的作业和明细重新解锁
@@ -4663,7 +4679,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             DateTime nowDate = DateUtil.date();
             String time1 = DateUtil.format(nowDate, "yyyy-MM-dd 00:00:00");
             String time2 = DateUtil.format(nowDate, "yyyy-MM-dd 04:00:00");
-            String time3 = DateUtil.format(nowDate, "yyyy-MM-dd 19:00:00");
+            String time3 = DateUtil.format(nowDate, "yyyy-MM-dd 18:30:00");
             String time4 = DateUtil.format(nowDate, "yyyy-MM-dd 23:59:59");
             String now = DateUtil.format(nowDate, "yyyy-MM-dd HH:mm:ss");
 
@@ -4674,6 +4690,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 needScheduleStartDate = DateUtil.format(DateUtil.offsetDay(nowDate, 1), "yyyy-MM-dd 12:00:00");
                 needScheduleEndDate = DateUtil.format(DateUtil.offsetDay(nowDate, 2), "yyyy-MM-dd 12:00:00");
             } else {
+                ApsScheduleLogDo apsScheduleLogDo = new ApsScheduleLogDo();
+                apsScheduleLogDo.setId(SecurityUtil.getUUID());
+                apsScheduleLogDo.setScheduleuserid(currentUser.getId());
+                apsScheduleLogDo.setScheduleusername(currentUser.getName());
+                apsScheduleLogDo.setStarttime(DateUtil.date());
+                apsScheduleLogDo.setTenantid(tenantId);
+                apsScheduleLogDo.setScheduletype("调度排程");
+                apsScheduleLogDo.setSchedulestarttime(DateUtil.parse(needScheduleStartDate));
+                apsScheduleLogDo.setScheduleendtime(DateUtil.parse(needScheduleEndDate));
+                apsScheduleLogDo.setSucess("否");
+                apsScheduleLogDo.setError("不在调度时间段中,不调度排程");
+                apsScheduleLogService.save(apsScheduleLogDo);
                 log.info("{}不在调度时间段中,不调度排程", tenantId);
                 return "notNeedWait";
             }
@@ -4685,6 +4713,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     .eq(ApsScheduleLogDo::getSchedulestarttime, needScheduleStartDate)
                     .eq(ApsScheduleLogDo::getScheduleendtime, needScheduleEndDate));
             if (count > 0) {
+                ApsScheduleLogDo apsScheduleLogDo = new ApsScheduleLogDo();
+                apsScheduleLogDo.setId(SecurityUtil.getUUID());
+                apsScheduleLogDo.setScheduleuserid(currentUser.getId());
+                apsScheduleLogDo.setScheduleusername(currentUser.getName());
+                apsScheduleLogDo.setStarttime(DateUtil.date());
+                apsScheduleLogDo.setTenantid(tenantId);
+                apsScheduleLogDo.setScheduletype("调度排程");
+                apsScheduleLogDo.setSchedulestarttime(DateUtil.parse(needScheduleStartDate));
+                apsScheduleLogDo.setScheduleendtime(DateUtil.parse(needScheduleEndDate));
+                apsScheduleLogDo.setSucess("否");
+                apsScheduleLogDo.setError("已调度排程,无需调度排程,直接预排程");
+                apsScheduleLogService.save(apsScheduleLogDo);
                 log.info("{}已调度排程,无需调度排程,直接预排程", tenantId);
                 return "sucess";
             }
@@ -4695,7 +4735,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
 
         try {
-            apsScheduleRestart(null, needScheduleStartDate, needScheduleEndDate, currentUser, null);
+            apsScheduleRestart(null, needScheduleStartDate, needScheduleEndDate, currentUser, null, true, true);
         } catch (Exception e) {
             log.error(e);
             return "success";
@@ -4797,31 +4837,31 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
 
-        //查询工序类别为:精整 的工序
-        List<ApsProductionProcessesDo> jzProcessList = apsProductionProcessesService.list(new LambdaQueryWrapper<ApsProductionProcessesDo>().eq(ApsProductionProcessesDo::getProcesscategory, "精整"));
-        List<String> jzProcessNameList = jzProcessList.stream().map(ApsProductionProcessesDo::getProductprocessname).distinct().collect(Collectors.toList());
-        for (ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo : needScheduleList) {
-            if (ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getNextprocessesids())) {
-                for (String nextProcessId : apsProcessOperationProcessEquDo.getNextprocessesids().split(",")) {
-                    //不在重排中,但在基准中,如果是 精整工序,并且是最后一道工序,需要解锁加入排程
-                    if (!needScheduleIdList.contains(nextProcessId)
-                            && allProcessEquIdList.contains(nextProcessId)) {
-                        //查询后道的明细
-                        ApsProcessOperationProcessEquDo nextEqu = allProcessEquList.stream().filter(item -> nextProcessId.equals(item.getId())).findFirst().orElse(null);
-                        if (ObjectUtil.isNotEmpty(nextEqu)) {
-                            //是最后一道工序
-                            if (ObjectUtil.isEmpty(nextEqu.getNextprocessesids())) {
-                                //查询后道的工序作业
-                                ApsProcessOperationDo nextProcess = allProcessList.stream().filter(item -> nextEqu.getProcessid().equals(item.getId())).findFirst().orElse(null);
-                                if (jzProcessNameList.contains(nextProcess.getProcess())) {
-                                    needUnLockList.add(nextEqu);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
+//        //查询工序类别为:精整 的工序
+//        List<ApsProductionProcessesDo> jzProcessList = apsProductionProcessesService.list(new LambdaQueryWrapper<ApsProductionProcessesDo>().eq(ApsProductionProcessesDo::getProcesscategory, "精整"));
+//        List<String> jzProcessNameList = jzProcessList.stream().map(ApsProductionProcessesDo::getProductprocessname).distinct().collect(Collectors.toList());
+//        for (ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo : needScheduleList) {
+//            if (ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getNextprocessesids())) {
+//                for (String nextProcessId : apsProcessOperationProcessEquDo.getNextprocessesids().split(",")) {
+//                    //不在重排中,但在基准中,如果是 精整工序,并且是最后一道工序,需要解锁加入排程
+//                    if (!needScheduleIdList.contains(nextProcessId)
+//                            && allProcessEquIdList.contains(nextProcessId)) {
+//                        //查询后道的明细
+//                        ApsProcessOperationProcessEquDo nextEqu = allProcessEquList.stream().filter(item -> nextProcessId.equals(item.getId())).findFirst().orElse(null);
+//                        if (ObjectUtil.isNotEmpty(nextEqu)) {
+//                            //是最后一道工序
+//                            if (ObjectUtil.isEmpty(nextEqu.getNextprocessesids())) {
+//                                //查询后道的工序作业
+//                                ApsProcessOperationDo nextProcess = allProcessList.stream().filter(item -> nextEqu.getProcessid().equals(item.getId())).findFirst().orElse(null);
+//                                if (jzProcessNameList.contains(nextProcess.getProcess())) {
+//                                    needUnLockList.add(nextEqu);
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//        }
 
         //需要解锁的明细ID
         List<String> needUnLockProcessEquIdList = needUnLockList.stream().map(ApsProcessOperationProcessEquDo::getId).distinct().collect(Collectors.toList());

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

@@ -5,13 +5,20 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
+import com.rongwei.bscommon.sys.listener.SpecificRowDropDownHandler;
+import com.rongwei.bscommon.sys.listener.WorkShopImportListener;
 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;
@@ -19,12 +26,11 @@ import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
+import com.rongwei.rwcommon.vo.CriteriaQuery;
+import com.rongwei.safecommon.fegin.CXAdminFeginClient;
 import com.rongwei.safecommon.utils.CXCommonUtils;
-import com.rongwei.safecommon.utils.SaveConstans;
 import com.rongwei.wfserver.wfcommon.sys.service.impl.ProcessServiceImpl;
 import lombok.extern.log4j.Log4j2;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -33,17 +39,19 @@ import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.IntPredicate;
 import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.utils.ApsUtils.addNewConflictsDesc;
-import static com.rongwei.safecommon.utils.SaveConstans.CloseStatus.UNFINISHED;
 import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.*;
 import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.*;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_N;
@@ -100,6 +108,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     private PlatformTransactionManager transactionManager;
     @Autowired
     private ApsRollerTypeService apsRollerTypeService;
+    @Autowired
+    private CXAdminFeginClient cxAdminFeginClient;
+    @Autowired
+    private ApsProductionProcessesService apsProductionProcessesService;
 
 //    /**
 //     * 更新工序的待加工批次号信息
@@ -2455,7 +2467,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         }
 
         String rollerType = "";
-        if (req.getRollerId() != null) {
+        if (StringUtils.isNotBlank(req.getRollerId())) {
             ApsRollerTypeDo rollerTypeDo = apsRollerTypeService.getById(req.getRollerId());
             rollerType = rollerTypeDo.getRollertype();
         }
@@ -2579,6 +2591,359 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     }
 
 
+    @Override
+    public void workShopExport(CriteriaQuery query, HttpServletResponse response) throws IOException {
+        //调用平台接口查询结果
+        query.setCurrent(null);
+        query.setSize(null);
+        R listData = cxAdminFeginClient.getListData(query);
+        JSONObject jsonObject = JSONObject.parseObject(listData.getData().toString());
+        JSONArray records = jsonObject.getJSONArray("records");
+        //返回指定格式的数据
+        List<WorkShopExportVo> res = new LinkedList<>();
+        // 转换为全小写key的map
+        for (Object vo : records) {
+            JSONObject record = JSONObject.parseObject(vo.toString());
+            JSONObject convertKeysToLowercase = convertKeysToLowercase(record);
+            WorkShopExportVo workShopExportVo = BeanUtil.toBean(convertKeysToLowercase, WorkShopExportVo.class);
+            res.add(workShopExportVo);
+        }
+        res.sort(Comparator.comparing(WorkShopExportVo::getPlanstartdate));
+
+        String tenantId = CXCommonUtils.getCurrentUserFactoryId(null);
+        // 动态选项提供者(可以从数据库或其他服务获取)
+        //查询设备信息,组装数据
+        List<DeviceCodeAndNameDownVo> devices = this.baseMapper.selectAllDevice(tenantId);
+        String deviceExpression = "设备下拉选!$A$2:$A$" + (devices.size() + 1);
+
+        //辊类型下拉选
+        List<RollerTypeDownVo> rollerTypes = this.baseMapper.selectAllRollerType(tenantId);
+        String rollerExpression = "辊下拉选!$A$2:$A$" + (rollerTypes.size() + 1);
+
+        //辊对照表
+        List<RollerTypeExcelLookVo> rollerTypeExcelLookVo = this.baseMapper.selectAllRollerTypeAndWorkShopAndDevice(tenantId);
+
+        // 只对第2行和第4行设置下拉(relativeRowIndex从0开始)
+        IntPredicate rowFilter = rowIndex -> true;
+
+        // 设置响应头
+        String fileName = "车间作业跟踪导出数据_" + System.currentTimeMillis() + ".xlsx";
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+
+        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
+
+        // Sheet1 -
+        WriteSheet writeSheet1 = EasyExcel.writerSheet("车间作业跟踪")
+                .head(WorkShopExportVo.class)
+                .registerWriteHandler(new SpecificRowDropDownHandler(
+                        1, // 第2列(索引1)设备编号
+                        rowFilter,
+                        null,
+                        deviceExpression
+                ))
+                .registerWriteHandler(new SpecificRowDropDownHandler(
+                        12, // 第13列(索引12)辊类型
+                        rowFilter,
+                        null,
+                        rollerExpression
+                ))
+                .build();
+        excelWriter.write(res, writeSheet1);
+
+        // 第二个Sheet:设备列表(直接写入字符串列表)
+        WriteSheet deviceSheet = EasyExcel.writerSheet(1, "设备下拉选")
+                .head(DeviceCodeAndNameDownVo.class)
+                .build();
+        excelWriter.write(devices, deviceSheet);
+        // 第三个Sheet:辊列表(直接写入字符串列表)
+        WriteSheet rollerSheet = EasyExcel.writerSheet(2, "辊下拉选")
+                .head(RollerTypeDownVo.class)
+                .build();
+        excelWriter.write(rollerTypes, rollerSheet);
+        // 第4个Sheet:辊对照表(直接写入字符串列表)
+        WriteSheet rollerSheet2 = EasyExcel.writerSheet(3, "设备辊类型")
+                .head(RollerTypeExcelLookVo.class)
+                .build();
+        excelWriter.write(rollerTypeExcelLookVo, rollerSheet2);
+        excelWriter.finish();
+//        // 写入Excel
+//        EasyExcel.write(response.getOutputStream(), WorkShopExportVo.class)
+//                .registerWriteHandler(new SpecificRowDropDownHandler(
+//                        1, // 第2列(索引1)
+//                        rowFilter,
+//                        statusOptions
+//                ))
+//                .sheet("车间作业跟踪")
+//                .doWrite(res);
+    }
+
+    public static JSONObject convertKeysToLowercase(JSONObject original) {
+        JSONObject result = new JSONObject();
+        for (String key : original.keySet()) {
+            Object value = original.get(key);
+            // 递归处理嵌套的JSONObject
+            if (value instanceof JSONObject) {
+                value = convertKeysToLowercase((JSONObject) value);
+            }
+            result.put(key.toLowerCase(), value);
+        }
+        return result;
+    }
+
+
+    @Override
+    public R workShopImport(MultipartFile multipartFile, HttpServletResponse response) throws IOException {
+        WorkShopImportListener listener = new WorkShopImportListener();
+        // 读取数据
+        EasyExcel.read(multipartFile.getInputStream(), WorkShopExportVo.class, listener).sheet().headRowNumber(1).doRead();
+        // 解析有误信息
+        List<String> errorData = listener.getErrorMessages();
+        if (!errorData.isEmpty()) {
+            return R.error(JSON.toJSONString(errorData));
+        }
+        // 解析数据
+        List<WorkShopExportVo> list = listener.getResData();
+
+        //查询所有工序管理
+        List<ApsProductionProcessesDo> allProcessList = apsProductionProcessesService.list();
+        //查询所有设备信息
+        List<AspCheckItemsDo> allDeviceList = aspCheckItemsService.list(new LambdaQueryWrapper<AspCheckItemsDo>()
+                .eq(AspCheckItemsDo::getDeleted, "0")
+                .isNotNull(AspCheckItemsDo::getCheckitemcode)
+                .ne(AspCheckItemsDo::getCheckitemcode, ""));
+        //查询所有设备辊类型
+        List<ApsRollerTypeDo> allRollerList = apsRollerTypeService.list();
+        //查询所有待开工的作业明细
+        List<ApsProcessOperationProcessEquDoAndWidthVo> apsProcessOperationProcessEquDoList = this.baseMapper.getAllWaitDoList();
+        apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                .eq(ApsProcessOperationProcessEquDo::getWorkstatus, "待开工"));
+
+        //==================数据处理======================
+        List<String> errorMessageList = new LinkedList<>();
+        Map<String, List<ApsProcessOperationProcessEquDo>> resMap = new HashMap<>();
+        for (int i = 0; i < list.size(); i++) {
+            //需要更新的实体类
+            ApsProcessOperationProcessEquDo needUpdate = new ApsProcessOperationProcessEquDo();
+            //行号
+            int num = i + 2;
+            //行数据
+            WorkShopExportVo workShopExportVo = list.get(i);
+            //如果当前作业明细ID为空,则遍历下一个作业明细,并添加错误信息:第{行号}行作业明细为空;
+            if (StringUtils.isBlank(workShopExportVo.getId())) {
+                errorMessageList.add("第" + num + "行作业明细为空;");
+                continue;
+            }
+            needUpdate.setId(workShopExportVo.getId());
+            //查找【当前待开工作业明细】=(待开工作业明细列表中查找ID=当前作业明细ID的作业明细)
+            //如果没有找到,则遍历下一个作业明细
+            ApsProcessOperationProcessEquDoAndWidthVo equDo = apsProcessOperationProcessEquDoList.stream().filter(item -> item.getId().equals(workShopExportVo.getId())).findFirst().orElse(null);
+            if (equDo == null) {
+                continue;
+            }
+            //记录一下对应的工序ID
+            needUpdate.setProcessid(equDo.getProcessid());
+            //记录一下对应的坯料计划ID
+            needUpdate.setBlankid(equDo.getBlankid());
+            //如果当前作业明细加工设备编号为空,则遍历下一个作业明细,并添加错误信息:第{行号}行加工设备编号为空;
+            if (StringUtils.isBlank(workShopExportVo.getProcessdevicecode())) {
+                errorMessageList.add("第" + num + "行加工设备编号为空;");
+                continue;
+            }
+            //查找【当前加工设备】=(生产设备列表查找设备编号=当前作业明细设备编号的设备)
+            String processdevicecode = workShopExportVo.getProcessdevicecode().split("\\(")[0];
+            AspCheckItemsDo aspCheckItemsDo = allDeviceList.stream().filter(item -> item.getCheckitemcode().equals(processdevicecode)).findFirst().orElse(null);
+            //如果没找到,则遍历下一个作业明细,并添加错误信息:第{行号}行的加工设备编号{加工设备编号}不正确;
+            if (aspCheckItemsDo == null) {
+                errorMessageList.add("第" + num + "行的加工设备编号" + processdevicecode + "不正确;");
+                continue;
+            }
+            //查找【当前工序】=(工序列表中工序=当前作业明细工序的工序)
+            String process = workShopExportVo.getProcess();
+            ApsProductionProcessesDo apsProductionProcessesDo = allProcessList.stream().filter(item -> item.getProductprocessname().equals(process)).findFirst().orElse(null);
+            if (apsProductionProcessesDo == null) {
+                errorMessageList.add("第" + num + "行的工序" + workShopExportVo.getProcess() + "不正确;");
+                continue;
+            }
+            //如果当前工序类别是退火,直接抛出错误
+            if (apsProductionProcessesDo.getProcesscategory().equals("30")) {//退火
+                return R.error("第" + num + "行的工序为退火类别的工序,暂不支持");
+            }
+            //如果【当前加工设备】的设备类型不是【当前工序】的可选设备类型,
+            // 则添加错误信息:第{行号}行的设备类型不是工序的可选设备类型;
+            //当前加工设备的设备类型
+            String checkitemtype = aspCheckItemsDo.getCheckitemtype();
+            if (StringUtils.isBlank(checkitemtype)) {
+                errorMessageList.add("第" + num + "行的当前加工设备的设备类型为空;");
+                continue;
+            }
+            //当前工序的可选设备类型
+            String equipmenttype = apsProductionProcessesDo.getEquipmenttype();
+            if (StringUtils.isNotBlank(equipmenttype)) {
+                List<String> equipmenttypeList = new LinkedList<>(Arrays.asList(equipmenttype.split(",")));
+                if (!equipmenttypeList.contains(checkitemtype)) {
+                    errorMessageList.add("第" + num + "行的设备类型不是工序的可选设备类型;");
+                    continue;
+                }
+            }
+
+            needUpdate.setProcessdeviceid(aspCheckItemsDo.getId());
+            needUpdate.setProcessdevice(aspCheckItemsDo.getCheckitemname());
+            needUpdate.setProcessworkshopid(aspCheckItemsDo.getUsedeptid());
+            needUpdate.setProcessworkshop(aspCheckItemsDo.getUsedeptname());
+            //如果【当前工序】的工序类别=轧机,则
+            //查找【当前辊类型ID】=从设备辊类型列表中设备编号=当前作业明细设备编号的辊类型的辊ID
+            //如果没有找到,则添加错误信息:第{行号}行的辊类型不是加工设备的可选辊类型;
+            if (apsProductionProcessesDo.getProcesscategory().equals("20")) {//轧机
+                if (StringUtils.isBlank(workShopExportVo.getRollertype())) {
+                    errorMessageList.add("第" + num + "行的辊类型不可为空;");
+                    continue;
+                }
+                //查询设备辊类型中对应加工设备的辊集合
+                ApsRollerTypeDo apsRollerTypeDo = allRollerList.stream().filter(item -> item.getCheckitemid().equals(aspCheckItemsDo.getId())).filter(item -> item.getRollertype().equals(workShopExportVo.getRollertype())).findFirst().orElse(null);
+                if (apsRollerTypeDo == null) {
+                    errorMessageList.add("第" + num + "行的辊类型不是加工设备的可选辊类型;");
+                    continue;
+                }
+                needUpdate.setRollerid(apsRollerTypeDo.getId());
+            }
+
+            //计算作业时长
+//            int workTime = (int) DateUtil.between(equDo.getPlanstartdate(), equDo.getPlanenddate(), DateUnit.MINUTE);
+            int workTime = Math.abs(Integer.parseInt(workShopExportVo.getTime()));
+            if (!resMap.containsKey(aspCheckItemsDo.getId())) {
+                if (workShopExportVo.getPlanstartdate() == null) {
+                    errorMessageList.add("第" + num + "行是该设备第一个作业,计划开工时间不能为空;");
+                    continue;
+                }
+                List<ApsProcessOperationProcessEquDo> myList = new LinkedList<>();
+                needUpdate.setPlanstartdate(workShopExportVo.getPlanstartdate());
+                needUpdate.setPlanenddate(DateUtil.offsetMinute(workShopExportVo.getPlanstartdate(), workTime));
+                myList.add(needUpdate);
+                resMap.put(aspCheckItemsDo.getId(), myList);
+            } else {
+                List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = resMap.get(aspCheckItemsDo.getId());
+                ApsProcessOperationProcessEquDo lastEquDo = apsProcessOperationProcessEquDos.get(apsProcessOperationProcessEquDos.size() - 1);
+                if (workShopExportVo.getPlanstartdate() != null
+                        && lastEquDo.getPlanenddate().after(workShopExportVo.getPlanstartdate())) {
+                    errorMessageList.add("第" + num + "行计划开工时间填写错误,和该设备上一道作业时间重叠;");
+                    continue;
+                }
+                if (workShopExportVo.getPlanstartdate() != null) {
+                    needUpdate.setPlanstartdate(workShopExportVo.getPlanstartdate());
+                } else {
+                    needUpdate.setPlanstartdate(lastEquDo.getPlanenddate());
+                    if (apsProductionProcessesDo.getProcesscategory().equals("20")) {//当前工序为轧机
+                        //获取输出物料的宽度
+                        BigDecimal width = equDo.getWidth();
+                        //上道作业的宽度
+                        ApsProcessOperationProcessEquDoAndWidthVo lastEqu = apsProcessOperationProcessEquDoList.stream().filter(item -> item.getId().equals(lastEquDo.getId())).findFirst().orElse(null);
+                        BigDecimal lastWidth = lastEqu.getWidth();
+                        if (width.compareTo(lastWidth) > 0
+                                || needUpdate.getRollerid() != lastEquDo.getRollerid()) {
+                            needUpdate.setPlanstartdate(DateUtil.offsetMinute(needUpdate.getPlanstartdate(), 40));
+                        }
+                    }
+                }
+                needUpdate.setPlanenddate(DateUtil.offsetMinute(needUpdate.getPlanstartdate(), workTime));
+                apsProcessOperationProcessEquDos.add(needUpdate);
+            }
+        }
+        JSONObject res = new JSONObject();
+        if (!errorMessageList.isEmpty()) {
+            res.put("isSuccess", false);
+            res.put("errorMessage", String.join("\n\r", errorMessageList));
+            return R.ok(res);
+        } else {
+            List<ApsProcessOperationProcessEquDo> allNeedUpdateList = new LinkedList<>();
+            for (String key : resMap.keySet()) {
+                List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = resMap.get(key);
+                allNeedUpdateList.addAll(apsProcessOperationProcessEquDos);
+            }
+            //所有需要更新的工序作业ID
+            Set<String> processIdList = allNeedUpdateList.stream().map(ApsProcessOperationProcessEquDo::getProcessid).distinct().collect(Collectors.toSet());
+            //所有需要更新的坯料计划ID
+            List<String> blankIdList = allNeedUpdateList.stream().map(ApsProcessOperationProcessEquDo::getBlankid).distinct().collect(Collectors.toList());
+
+            // 定义事务属性
+            TransactionDefinition definition = new DefaultTransactionDefinition();
+            // 开始事务
+            TransactionStatus status = transactionManager.getTransaction(definition);
+            try {
+                //更新所有明细
+                for (ApsProcessOperationProcessEquDo equDo : allNeedUpdateList) {
+                    LambdaUpdateWrapper<ApsProcessOperationProcessEquDo> wrapper = new LambdaUpdateWrapper<>();
+                    if (StringUtils.isNotBlank(equDo.getProcessdeviceid())) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getProcessdeviceid, equDo.getProcessdeviceid());
+                    }
+                    if (StringUtils.isNotBlank(equDo.getProcessdevice())) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getProcessdevice, equDo.getProcessdevice());
+                    }
+                    if (StringUtils.isNotBlank(equDo.getProcessworkshopid())) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getProcessworkshopid, equDo.getProcessworkshopid());
+                    }
+                    if (StringUtils.isNotBlank(equDo.getProcessworkshop())) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getProcessworkshop, equDo.getProcessworkshop());
+                    }
+                    if (StringUtils.isNotBlank(equDo.getRollerid())) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getRollerid, equDo.getRollerid());
+                    }
+                    if (equDo.getPlanstartdate() != null) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getPlanstartdate, equDo.getPlanstartdate());
+                    }
+                    if (equDo.getPlanenddate() != null) {
+                        wrapper.set(ApsProcessOperationProcessEquDo::getPlanenddate, equDo.getPlanenddate());
+                    }
+                    wrapper.eq(ApsProcessOperationProcessEquDo::getId, equDo.getId())
+                            .eq(ApsProcessOperationProcessEquDo::getWorkstatus, "待开工");
+                    apsProcessOperationProcessEquService.update(wrapper);
+
+                    ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = this.getById(equDo.getId());
+                    //冲突更新
+                    //原明细详情
+                    ApsProcessOperationProcessEquDoAndWidthVo oldEqu = apsProcessOperationProcessEquDoList.stream().filter(item -> item.getId().equals(equDo.getId())).findFirst().orElse(null);
+                    Date planstartdate = null;
+                    Date planenddate = null;
+                    String processDeviceId = null;
+                    String processway = "非合并加工";
+                    if (oldEqu != null) {
+                        planstartdate = oldEqu.getPlanstartdate();
+                        planenddate = oldEqu.getPlanenddate();
+                        processDeviceId = oldEqu.getProcessdeviceid();
+                        processway = oldEqu.getProcessway();
+                    }
+                    checkProcessingTimeConflict(apsProcessOperationProcessEquDo,
+                            planstartdate, planenddate, processDeviceId, processway, new LinkedList<>());
+                    // 判断是否存在设备不可用
+                    apsProcessOperationProcessEquDo = this.getById(apsProcessOperationProcessEquDo.getId());
+                    inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
+                            apsProcessOperationProcessEquDo.getProcessdeviceid(),
+                            apsProcessOperationProcessEquDo.getPlanstartdate(),
+                            apsProcessOperationProcessEquDo.getPlanenddate(),
+                            new LinkedList<>());
+                }
+
+
+                if (!processIdList.isEmpty()) {
+                    //更新对应工序作业的 计划完工时间和计划开工时间
+                    this.baseMapper.updateProcessPlanTimeByProcessIds(processIdList);
+                }
+                for (String data : blankIdList) {
+                    // 更新坯料交货期
+                    apsBlankOrderService.updateBlankDeliveryDate(null, data);
+                }
+                // 提交事务
+                transactionManager.commit(status);
+            } catch (Exception e) {
+                // 捕获异常并回滚事务
+                transactionManager.rollback(status);
+                throw e;
+            }
+            res.put("isSuccess", true);
+            return R.ok(res);
+        }
+    }
 }
 
 

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

@@ -541,6 +541,7 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
                             apsProcessOutputProductDo.setRollweightrequirement(apsProductDetailDo.getRollweightrequirement());
                             apsProcessOutputProductDo.setRolldiameterrequirement(apsProductDetailDo.getRolldiameterrequirement());
                             apsProcessOutputProductDo.setRollnumberrequirement(apsProductDetailDo.getRollnumberrequirement());
+                            apsProcessOutputProductDo.setSleeverequirement(apsProductDetailDo.getSleeverequirement());
                             apsProcessOutputProductDo.setProductname(apsProductDetailDo.getInputmaterialdescription());
                             apsProcessOutputProductDo.setProductid(apsProductDetailDo.getId());
                             String alloy = apsProcessOutputProductDo.getAlloy();

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

@@ -447,18 +447,20 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
             }
 
 
-            /**
-             * 校验每个订单产品
-             * 如果订单产品暂不评审=否,并且坯料计划输出总重量 = 0,则错误提示:订单产品 {输入物料描述}坯料计划未填写
-             * 如果订单产品暂不评审=是,并且坯料计划输出总重量 > 0,则错误提示:订单产品 {输入物料描述}暂不评审,不应该填写坯料计划
-             */
-            for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
-                if (apsProductDetailVo.getDeleted().equals("0")) {
-                    if (apsProductDetailVo.getNotyetreview().equals("否") && (ObjectUtil.isEmpty(apsProductDetailVo.getPlanout()) || apsProductDetailVo.getPlanout().toString().equals("0"))) {
-                        return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + "坯料计划未填写");
-                    }
-                    if (apsProductDetailVo.getNotyetreview().equals("是") && ObjectUtil.isNotEmpty(apsProductDetailVo.getPlanout()) && !apsProductDetailVo.getPlanout().toString().equals("0")) {
-                        return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + "暂不评审,不应该填写坯料计划");
+            if (checkLevel >= 2) {
+                /**
+                 * 校验每个订单产品
+                 * 如果订单产品暂不评审=否,并且坯料计划输出总重量 = 0,则错误提示:订单产品 {输入物料描述}坯料计划未填写
+                 * 如果订单产品暂不评审=是,并且坯料计划输出总重量 > 0,则错误提示:订单产品 {输入物料描述}暂不评审,不应该填写坯料计划
+                 */
+                for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
+                    if (apsProductDetailVo.getDeleted().equals("0")) {
+                        if (apsProductDetailVo.getNotyetreview().equals("否") && (ObjectUtil.isEmpty(apsProductDetailVo.getPlanout()) || apsProductDetailVo.getPlanout().toString().equals("0"))) {
+                            return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + "坯料计划未填写");
+                        }
+                        if (apsProductDetailVo.getNotyetreview().equals("是") && ObjectUtil.isNotEmpty(apsProductDetailVo.getPlanout()) && !apsProductDetailVo.getPlanout().toString().equals("0")) {
+                            return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + "暂不评审,不应该填写坯料计划");
+                        }
                     }
                 }
             }

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

@@ -1171,6 +1171,10 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                     outPutNumber = String.join(",", outputNumbers);
                     if (StringUtils.isNotBlank(apsProcessOperationDo.getIfblankprocess()) && "是".equals(apsProcessOperationDo.getIfblankprocess())) {
                         processEquWrapper.set(ApsProcessOperationProcessEquDo::getBlankbatchnumber, outPutNumber);
+                        apsProcessOperationProcessEquDo.setBlankbatchnumber(outPutNumber);
+                    } else {
+                        processEquWrapper.set(ApsProcessOperationProcessEquDo::getBlankbatchnumber, nowReportRecordsDo.getBatchnumber());
+                        apsProcessOperationProcessEquDo.setBlankbatchnumber(nowReportRecordsDo.getBatchnumber());
                     }
                 }
                 updateAfterBlankByBatchAndOutPutNumber(apsProcessOperationDo, nowReportRecordsDo, apsProcessOperationProcessEquDo, outPutNumber);
@@ -1471,6 +1475,10 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             workInProgressInventoryDo.setJoboutputmaterial(outPut);
             //计划输出卷重
             workInProgressInventoryDo.setPlansinglerollweight(apsProcessOperationOutMaterDo.getSinglerollweight());
+            //坯料计划相关信息
+            workInProgressInventoryDo.setPlanblankid(apsBlankOrderDo.getId());
+            workInProgressInventoryDo.setBlanknumber(apsBlankOrderDo.getBlanknumber());
+            workInProgressInventoryDo.setPickingbatchnumber(apsProcessOperationProcessEquDo.getBlankbatchnumber());
 
             needAddWorkInProgressInventoryList.add(workInProgressInventoryDo);
         }

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

@@ -1806,6 +1806,8 @@ public class ApsServiceImpl implements ApsService {
                         // 已排程的作业明细数据保持ID不变
                         if (processEquDos != null && i < processEquDos.size()) {
                             processes.setId(processEquDos.get(i).getId());
+                            // 历史排程设备记录
+                            processes.setLastHistoryEquipmentId(processEquDos.get(i).getProcessdeviceid());
                             // 锁定作业的关联关系设置
                             if (StrUtil.isNotBlank(processEquDos.get(i).getPreviousprocessesids())) {
                                 processes.setPreviousProcessesIds(new ArrayList<>(Arrays.asList(processEquDos.get(i).getPreviousprocessesids().split(","))));
@@ -1885,6 +1887,8 @@ public class ApsServiceImpl implements ApsService {
                         // 已排程的作业明细数据保持ID不变
                         if (processEquDos != null && i < processEquDos.size()) {
                             processes.setId(processEquDos.get(i).getId());
+                            // 历史排程设备记录
+                            processes.setLastHistoryEquipmentId(processEquDos.get(i).getProcessdeviceid());
                             // 锁定作业的关联关系设置
                             if (StrUtil.isNotBlank(processEquDos.get(i).getPreviousprocessesids())) {
                                 processes.setPreviousProcessesIds(new ArrayList<>(Arrays.asList(processEquDos.get(i).getPreviousprocessesids().split(","))));
@@ -1944,6 +1948,8 @@ public class ApsServiceImpl implements ApsService {
                         // 已排程的作业明细数据保持ID不变
                         if (processEquDos != null && i < processEquDos.size()) {
                             processes.setId(processEquDos.get(i).getId());
+                            // 历史排程设备记录
+                            processes.setLastHistoryEquipmentId(processEquDos.get(i).getProcessdeviceid());
                             // 锁定作业的关联关系设置
                             if (StrUtil.isNotBlank(processEquDos.get(i).getPreviousprocessesids())) {
                                 processes.setPreviousProcessesIds(new ArrayList<>(Arrays.asList(processEquDos.get(i).getPreviousprocessesids().split(","))));

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

@@ -106,38 +106,62 @@ public class ReportCheckServiceImpl implements ReportCheckService {
 
         if (redisService.hasKey(id) && !redisService.getRedisCatchObj(id).equals(currentUser.getId())) {
             log.error("该作业已被其他人:{}检验", locks.get(id));
-            return R.error("该作业已被其他人检验");
+            throw new CustomException("该作业已被其他人检验");
         }
         try {
             if (StringUtil.isBlank(id)) {
                 log.debug("参数为空");
-                return R.error("报工检验参数异常");
+                throw new CustomException("报工检验参数异常");
             }
             // 获取报工记录
             ApsReportRecordsDo reportRecordsDo = apsReportRecordsService.getById(id);
             if (reportRecordsDo == null) {
                 log.error("无法根据ID:{}获取到报工记录", id);
-                return R.error("无法获取到报工记录");
+                throw new CustomException("无法获取到报工记录");
             }
             if (VERIFIED.equals(reportRecordsDo.getCheckstatus())) {
                 log.error("当前报工记录已检验无法再次检验");
-                return R.error("该作业已被其他人检验");
+                throw new CustomException("该作业已被其他人检验");
             }
-            apsReportRecordsService.update(new LambdaUpdateWrapper<ApsReportRecordsDo>().eq(ApsReportRecordsDo::getId, id)
-                    .set(ApsReportRecordsDo::getCheckstatus, VERIFIED));
             // 获取该工序生成的物料输出信息
             List<ApsReportOutputDo> reportOutputDos = apsReportOutputService.list(new LambdaQueryWrapper<ApsReportOutputDo>()
                     .eq(ApsReportOutputDo::getMainid, id)
                     .eq(BaseDo::getDeleted, NO_DELETED));
             if (reportOutputDos.isEmpty()) {
                 log.error("无法根据ID:{}获取到输出物料信息", id);
-                return R.error("无法获取到输出物料信息");
+                throw new CustomException("无法获取到输出物料信息");
+            }
+            LambdaUpdateWrapper<ApsReportRecordsDo> reportUpdateWrapper = new LambdaUpdateWrapper<>();
+            //根据输出物料信息,赋值更新报工记录的合格信息
+            //查询不合格的输出
+            List<ApsReportOutputDo> unQualifiedList = reportOutputDos.stream().filter(item -> item.getQualified().equals("否")).collect(Collectors.toList());
+            if (unQualifiedList.isEmpty()) {
+                reportUpdateWrapper.set(ApsReportRecordsDo::getQualified, "是");
+            } else {
+                reportUpdateWrapper.set(ApsReportRecordsDo::getQualified, "否");
+                String defectdesc = "";
+                for (ApsReportOutputDo apsReportOutputDo : unQualifiedList) {
+                    String mainError = "";
+                    String secondError = "";
+                    if (StringUtils.isNotBlank(apsReportOutputDo.getMajordesc())) {
+                        mainError = apsReportOutputDo.getMajordesc();
+                    }
+                    if (StringUtils.isNotBlank(apsReportOutputDo.getMinordesc())) {
+                        secondError = apsReportOutputDo.getMinordesc();
+                    }
+                    defectdesc += apsReportOutputDo.getOutputnumber() + "-主要缺陷:" + mainError + ";次要缺陷:" + secondError + "。";
+                }
+                reportUpdateWrapper.set(ApsReportRecordsDo::getDefectdesc, defectdesc);
             }
+
+            apsReportRecordsService.update(reportUpdateWrapper.eq(ApsReportRecordsDo::getId, id)
+                    .set(ApsReportRecordsDo::getCheckstatus, VERIFIED));
+
             // 获取工序作业信息
             String currentProcessOperationId = reportRecordsDo.getProcessoperationid();
             if (StringUtils.isBlank(currentProcessOperationId)) {
                 log.error("当前报工记录:{}无法获取到对应的工序作业信息!", id);
-                return R.error("无法获取到工序作业信息,请联系系统管理员!");
+                throw new CustomException("无法获取到工序作业信息,请联系系统管理员!");
             }
             // 获取工序作业主表信息
             ApsProcessOperationDo currentProcessOperationMainDo = apsProcessOperationService.getOne(new LambdaQueryWrapper<ApsProcessOperationDo>()
@@ -145,13 +169,13 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                     .eq(BaseDo::getDeleted, NO_DELETED));
             if (currentProcessOperationMainDo == null) {
                 log.error("无法根据ID:{}获取到工序作业信息", id);
-                return R.error("无法获取到工序作业信息,请联系系统管理员!");
+                throw new CustomException("无法获取到工序作业信息,请联系系统管理员!");
             }
             // 获取工序作业明细信息
             ApsProcessOperationProcessEquDo currentProcessOperationEqu = apsProcessOperationProcessEquService.getById(reportRecordsDo.getProcessequid());
             if (currentProcessOperationEqu == null) {
                 log.error("无法找到当前报工记录对应的工序作业信息");
-                return R.error("无法找到当前报工记录对应的工序作业信息");
+                throw new CustomException("无法找到当前报工记录对应的工序作业信息");
             }
             // 获取工序作业对应的输出物料信息
             List<ApsProcessOperationOutMaterDo> operationOutMaterDoList = apsProcessOperationOutMaterService.list(new LambdaQueryWrapper<ApsProcessOperationOutMaterDo>()
@@ -159,7 +183,7 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                     .eq(BaseDo::getDeleted, NO_DELETED));
             if (operationOutMaterDoList.isEmpty()) {
                 log.error("无法根据工序作业ID:{}获取对应的输出物料信息", currentProcessOperationId);
-                return R.error("无法获取到对应的输出物料信息");
+                throw new CustomException("无法获取到对应的输出物料信息");
             }
             // 工序作业明细ID
             String processOperationEquId = currentProcessOperationEqu.getId();
@@ -169,32 +193,32 @@ public class ReportCheckServiceImpl implements ReportCheckService {
             String blankId = currentProcessOperationMainDo.getBlankid();
             if (StringUtils.isBlank(blankId)) {
                 log.error("无法根据工序获取到生产订单信息");
-                return R.error("无法获取到生产订单信息");
+                throw new CustomException("无法获取到生产订单信息");
             }
             // 获取坯料计划
             ApsBlankOrderDo blankOrderDo = apsBlankOrderService.getBaseMapper().selectById(blankId);
             if (blankOrderDo == null) {
                 log.error("无法根据ID:{}找到对应的坯料计划信息", blankId);
-                return R.error("无法获取到坯料计划信息");
+                throw new CustomException("无法获取到坯料计划信息");
             }
             // 获取订单记录
             String productionOrderId = blankOrderDo.getProductionorderid();
             if (StringUtils.isBlank(productionOrderId)) {
                 log.error("坯料计划对应的订单ID为空");
-                return R.error("无法通过坯料计划找到订单信息");
+                throw new CustomException("无法通过坯料计划找到订单信息");
             }
             // 获取订单信息
             ApsProductionOrderDo productionOrderDo = apsProductionOrderService.getById(productionOrderId);
             if (productionOrderDo == null) {
                 log.error("无法根据ID:{},获取到订单信息", productionOrderId);
-                return R.error("无法找到订单信息");
+                throw new CustomException("无法找到订单信息");
             }
             // 获取当前报工作业对应的在制品信息
             List<ApsWorkInProgressInventoryDo> apsWorkInProgressInventoryDos = apsWorkInProgressInventoryService.list(new LambdaQueryWrapper<ApsWorkInProgressInventoryDo>()
                     .eq(ApsWorkInProgressInventoryDo::getWorkreportrecordid, id).eq(BaseDo::getDeleted, NO_DELETED));
             if (apsWorkInProgressInventoryDos.isEmpty()) {
                 log.error("无法获取到当前工序对应的在制品信息");
-                return R.error("无法获取在制品信息");
+                throw new CustomException("无法获取在制品信息");
             }
             // 更新当前工序作业和作业明细的已检验卷数
 
@@ -203,7 +227,7 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                 String batchnumber = reportRecordsDo.getBatchnumber();
                 if (StringUtils.isBlank(batchnumber)) {
                     log.error("报工记录的批次号为空");
-                    throw new RuntimeException("报工记录的批次号为空");
+                    throw new CustomException("报工记录的批次号为空");
                 }
                 // inputBatchNum
                 int count = (int) Arrays.stream(batchnumber.split(",")).distinct().filter(StringUtils::isNotBlank).count();

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

@@ -680,4 +680,51 @@
         AND apope.TENANTID = #{tenantId}
         AND apope.MODIFYDATE > #{startTime}
     </select>
+    <select id="getAllWaitDoList"
+            resultType="com.rongwei.bsentity.vo.ApsProcessOperationProcessEquDoAndWidthVo">
+        SELECT
+            apope.*,
+            apoom.PROWIDTH AS 'width',
+            apo.PROCESSWAY AS 'processway'
+        FROM
+            aps_process_operation_process_equ apope
+                JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID
+                JOIN aps_process_operation_out_mater apoom ON apoom.MAINID = apo.ID
+        WHERE
+            apope.DELETED = 0
+          AND apo.DELETED = 0
+          AND apoom.DELETED = 0
+          AND apope.WORKSTATUS = '待开工'
+    </select>
+    <select id="selectAllDevice" resultType="com.rongwei.bsentity.vo.DeviceCodeAndNameDownVo">
+        SELECT
+            CONCAT( CHECKITEMCODE, '(', CHECKITEMNAME, ')' ) AS 'device'
+        FROM
+            asp_check_items
+        WHERE
+            DELETED = 0
+          AND CHECKITEMCODE != ''
+          AND CHECKITEMCODE IS NOT NULL
+          AND CHECKITEMTYPE IN ('283','304')
+        AND TENANTID = #{tenantId}
+    </select>
+    <select id="selectAllRollerType" resultType="com.rongwei.bsentity.vo.RollerTypeDownVo">
+        select distinct ROLLERTYPE AS 'rollerType' from aps_roller_type where DELETED = 0 AND TENANTID = #{tenantId}
+    </select>
+    <select id="selectAllRollerTypeAndWorkShopAndDevice"
+            resultType="com.rongwei.bsentity.vo.RollerTypeExcelLookVo">
+        SELECT
+            aci.USEDEPTNAME AS 'workshop',
+            aci.CHECKITEMNAME AS 'device',
+            aci.CHECKITEMCODE AS 'deviceCode',
+            art.ROLLERTYPE AS 'rollerType'
+        FROM
+            aps_roller_type art
+                LEFT JOIN asp_check_items aci ON art.CHECKITEMID = aci.ID
+                AND aci.DELETED = 0
+        WHERE
+            art.DELETED = 0
+        AND art.TENANTID = #{tenantId}
+        ORDER BY aci.USEDEPTNAME,aci.CHECKITEMNAME,art.ROLLERTYPE
+    </select>
 </mapper>

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

@@ -147,7 +147,7 @@
             IF(apd.ALLOY = #{alloy},50,0)
                 +IF(apd.ALLOYSTATUS = #{alloystatus},30,0)
                 +IF(aptr.ORDERPRODUCTTYPEID = #{orderProductTypeId},100,0)
-                +IF(aptr.BLAMKTHICKNESS = #{thickness},10,0) AS 'core'
+                +IF(apd.THICKNESS = #{thickness},10,0) AS 'core'
         from
             aps_production_order apo
                 LEFT JOIN aps_product_detail apd ON apo.ID = apd.MAINID
@@ -162,6 +162,7 @@
             apd.ALLOY = #{alloy}
                 OR apd.ALLOYSTATUS = #{alloystatus}
                 OR aptr.ORDERPRODUCTTYPEID = #{orderProductTypeId}
+                OR apd.THICKNESS = #{thickness}
             )
         ORDER BY core desc,aptr.CREATEDATE desc
         limit 1

+ 5 - 0
cx-aps/cx-aps-entity/pom.xml

@@ -40,5 +40,10 @@
             <artifactId>wf-entity</artifactId>
             <version>1.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.3.2</version>
+        </dependency>
     </dependencies>
 </project>

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

@@ -312,5 +312,20 @@ public class ApsBlankOrderDo extends BaseDo {
      */
     @TableField("ISWAITGETMATERIAL")
     private String iswaitgetmaterial;
+    /**
+     * 订单号
+     */
+    @TableField("ORDERNO")
+    private String orderno;
+    /**
+     * 客户订单号
+     */
+    @TableField("CUSTOMORDERNO")
+    private String customorderno;
+    /**
+     * 客户名称
+     */
+    @TableField("CUSTOMNAME")
+    private String customname;
 
 }

+ 15 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsBlankOrderHistoryDo.java

@@ -259,4 +259,19 @@ public class ApsBlankOrderHistoryDo extends BaseDo {
      */
     @TableField("ISWAITGETMATERIAL")
     private String iswaitgetmaterial;
+    /**
+     * 订单号
+     */
+    @TableField("ORDERNO")
+    private String orderno;
+    /**
+     * 客户订单号
+     */
+    @TableField("CUSTOMORDERNO")
+    private String customorderno;
+    /**
+     * 客户名称
+     */
+    @TableField("CUSTOMNAME")
+    private String customname;
 }

+ 18 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductDo.java

@@ -194,6 +194,11 @@ public class ApsProcessOutputProductDo extends BaseDo {
      */
     private String rollnumberrequirement;
 
+    /**
+     * 套筒要求
+     */
+    private String sleeverequirement;
+
     /**
      * 替代产品类型ID
      */
@@ -409,5 +414,18 @@ public class ApsProcessOutputProductDo extends BaseDo {
      */
     private String blankappearance;
 
+    /**
+     * 订单号
+     */
+    private String orderno;
+    /**
+     * 客户订单号
+     */
+    private String customorderno;
+    /**
+     * 客户名称
+     */
+    private String customname;
+
     private static final long serialVersionUID = 1L;
 }

+ 18 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductHistoryDo.java

@@ -191,6 +191,11 @@ public class ApsProcessOutputProductHistoryDo extends BaseDo {
      */
     private String rollnumberrequirement;
 
+    /**
+     * 套筒要求
+     */
+    private String sleeverequirement;
+
     /**
      * 替代产品类型ID
      */
@@ -391,5 +396,18 @@ public class ApsProcessOutputProductHistoryDo extends BaseDo {
      */
     private String blankproducttypeid;
 
+    /**
+     * 订单号
+     */
+    private String orderno;
+    /**
+     * 客户订单号
+     */
+    private String customorderno;
+    /**
+     * 客户名称
+     */
+    private String customname;
+
     private static final long serialVersionUID = 1L;
 }

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

@@ -266,6 +266,14 @@ public class ApsReportRecordsDo extends BaseDo implements Serializable {
      * 是否坯料工序
      */
     private String reportifblankprocess;
+    /**
+     * 是否合格
+     */
+    private String qualified;
+    /**
+     * 缺陷描述
+     */
+    private String defectdesc;
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;

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

@@ -40,7 +40,7 @@ public class ApsWorkInProgressInventoryDo extends BaseDo implements Serializable
     private String blankbatchnumber;
 
     /**
-     * 料ID
+     * 报工输出物料ID
      */
     private String blankid;
 
@@ -179,6 +179,21 @@ public class ApsWorkInProgressInventoryDo extends BaseDo implements Serializable
      */
     private String previousworkinprocessstatus;
 
+    /**
+     * 坯料计划ID
+     */
+    private String planblankid;
+
+    /**
+     * 坯料计划编号
+     */
+    private String blanknumber;
+
+    /**
+     * 领料批次号
+     */
+    private String pickingbatchnumber;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 18 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProcessOperationProcessEquDoAndWidthVo.java

@@ -0,0 +1,18 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :sc
+ * @since :2025/4/18
+ */
+@Data
+public class ApsProcessOperationProcessEquDoAndWidthVo extends ApsProcessOperationProcessEquDo {
+    //宽
+    private BigDecimal width;
+    //加工方式
+    private String processway;
+}

+ 14 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/DeviceCodeAndNameDownVo.java

@@ -0,0 +1,14 @@
+package com.rongwei.bsentity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2025/4/19
+ */
+@Data
+public class DeviceCodeAndNameDownVo {
+    @ExcelProperty("设备列表")
+    private String device;
+}

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

@@ -50,6 +50,11 @@ public class ProductionProcesses{
      */
     private String equipmentId;
 
+    /**
+     * 工步生产时的设备
+     */
+    private String lastHistoryEquipmentId;
+
     /**
      * 工步生产时的设备
      */
@@ -636,4 +641,12 @@ public class ProductionProcesses{
     public void setOptionalEquipmentZg(Map<String, String> optionalEquipmentZg) {
         this.optionalEquipmentZg = optionalEquipmentZg;
     }
+
+    public String getLastHistoryEquipmentId() {
+        return lastHistoryEquipmentId;
+    }
+
+    public void setLastHistoryEquipmentId(String lastHistoryEquipmentId) {
+        this.lastHistoryEquipmentId = lastHistoryEquipmentId;
+    }
 }

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

@@ -0,0 +1,15 @@
+package com.rongwei.bsentity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2025/4/20
+ */
+@Data
+public class RollerTypeDownVo {
+    //辊类型
+    @ExcelProperty("辊类型")
+    private String rollerType;
+}

+ 20 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/RollerTypeExcelLookVo.java

@@ -0,0 +1,20 @@
+package com.rongwei.bsentity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2025/4/21
+ */
+@Data
+public class RollerTypeExcelLookVo {
+    @ExcelProperty("加工车间")
+    private String workshop;
+    @ExcelProperty("加工设备")
+    private String device;
+    @ExcelProperty("设备编号")
+    private String deviceCode;
+    @ExcelProperty("辊类型")
+    private String rollerType;
+}

+ 105 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/WorkShopExportVo.java

@@ -0,0 +1,105 @@
+package com.rongwei.bsentity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author :sc
+ * @since :2025/4/18
+ */
+@Data
+public class WorkShopExportVo {
+    @ExcelProperty("加工车间")
+    private String processworkshop;
+    @ExcelProperty("加工设备编号")
+    private String processdevicecode;
+    @ExcelProperty("加工设备")
+    private String processdevice;
+    @ExcelProperty("计划开工时间")
+    private Date planstartdate;
+    @ExcelProperty("计划完工时间")
+    private Date planenddate;
+    @ExcelProperty("输入物料")
+    private String planinput;
+    @ExcelProperty("输出物料")
+    private String planoutput;
+    @ExcelProperty("计划加工卷数")
+    private String planprocessrall;
+    @ExcelProperty("批次号")
+    private String showbatchnumber;
+    @ExcelProperty("客户名称")
+    private String customname;
+    @ExcelProperty("客户订单号")
+    private String customorderno;
+    @ExcelProperty("成品规格")
+    private String productspec;
+    @ExcelProperty("辊类型")
+    private String rollertype;
+    @ExcelProperty("最小等待时间")
+    private String minflowwaitmin;
+    @ExcelProperty("最大等待时间")
+    private String maxflowwaitmin;
+    @ExcelProperty("前道加工设备")
+    private String previousprocessdevice;
+    @ExcelProperty("前道完工时间")
+    private Date previousactualfinishdate;
+    @ExcelProperty("后道加工设备")
+    private String nextprocessdevice;
+    @ExcelProperty("冲突")
+    private String conflictdes;
+    @ExcelProperty("订单号")
+    private String orderno;
+    @ExcelProperty("坯料计划编号")
+    private String blanknumber;
+    @ExcelProperty("承诺交货日期-起")
+    private Date promisedatestart;
+    @ExcelProperty("承诺交货日期-止")
+    private Date promisedateend;
+    @ExcelProperty("订单产品")
+    private String outputorderproduct;
+    @ExcelProperty("工序")
+    private String process;
+    @ExcelProperty("工序显示名")
+    private String processname;
+    @ExcelProperty("已开工卷数")
+    private String startingroll;
+    @ExcelProperty("已报工卷数")
+    private String reportroll;
+    @ExcelProperty("已检验卷数")
+    private String checkoutroll;
+    @ExcelProperty("输入不合格卷数")
+    private String inputunqualifiednum;
+    @ExcelProperty("输入已取消卷数")
+    private String inputunqualifiedroll;
+    @ExcelProperty("已借调卷数")
+    private String secondroll;
+    @ExcelProperty("已取消卷数")
+    private String cancelrollno;
+    @ExcelProperty("已取消卷数合计")
+    private String cancelroll;
+    @ExcelProperty("剩余待开工卷数")
+    private String leavewaitworkroll;
+    @ExcelProperty("剩余待报工卷数")
+    private String leavewaitjobroll;
+    @ExcelProperty("作业状态")
+    private String workstatus;
+    @ExcelProperty("实际开工时间")
+    private Date actualstartdate;
+    @ExcelProperty("实际完工时间")
+    private Date actualfinishdate;
+    @ExcelProperty("坯料生产状态")
+    private String productstatus;
+    @ExcelProperty("是否锁定")
+    private String lockmarkdetail;
+    @ExcelProperty("修改日期")
+    private Date modifydate;
+    @ExcelProperty("修改人")
+    private String modifyusername;
+    @ExcelProperty("明细ID")
+    private String id;
+    @ExcelProperty("加工时长(分钟)")
+    private String time;
+
+}

+ 5 - 3
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsBlankOrderController.java

@@ -71,15 +71,17 @@ public class ApsBlankOrderController {
     public R apsScheduleRestart(@RequestParam(required = false) Integer hour,
                                 @RequestParam(required = false) String chongpaiStartDate,
                                 @RequestParam(required = false) String chongpaiEndDate,
-                                @RequestParam(required = false) String blankIds) {
-        apsBlankOrderService.apsScheduleRestart(hour, chongpaiStartDate, chongpaiEndDate, null, blankIds);
+                                @RequestParam(required = false) String blankIds,
+                                @RequestParam(required = false) Boolean haveLenZha,
+                                @RequestParam(required = false) Boolean haveTuiHuo) throws Exception {
+        apsBlankOrderService.apsScheduleRestart(hour, chongpaiStartDate, chongpaiEndDate, null, blankIds,haveLenZha,haveTuiHuo);
         return R.ok();
     }
 
     /**
      * 定时任务自动调度,每天19点执行
      */
-    @Scheduled(cron = "0 0 19 * * *")
+    @Scheduled(cron = "30 0 0 * * *")
     @GetMapping("/apsScheduleRestart2")
     public R apsScheduleRestart2() {
         apsBlankOrderService.apsScheduleRestart2();

+ 23 - 4
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java

@@ -5,14 +5,15 @@ import com.rongwei.bscommon.sys.service.ApsProcessOperationProcessEquService;
 import com.rongwei.bscommon.sys.service.GanttService;
 import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.vo.CriteriaQuery;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -149,5 +150,23 @@ public class ApsProcessOperationProcessEquController {
         log.info("车间作业跟踪锁定");
         return apsProcessOperationProcessEquService.workshopLocked(orderLockVo);
     }
+
+    /**
+     * 车间作业跟踪,导出
+     */
+    @PostMapping("/workShopExport")
+    public void workShopExport(@RequestBody CriteriaQuery query, HttpServletResponse response) throws IOException {
+        log.info("车间作业跟踪,导出");
+        apsProcessOperationProcessEquService.workShopExport(query,response);
+    }
+
+    /**
+     * 车间作业跟踪,导入
+     */
+    @PostMapping("workShopImport")
+    public R workShopImport(@RequestParam("file") MultipartFile multipartFile, HttpServletResponse response) throws IOException {
+        log.info("车间作业跟踪,导入");
+        return apsProcessOperationProcessEquService.workShopImport(multipartFile, response);
+    }
 }