From e111a303b84dd721116101b3a6837d7d126d508f Mon Sep 17 00:00:00 2001
From: zhaoxiaolin <khd@123>
Date: Tue, 16 Jul 2024 13:02:48 +0800
Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8E=92=E4=BA=A72.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/op/common/core/utils/StringUtils.java |  5 +-
 .../plan/controller/ProOrderController.java   |  5 +-
 .../java/com/op/plan/domain/ProOrder.java     |  9 ++
 .../plan/mapper/ProOrderWorkorderMapper.java  |  2 +
 .../com/op/plan/service/IProOrderService.java |  2 +-
 .../service/impl/ProOrderServiceImpl.java     | 84 ++++++++++++-------
 .../mapper/plan/ProOrderWorkorderMapper.xml   |  7 +-
 7 files changed, 77 insertions(+), 37 deletions(-)

diff --git a/op-common/op-common-core/src/main/java/com/op/common/core/utils/StringUtils.java b/op-common/op-common-core/src/main/java/com/op/common/core/utils/StringUtils.java
index a74a28af..c6b43806 100644
--- a/op-common/op-common-core/src/main/java/com/op/common/core/utils/StringUtils.java
+++ b/op-common/op-common-core/src/main/java/com/op/common/core/utils/StringUtils.java
@@ -481,7 +481,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
 	 * @param content 内容物 (根据产品,一般为0)
 	 * @return
 	 */
