瀏覽代碼

Merge remote-tracking branch 'origin/master'

xiahan 1 年之前
父節點
當前提交
2c896e026c

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

@@ -39,7 +39,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
                                     @Param("endTime") Date endTime,
                                     @Param("factoryId") String factoryId,
                                     @Param("workshopIds") List<String> workshopId,
-                                    @Param("orderNos") List<String> orderNo);
+                                    @Param("orderNos") List<String> orderNo,
+                                    @Param("processids") String processids);
 
     void updateAboutStateByProcessId(@Param("updateIds") List<ProcessIdRelationVo> updateIds);
 

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

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

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

@@ -738,9 +738,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         processes.setProcessType(operationDo.getProcess());
                         // 单次加工时长
                         processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
-                        processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
+                        processes.setProduceTime(processes.getUnitProduceTime() * processes.getProducePcNum());
 //                        processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
-                        if(operationDo.getMinflowwaitmin() != null){
+                        if (operationDo.getMinflowwaitmin() != null) {
                             processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
                         }
                         if (operationDo.getMaxflowwaitmin() != null) {
@@ -1199,9 +1199,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                             if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
                                     || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
                                 return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
-                            } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
-                                return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                             }
+                        } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
+                            return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                         }
                         break;
                     }
@@ -1306,6 +1306,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
         //更新或保存坯料计划和输出成品
         this.saveOrUpdate(apsBlankOrderDo);
+        for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
+            apsProcessOutputProductDo.setBlankid(apsBlankOrderDo.getId());
+        }
         apsProcessOutputProductService.saveOrUpdateBatch(apsProcessOutputProductDoList);
 
         //如果在制品不为空,并且为新增备料

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

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

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

@@ -1,11 +1,18 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
+import com.rongwei.bscommon.sys.service.ApsProcessOperationService;
 import com.rongwei.bscommon.sys.service.GanttService;
+import com.rongwei.bsentity.domain.ApsProcessOperationDo;
 import com.rongwei.bsentity.vo.GanttVos;
 import com.rongwei.bsentity.vo.ScheduleGanttVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,6 +55,9 @@ public class GanttServiceImpl implements GanttService {
     public static final String DEFAULT_TYPE = "project";
     public static final String DEFAULT_RENDER = "split";
 
+    @Autowired
+    private ApsProcessOperationService apsProcessOperationService;
+
     /**
      * 根据条件获取gantt
      *
@@ -69,7 +79,8 @@ public class GanttServiceImpl implements GanttService {
                 searchDateList==null?null:searchDateList.get(1),
                 factoryId,
                 workShopIdList,
-                orderNoList);
+                orderNoList,
+                null);
         // 需要返回给前端的数据
         List<ScheduleGanttVo> resultVo = new ArrayList<>();
         if (apsProcessOperationProcessEquDos.isEmpty()) {
@@ -252,4 +263,48 @@ public class GanttServiceImpl implements GanttService {
         returnDate.add(Date.from(sixDaysLaterEnd.atZone(ZoneId.systemDefault()).toInstant()));
         return returnDate;
     }
+
+    /**
+     * 查找上一个或者下一个工序节点
+     * @param ganttVosList
+     * @param operatorType  next:下一节点,pre:上一节点
+     * @return
+     */
+    public List<GanttVos> getNextProcess(List<GanttVos> ganttVosList,String operatorType){
+        List<GanttVos> retGantvos = null;
+        // 获取下一个或者上一个工序
+        if(ganttVosList != null && ganttVosList.size()>0){
+            List<String> processids = ganttVosList.stream().map(v->v.getProcessid()).collect(Collectors.toList());
+            // 获取上一节点或者下一节点
+            List<ApsProcessOperationDo> processOperations = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+                    .in(ApsProcessOperationDo::getId, processids));
+            List<String> queryProcessids = new ArrayList<>();
+            if(processOperations != null && processOperations.size()>0){
+                for (ApsProcessOperationDo processOperation : processOperations) {
+                    if("next".equals(operatorType)){
+                        if(processOperation.getNextprocessid() != null){
+                            queryProcessids.addAll(Arrays.asList(processOperation.getNextprocessid().split(",")));
+                        }
+                    }else{
+                        if(processOperation.getPreviousprocessid() != null){
+                            queryProcessids.addAll(Arrays.asList(processOperation.getPreviousprocessid().split(",")));
+                        }
+                    }
+                }
+                if(queryProcessids != null && queryProcessids.size()>0){
+                    String joinids = "'" + CollUtil.join(queryProcessids, "','") + "'";
+                    retGantvos = apsProcessOperationProcessEquDao.getGanttDataList(
+                            null,null,null,null,null,joinids);
+                }
+            }
+
+        }else{
+            if("next".equals(operatorType)){
+                throw new CustomException("没有下一工序");
+            }else{
+                throw new CustomException("没有上一工序");
+            }
+        }
+        return retGantvos;
+    }
 }

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

@@ -208,6 +208,7 @@
                     #{orderNo}
                 </foreach>
             </if>
+            <if test="processids != null ">and a1.PROCESSID in (${processids})</if>
         </where>
         order by a1.PLANSTARTDATE asc,a1.PLANENDDATE asc
     </select>

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

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

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

@@ -3,6 +3,8 @@ package com.rongwei.bsentity.domain;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 /**
@@ -10,6 +12,7 @@ import lombok.Data;
  * @author 
  */
 @Data
+@TableName("aps_process_output_product")
 public class ApsProcessOutputProductDo implements Serializable {
     /**
      * 主键ID

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

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

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

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

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

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

+ 24 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/GanttController.java

@@ -1,6 +1,7 @@
 package com.rongwei.bsserver.controller;
 
 import com.rongwei.bscommon.sys.service.impl.GanttServiceImpl;
+import com.rongwei.bsentity.vo.GanttVos;
 import com.rongwei.bsentity.vo.ProcessGanttListVo;
 import com.rongwei.rwcommon.base.R;
 import org.slf4j.Logger;
@@ -10,6 +11,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * GanttController class
@@ -48,4 +50,26 @@ public class GanttController {
                 processGanttListVo.getWorkshopId(),processGanttListVo.getOrderNo());
     }
 
+    /**
+     * 获取下个作业(可能有多个)
+     * @param ganttVosList
+     * @return
+     */
+    @PostMapping("/getNextProcess")
+    public R getNextProcess(@RequestBody List<GanttVos> ganttVosList){
+        List<GanttVos> nexts = ganttService.getNextProcess(ganttVosList, "next");
+        return R.ok(nexts);
+    }
+
+    /**
+     * 获取上个作业(可能有多个)
+     * @param ganttVosList
+     * @return
+     */
+    @PostMapping("/getPreProcess")
+    public R getPreProcess(@RequestBody List<GanttVos> ganttVosList){
+        List<GanttVos> pres = ganttService.getNextProcess(ganttVosList, "pre");
+        return R.ok(pres);
+    }
+
 }