From f201f17d7e25e71d22b9c8b821e387bdc8fba52d Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期一, 12 五月 2025 16:42:07 +0800
Subject: [PATCH] 添加判断当前时间是否没有该检测项的抽样计划功能

---
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java             |    4 -
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java          |    9 ++
 inspect-server/src/main/resources/mapper/InsOrderMapper.xml                          |   14 +++
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java            |   10 ++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java |  183 +++++++++++++++++++++++++++++++++------------
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java    |    6 +
 6 files changed, 172 insertions(+), 54 deletions(-)

diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index 880fad5..5e20dcd 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -267,4 +267,10 @@
         return Result.success();
     }
 
+    @ApiOperation(value = "鏌ヨ褰撳墠鏃堕棿鏄惁娌℃湁璇ユ娴嬮」鐨勬娊鏍疯鍒�")
+    @PostMapping("/judgeNotSpotCheckOrder")
+    public Result<?> judgeNotSpotCheckOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
+        return insOrderService.judgeNotSpotCheckOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder());
+    }
+
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java
index 1ccf266..87e9b9a 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java
@@ -13,8 +13,6 @@
     @ApiModelProperty("妫�楠岄」鐩�")
     private List<InsProduct> insProduct;
 
-//    private List<BushingDto> bushing;
-
     @ApiModelProperty("瀛愭牱鍝侀厤缃�")
     private List<SampleProductDto> childSampleList;
 
@@ -23,8 +21,6 @@
 
     @ApiModelProperty("杈呭姪绾胯姱閰嶇疆")
     private InsulatingDto auxiliaryWireCore;
-
-//    private SheathDto sheath;
 
     @ApiModelProperty("妫�楠屼汉")
     private String checkName;
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
index 94a172a..7c91fc1 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -5,7 +5,6 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.pojo.StructureTestObject;
-import com.ruoyi.inspect.dto.CostStatisticsDto;
 import com.ruoyi.inspect.dto.SampleOrderDto;
 import com.ruoyi.inspect.dto.SampleProductDto2;
 import com.ruoyi.inspect.dto.SampleProductExportDto;
@@ -136,4 +135,13 @@
      * @return
      */
     List<SampleOrderDto> getInsOrderExportByIds(@Param("orderIds") List<String> orderIds);
+
+    /**
+     * 鏌ヨ褰撳墠鏃堕棿鏄惁鏈夎妫�娴嬮」鐨勬娊鏍疯鍒掕鍗�
+     * @param itmeId    鏍峰搧Id
+     * @param startTime 寮�濮嬫椂闂�
+     * @param endTime   缁撴潫鏃堕棿
+     * @return
+     */
+    Integer selectNotSpotCheckOrder(@Param("itmeId") Integer itmeId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
index a0a8192..ab022c5 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.inspect.pojo.InsOrder;
 import com.ruoyi.inspect.pojo.InsSample;
 import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
@@ -114,4 +115,12 @@
      * @param insSample
      */
     void updateSampleModel(InsSample insSample);
+
+    /**
+     * 鏌ヨ褰撳墠鏃堕棿鏄惁娌℃湁璇ユ娴嬮」鐨勬娊鏍疯鍒�
+     * @param sampleList
+     * @param insOrder
+     * @return
+     */
+    Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder);
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index 9c599ac..55d6e7f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -13,15 +13,18 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
 import com.ruoyi.basic.mapper.StandardProductListMapper;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
 import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.basic.pojo.StructureItemParameter;
 import com.ruoyi.basic.pojo.StructureTestObject;
 import com.ruoyi.common.constant.InsOrderTypeConstants;
+import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.common.numgen.NumberGenerator;
 import com.ruoyi.common.utils.*;
@@ -35,8 +38,6 @@
 import com.ruoyi.inspect.service.InsProductService;
 import com.ruoyi.inspect.service.InsSampleService;
 import com.ruoyi.inspect.vo.InsOrderPrintingVo;