-	public static final List<String> batchAutoCreate(String factoryCode, String lineCode, Date productDate,String version, String content,int batchNum){
+	public static final List<String> batchAutoCreate(String factoryCode, String lineCode, Date productDate,String version, String content,int batchNum,char startZM){
 		SimpleDateFormat targetFormat = new SimpleDateFormat("yyyyMMdd");
 		// Create a Calendar instance and set it to the current date
 		Calendar calendar = Calendar.getInstance();
@@ -495,7 +495,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
 		// Format the new date
 		String toValidity = targetFormat.format(futureDate);
 		List<String> batchList=new ArrayList<>();
-		for (char letter = 'A'; letter < 'A' + batchNum; letter++) {
+
+		for (char letter = startZM; letter < startZM + batchNum; letter++) {
 			String BatchCode=toValidity+Constants.LJ+targetFormat.format(productDate)+lineCode+factoryCode+letter+Constants.OUTPUT_STATUS_A+content+version;
 			batchList.add(BatchCode);
 		}
diff --git a/op-modules/op-plan/src/main/java/com/op/plan/controller/ProOrderController.java b/op-modules/op-plan/src/main/java/com/op/plan/controller/ProOrderController.java
index f035cb6c..ca993fdf 100644
--- a/op-modules/op-plan/src/main/java/com/op/plan/controller/ProOrderController.java
+++ b/op-modules/op-plan/src/main/java/com/op/plan/controller/ProOrderController.java
@@ -341,8 +341,9 @@ public class ProOrderController extends BaseController {
 
     /**辅助排产**/
     @PostMapping("/autoSplitOrder")
-    public R autoSplitOrder(@RequestBody ProOrder proOrder) {
-        return proOrderService.autoSplitOrder(proOrder);
+    public AjaxResult autoSplitOrder(@RequestBody ProOrder proOrder) {
+        AjaxResult r= proOrderService.autoSplitOrder(proOrder);
+        return r;
     }
 
     /**辅助排产取消**/
diff --git a/op-modules/op-plan/src/main/java/com/op/plan/domain/ProOrder.java b/op-modules/op-plan/src/main/java/com/op/plan/domain/ProOrder.java
index 112c0a9c..457f61a7 100644
--- a/op-modules/op-plan/src/main/java/com/op/plan/domain/ProOrder.java
+++ b/op-modules/op-plan/src/main/java/com/op/plan/domain/ProOrder.java
@@ -75,6 +75,15 @@ public class ProOrder extends TreeEntity {
 	private String routeCode;
 	private Integer endFlag;
 	private String belongWorkOrder;
+	private String shiftId;
+
+	public String getShiftId() {
+		return shiftId;
+	}
+
+	public void setShiftId(String shiftId) {
+		this.shiftId = shiftId;
+	}
 
 	public String getBelongWorkOrder() {
 		return belongWorkOrder;
diff --git a/op-modules/op-plan/src/main/java/com/op/plan/mapper/ProOrderWorkorderMapper.java b/op-modules/op-plan/src/main/java/com/op/plan/mapper/ProOrderWorkorderMapper.java
index a12d16ed..c3eb57a4 100644
--- a/op-modules/op-plan/src/main/java/com/op/plan/mapper/ProOrderWorkorderMapper.java
+++ b/op-modules/op-plan/src/main/java/com/op/plan/mapper/ProOrderWorkorderMapper.java
@@ -231,5 +231,7 @@ public interface ProOrderWorkorderMapper {
     List<ProOrderWorkorder> selectFirWorkOrderCG(String id);
 
     List<ProOrderWorkorder> selectChildWorkOrderCG(String workorderCode);
+
+    List<String> getBatchDict(String batchFlag);
 }
 
diff --git a/op-modules/op-plan/src/main/java/com/op/plan/service/IProOrderService.java b/op-modules/op-plan/src/main/java/com/op/plan/service/IProOrderService.java
index 7debc0a6..b0c96781 100644
--- a/op-modules/op-plan/src/main/java/com/op/plan/service/IProOrderService.java
+++ b/op-modules/op-plan/src/main/java/com/op/plan/service/IProOrderService.java
@@ -148,7 +148,7 @@ public interface IProOrderService {
 
     ProOrder getCanProductLine(ProOrder proOrder);
 
-    R autoSplitOrder(ProOrder proOrder);
+    AjaxResult autoSplitOrder(ProOrder proOrder);
 
     AjaxResult getWorkOrderListCG(String id);
 
diff --git a/op-modules/op-plan/src/main/java/com/op/plan/service/impl/ProOrderServiceImpl.java b/op-modules/op-plan/src/main/java/com/op/plan/service/impl/ProOrderServiceImpl.java
index 32ab6907..6c03eefb 100644
--- a/op-modules/op-plan/src/main/java/com/op/plan/service/impl/ProOrderServiceImpl.java
+++ b/op-modules/op-plan/src/main/java/com/op/plan/service/impl/ProOrderServiceImpl.java
@@ -1,6 +1,7 @@
 package com.op.plan.service.impl;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -1318,37 +1319,46 @@ public class ProOrderServiceImpl implements IProOrderService {
         //所有线体
         List<ProOrder> lineList = proOrderMapper.getCanProductLine();
         dto.setLineList(lineList);
+
+        List<ProOrder> proLines = proOrderMapper.getSelectLineLevel1(proOrder);
+        BigDecimal todayPro = new BigDecimal(BigInteger.ZERO);//当日设备实际产能
+        for(ProOrder pLines:proLines){
+            todayPro = todayPro.add(pLines.getEfficiency());
+        }
+
+        if(todayPro.doubleValue() < proOrder.getQuantity()){
+            logger.error("当日设备产能达不到订单要求");
+            return null;
+        }
+
         //推荐线体
-        List<String> recommendLineList = getRecommendLines(proOrder);
+        List<String> recommendLineList = getRecommendLines(proLines,proOrder);
         dto.setRecommendLineList(recommendLineList);
         return dto;
     }
 
     @Override
     @DS("#header.poolName")
-    public R autoSplitOrder(ProOrder proOrder) {
+    public AjaxResult autoSplitOrder(ProOrder proOrder) {
 
         Date nowTime = DateUtils.getNowDate();//公共时间
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String key = "#header.poolName";
         proOrder.setFactoryCode(request.getHeader(key.substring(8)).replace("ds_",""));
         proOrder.setCreateTime(nowTime);
+        String shiftId = proOrder.getShiftId();
         //订单总量
         proOrder.setQuantitySplit(proOrder.getQuantitySplit()==null?0L:proOrder.getQuantitySplit());
         Long orderQua = proOrder.getQuantity()-proOrder.getQuantitySplit();
         //有几个设备就有几个工单
         for(int i=0;i<proOrder.getLineCodes().length;i++){
-            if(orderQua == 0L){
-                logger.info("线体产能满足生产");
-                break;
-            }
             List<ProOrderWorkorder> workorders = new ArrayList<>();
 
             proOrder.setLineCode(proOrder.getLineCodes()[i]);
             ProLine plineInfo = proOrderWorkorderMapper.getLineProductInfo(proOrder);//线体母单产品产能和线体代码
             if(plineInfo==null){
                 logger.error("线体"+proOrder.getLineCodes()[i]+"无法生产");
-                return R.fail("线体"+proOrder.getLineCodes()[i]+"无法生产");
+                return AjaxResult.error(642,"线体"+proOrder.getLineCodes()[i]+"无法生产");
             }
             Long efficiency = plineInfo.getEfficiency();
             if(efficiency < orderQua){
@@ -1365,6 +1375,7 @@ public class ProOrderServiceImpl implements IProOrderService {
             proOrder.setBelongWorkOrder(belongWorkOrder);
             proOrder.setWorkerOrder(belongWorkOrder);
             proOrder.setParentOrder("0");
+            proOrder.setShiftId(shiftId);
             ProOrderWorkorder pworkOrder = getWorkOrderByOrder(proOrder,proOrder);//TODO;
             //父级
             workorders.add(pworkOrder);
@@ -1384,6 +1395,7 @@ public class ProOrderServiceImpl implements IProOrderService {
                 sonOrder.setWorkerOrder(sworkOrderCode);
                 sonOrder.setParentOrder(parentWorkOrder);
                 sonOrder.setQuantitySplit(sonOrder.getQuantity());
+                sonOrder.setShiftId(shiftId);
                 if(CollectionUtils.isEmpty(sonOrder.getChildren())){
                     sonOrder.setEndFlag(1);
                 }
@@ -1412,7 +1424,16 @@ public class ProOrderServiceImpl implements IProOrderService {
 
             /**拆批次**/
             proOrder.setProdSpc(plineInfo.getDh());//借用字段
+
+
+
             List<ProOrderWorkorderBatch> workorderBatches0 = getBatchList(proOrder);//TODO;
+
+            if(CollectionUtils.isEmpty(workorderBatches0)){
+                logger.error("批次太多,请检查【产品批次数量】、【产线产能】、【批次号夜班开始字母】是否设置正常。");
+                return AjaxResult.error(642,"批次太多,请检查产品批次数量是否设置正常。");
+            }
+
             List<ProOrderWorkorderBatch> workBatchs = new ArrayList<>();
             for(int m=0;m<workorders.size();m++){
                 ProOrderWorkorder work = workorders.get(m);
@@ -1440,18 +1461,12 @@ public class ProOrderServiceImpl implements IProOrderService {
 
             /**pro_order_workorder_batch**/
             if(!CollectionUtils.isEmpty(workBatchs)) {
-
-                if(workBatchs.size()>100){
-                    logger.error("批次太多,请检查产品批次数量是否设置正常。");
-                    return R.fail("批次太多,请检查产品批次数量是否设置正常。");
-                }
-
                 int pn = proOrderWorkorderBatchMapper.insertWorkorderBatchs(workBatchs);
                 System.out.println("pn:"+pn);
             }
         }
 
-        return R.ok();
+        return AjaxResult.success();
     }
 
     /**
@@ -1507,12 +1522,33 @@ public class ProOrderServiceImpl implements IProOrderService {
             pworkOrderQua = pworkOrderQua - batchQua0.getBatchQuaStandar().longValue();
         }
 
+        List<String> batches = proOrderWorkorderMapper.getBatchDict("batch_flag");
+        char dayWorkBatchStart = batches.get(0).charAt(0);
+        char nightWorkBatchStart = batches.get(1).charAt(0);
+        int dayBatches = nightWorkBatchStart - dayWorkBatchStart;
+        int nigthBatches = 'Z' - nightWorkBatchStart;
+
+        int maxBatchNum = 0;
+        char startZM = 'A';
+        if("5".equals(proOrder.getShiftId())){//白班
+            maxBatchNum = nightWorkBatchStart - dayWorkBatchStart;
+            startZM = dayWorkBatchStart;
+        }else if("2".equals(proOrder.getShiftId())){//夜班
+            maxBatchNum = 'Z' - nightWorkBatchStart;
+            startZM = nightWorkBatchStart;
+        }
+
+        if(workorderBatches.size()>maxBatchNum){
+            logger.error("大于工厂字典【batch_flag】推理的的批次数");
+            return null;
+        }
+
         //获取批次号集合
         List<String> batchCodes = StringUtils.batchAutoCreate(proOrder.getFactoryCode(),
                 proOrder.getProdSpc(),
                 DateUtils.dateTime("yyyy-MM-dd",proOrder.getProductDate()),
                 proOrder.getAtrr2().substring(proOrder.getAtrr2().length()-1),
-                "0",workorderBatches.size());
+                "0",workorderBatches.size(),startZM);
 
         for(int n=0;n<workorderBatches.size();n++){
             workorderBatches.get(n).setBatchCode(batchCodes.get(n));
@@ -1527,9 +1563,8 @@ public class ProOrderServiceImpl implements IProOrderService {
      * 2、可生产产品种类最少的线体。
      * @param proOrder
      */
-    protected List<String> getRecommendLines(ProOrder proOrder){
+    protected List<String> getRecommendLines(List<ProOrder> proLines,ProOrder proOrder){
         List<String> lines = new ArrayList<>();
-        List<ProOrder> proLines = proOrderMapper.getSelectLineLevel1(proOrder);
         //订单总量
         proOrder.setQuantitySplit(proOrder.getQuantitySplit()==null?0L:proOrder.getQuantitySplit());
         BigDecimal orderQuality = new BigDecimal(proOrder.getQuantity()).subtract(new BigDecimal(proOrder.getQuantitySplit()));
@@ -1547,18 +1582,7 @@ public class ProOrderServiceImpl implements IProOrderService {
 
 
     public static void main(String args[]){
-//        String arrayStr = "[[\"GX01\",\"LG1\"],[\"GX01\",\"LG2\"],[\"GX02\",\"S1\"],[\"GX02\",\"S2\"],[\"GX03\",\"HF01\"],[\"GX04\",\"SPJ01\"]]";
-//        JSONArray jsonArray = JSONArray.parseArray(arrayStr);
-//        for(int c=0;c<jsonArray.size();c++){
-//            System.out.println(jsonArray.getJSONArray(c).getString(1));
-//        }
-//        BigDecimal a = new BigDecimal("100");
-//        BigDecimal b = new BigDecimal("100");
-//        System.out.println(a.compareTo(b));
-        int m=1;
-        while(m<3){
-            ++m;
-        }
-        System.out.println(m);
+        char zm = 'D';
+        System.out.println(zm-'A'+1);
     }
 }
diff --git a/op-modules/op-plan/src/main/resources/mapper/plan/ProOrderWorkorderMapper.xml b/op-modules/op-plan/src/main/resources/mapper/plan/ProOrderWorkorderMapper.xml
index 1279a840..5d212b51 100644
--- a/op-modules/op-plan/src/main/resources/mapper/plan/ProOrderWorkorderMapper.xml
+++ b/op-modules/op-plan/src/main/resources/mapper/plan/ProOrderWorkorderMapper.xml
@@ -671,6 +671,9 @@
         from base_product
         where del_flag = '0'  and product_code = #{prodCode}
     </select>
+    <select id="getBatchDict" resultType="java.lang.String">
+        select dict_value from base_dict_data where dict_type = #{batchFlag} order by dict_value
+    </select>
 
     <insert id="createPrepareDetails">
         insert into mes_prepare_detail
@@ -778,7 +781,7 @@
             product_name,unit,quantity_split,route_code,prod_line_code,
             product_date,parent_order, status,create_by,create_time,
             prod_type,factory_code,end_flag,del_flag,sort_no,
-            belong_work_order
+            belong_work_order,shift_id
         )VALUES
         <foreach collection="list" item="d" index="index" separator=",">
             (
@@ -786,7 +789,7 @@
             #{d.productName},#{d.unit},#{d.quantitySplit},#{d.routeCode},#{d.prodLineCode},
             #{d.productDate},#{d.parentOrder},#{d.status},#{d.createBy},#{d.createTime},
              #{d.prodType}, #{d.factoryCode},#{d.endFlag},'2',#{d.sortNo},
-            #{d.belongWorkOrder}
+            #{d.belongWorkOrder},#{d.shiftId}
             )
         </foreach>
     </insert>