-import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHoursTemporary;
-import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursTemporaryService;
 import com.ruoyi.system.mapper.UserMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
@@ -82,14 +83,13 @@
     private IfsApiUtils ifsApiUtils;
     private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
     private StandardProductListMapper standardProductListMapper;
-    private AuxiliaryOutputWorkingHoursTemporaryService auxiliaryOutputWorkingHoursTemporaryService;
+    private StructureItemParameterMapper structureItemParameterMapper;
 
 
 
     //鑾峰彇妫�楠屼笅鍗曟暟鎹�
     @Override
     public IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto) {
-        //todo: 鍙湅鎴戝垽鏂叏閮�,涓汉,缁勭粐鐨勬潈闄�
         String laboratory = null;
         // 鍒ゆ柇鏄惁鏄叏閮�
         String isOrderAll = null;
@@ -155,53 +155,9 @@
             spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem);
         }
 
-        // 鍒涘缓宸ユ椂鏆傚瓨
-        // 缂撳瓨鏍峰搧id, 缂栧彿map
-//        addWorkingHoursTemporary(userId, insSamples, ids, order);
-
         return 1;
     }
 
-    /**
-     * 鍒涘缓宸ユ椂鏆傚瓨
-     * @param userId
-     * @param insSamples
-     * @param ids
-     * @param order
-     */
-    private void addWorkingHoursTemporary(Integer userId, List<InsSample> insSamples, List<Integer> ids, InsOrder order) {
-        Map<Integer, String> sampleMap = insSamples.stream().collect(Collectors.toMap(InsSample::getId, InsSample::getSampleCode));
-        List<InsProduct> insProductList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
-                .in(InsProduct::getInsSampleId, ids)
-                .eq(InsProduct::getState, 1));
-        List<AuxiliaryOutputWorkingHoursTemporary> outputWorkingHours = insProductList.stream().map(insProduct -> {
-            AuxiliaryOutputWorkingHoursTemporary auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHoursTemporary();
-            auxiliaryOutputWorkingHours.setInspectionItemClass(insProduct.getInspectionItemClass());//妫�娴嬮」鍒嗙被
-            auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//妫�娴嬬埗椤�
-            auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//妫�娴嬪瓙椤�
-            auxiliaryOutputWorkingHours.setSample(sampleMap.get(insProduct.getInsSampleId()));//鏍峰搧缂栧彿
-            auxiliaryOutputWorkingHours.setOrderId(order.getId());//璁㈠崟id
-            auxiliaryOutputWorkingHours.setOrderNo(order.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
-            auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//闈炲姞鐝伐鏃�
-            auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
-            auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
-            auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//宸ユ椂鍒嗙粍
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡
-            LocalDateTime localDateTime = LocalDateTime.now();
-            DateTime parse = DateUtil.parse(localDateTime.format(formatter));
-            auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡
-            auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ
-            auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉
-            auxiliaryOutputWorkingHours.setPrice(insProduct.getPrice());//鍗曚环
-            auxiliaryOutputWorkingHours.setSampleId(insProduct.getInsSampleId());//鏍峰搧id
-            auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//妫�楠岄」id
-
-            return auxiliaryOutputWorkingHours;
-        }).collect(Collectors.toList());
-        auxiliaryOutputWorkingHoursTemporaryService.saveBatch(outputWorkingHours);
-    }
 
     public static String getWeek(String dayStr) {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -237,6 +193,19 @@
             default:
                 return "鏈煡";
         }
+    }
+
+
+    // 濡傛灉浣犱娇鐢� Java 8+锛屼篃鍙互鐢� Stream API 绠�鍖栦唬鐮侊細
+    public List<StandardProductList> findMissingItemsWithStream(List<StandardProductList> standardList,
+                                                                List<InsProduct> insList) {
+        Set<Integer> insIds = insList.stream()
+                .map(InsProduct::getStructureItemParameterId)
+                .collect(Collectors.toSet());
+
+        return standardList.stream()
+                .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -1061,6 +1030,122 @@
                 .set(InsSample::getModel, insSample.getModel()));
     }
 
+    /**
+     * 鏌ヨ褰撳墠鏃堕棿鏄惁娌℃湁璇ユ娴嬮」鐨勬娊鏍疯鍒�
+     * @param sampleList
+     * @param insOrder
+     * @return
+     */
+    @Override
+    public Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder) {
+        // todo: 涓嬪崟鍒ゆ柇鎶芥牱璁″垝鐨勫敮涓�鎬�
+        if (insOrder.getQuarterItemId() != null) {
+            Long quarterItemCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                    .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId())
+                    .notIn(InsOrder::getState, -1 ,2 ,3));
+            if (quarterItemCount > 0) {
+                throw new ErrorException("璇ユ娊鏍疯鍒掑凡琚粦瀹氳繃");
+            }
+        }
+
+        // 鍒ゆ柇鏄惁鏄娊鏍锋娴�
+        if (insOrder.getOrderType().equals(InsOrderTypeConstants.SPOT_CHECK)) {
+            Set<String> monthMessageSet = new HashSet<>();
+            Set<String> quarterMessageSet = new HashSet<>();
+            Set<String> yearMessageSet = new HashSet<>();
+
+            String formatTime = "yyyy-MM-dd HH:mm:ss";
+            // 鏌ヨ褰撳墠鎵�鏈夋牱鍝佺殑妫�楠岄」
+            for (SampleProductDto sampleProductDto : sampleList) {
+                List<StandardProductList> standardProductList = getProductTreeBySampleId(sampleProductDto.getId());
+
+                Set<Integer> insIds = sampleProductDto.getInsProduct().stream()
+                        .map(InsProduct::getStructureItemParameterId)
+                        .collect(Collectors.toSet());
+
+                List<StandardProductList> productLists = standardProductList.stream()
+                        .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
+                        .collect(Collectors.toList());
+
+                // 鏌ヨ妫�楠岄」鍩虹琛�, 鏌ヨ鏄惁鏈夋湀搴�, 瀛e害, 骞村害鐨勬楠岄」
+                List<StructureItemParameter> itemParameterList = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
+                        .in(StructureItemParameter::getId, productLists.stream().map(StandardProductList::getStructureItemParameterId).collect(Collectors.toList())));
+
+                for (StructureItemParameter item : itemParameterList) {
+                    if (StringUtils.isNotBlank(item.getSpotCheckType())) {
+                        switch (item.getSpotCheckType()) {
+                            case "1": // 鏈堝害
+                                // 鏌ヨ褰撴湀鏄惁鏈夎妫�娴嬮」鐨勬娊鏍疯鍒�
+                                // 褰撴湀寮�濮嬫椂闂�
+                                DateTime monthStart = DateUtil.beginOfMonth(DateUtil.date());
+                                String monthStartTime = monthStart.toString(formatTime);
+                                // 褰撴湀缁撴潫鏃堕棿
+                                DateTime monthEnd = DateUtil.endOfMonth(DateUtil.date());
+                                String monthEndTime = monthEnd.toString(formatTime);
+                                Integer count = insOrderMapper.selectNotSpotCheckOrder(item.getId(), monthStartTime, monthEndTime);
+                                if (count == 0) {
+                                    String monthMessage = item.getInspectionItemClass() +
+                                            item.getInspectionItem() +
+                                            item.getInspectionItemSubclass();
+                                    monthMessageSet.add(monthMessage);
+                                }
+                                break;
+                            case "2": // 瀛e害
+                                DateTime quarterStart = DateUtil.beginOfQuarter(DateUtil.date());
+                                String quarterStartTime = quarterStart.toString(formatTime);
+                                // 褰撴湀缁撴潫鏃堕棿
+                                DateTime quarterEnd = DateUtil.endOfQuarter(DateUtil.date());
+                                String quarterEndTime = quarterEnd.toString(formatTime);
+                                Integer quarterCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), quarterStartTime, quarterEndTime);
+                                if (quarterCount == 0) {
+                                    String quarterMessage = item.getInspectionItemClass() +
+                                            item.getInspectionItem() +
+                                            item.getInspectionItemSubclass();
+                                    quarterMessageSet.add(quarterMessage);
+                                }
+
+                                break;
+                            case "3": // 骞村害
+                                DateTime yearStart = DateUtil.beginOfQuarter(DateUtil.date());
+                                String yearStartTime = yearStart.toString(formatTime);
+                                // 褰撴湀缁撴潫鏃堕棿
+                                DateTime yearEnd = DateUtil.endOfQuarter(DateUtil.date());
+                                String yearEndTime = yearEnd.toString(formatTime);
+                                Integer yearCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), yearStartTime, yearEndTime);
+                                if (yearCount == 0) {
+                                    String yearMessage = item.getInspectionItemClass() +
+                                            item.getInspectionItem() +
+                                            item.getInspectionItemSubclass();
+                                    yearMessageSet.add(yearMessage);
+                                }
+
+                                break;
+                        }
+                    }
+                }
+            }
+
+            String message = "";
+            if (CollectionUtils.isNotEmpty(monthMessageSet)) {
+                message += StrUtil.format("<p>妫�楠岄」<span style=\"color: red\">{}</span>褰撴湀杩樻湭杩涜鎶芥牱妫�娴�, 璇锋煡鐪嬫槸鍚﹂渶瑕佹坊鍔犲綋鍓嶆楠岄」</p>", CollUtil.join(monthMessageSet, ", "));
+            }
+
+            if (CollectionUtils.isNotEmpty(quarterMessageSet)) {
+                message += StrUtil.format("<p>妫�楠岄」<span style=\"color: red\">{}</span>褰撳墠瀛e害杩樻湭杩涜鎶芥牱妫�娴�, 璇风湅鏄惁闇�瑕佹坊鍔犲綋鍓嶆楠岄」</p>", CollUtil.join(quarterMessageSet, ", "));
+            }
+
+            if (CollectionUtils.isNotEmpty(yearMessageSet)) {
+                message += StrUtil.format("<p>妫�楠岄」<span style=\"color: red\">{}</span>浠婂勾杩樻湭杩涜鎶芥牱妫�娴�, 璇风湅鏄惁闇�瑕佹坊鍔犲綋鍓嶆楠岄」</p>", CollUtil.join(yearMessageSet, ", "));
+            }
+
+            if (StringUtils.isNotBlank(message)) {
+                return Result.success(false, message);
+            }
+        }
+        return Result.success(true);
+
+    }
+
 }
 
 
diff --git a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
index ad38e37..78234d5 100644
--- a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -455,4 +455,18 @@
         GROUP BY io.id,type
         order by type desc,io.id desc
     </select>
+
+    <!-- 鏌ヨ褰撳墠鏃堕棿鏄惁鏈夎妫�娴嬮」鐨勬娊鏍疯鍒掕鍗� -->
+    <select id="selectNotSpotCheckOrder" resultType="java.lang.Integer">
+        select count(*)
+        from (select io.id
+              from ins_product ip
+                       left join ins_sample is2 on is2.id = ip.ins_sample_id
+                       left join ins_order io on io.id = is2.ins_order_id
+                       left join spot_check_quarter_item scqi on scqi.quarter_item_id = io.quarter_item_id
+              where io.quarter_item_id is not null
+                and scqi.spot_check_time between #{startTime} and #{endTime}
+                and ip.structure_item_parameter_id = #{itmeId}
+              group by io.id) a
+    </select>
 </mapper>

--
Gitblit v1.9.3