浏览代码

feature 代码提交

xiahan 1 年之前
父节点
当前提交
1af1adf406

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

@@ -2,11 +2,14 @@ package com.rongwei.bscommon.sys.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.ApsProcessOperationDo;
+import com.rongwei.bsentity.vo.ApsProcessOperationAndMaterialVo;
 import com.rongwei.bsentity.vo.ProcessIdRelationVo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -30,5 +33,17 @@ public interface ApsProcessOperationDao extends BaseMapper<ApsProcessOperationDo
     @Update("UPDATE aps_process_operation_out_mater set DELETED='1' where BLANKID=#{blanckid}")
     void updateProcessOperationOutMeter(@Param("blanckid") String blanckid);
 
+    @Update("UPDATE aps_process_operation_equ set DELETED='1' where BLANKID=#{blanckid}")
+    void updateProcessOperationOEqu(@Param("blanckid") String blanckid);
+
+    @Update("UPDATE sys_mind_mapping set DELETED='1' where BSID=#{blanckid}")
+    void updateSysMindMapping(@Param("blanckid") String blanckid);
+
+    @Select("select MAINID,GROUP_CONCAT(EQUIPMENTID) as EQUIDS from aps_resources_equipment where DELETED='0' group by MAINID")
+    List<Map<String, Object>> getEquGroupIds();
+
+    @Select("select apo.*,apoom.ID AS 'outputMaterialId',apoom.OUTPUTMATERIAL AS 'outputMaterial',apoom.PLANROLLNUM AS 'planRollNum',apoom.PLANSTOCKROLLNUM AS 'planStockRollNum',apoom.PLANPRODROLLNUM AS 'planProdRollNum' from aps_process_operation apo LEFT JOIN aps_process_operation_out_mater apoom ON apoom.MAINID = apo.ID AND apoom.DELETED = 0 where apo.DELETED = 0 AND apo.BLANKID = #{blankId}")
+    List<ApsProcessOperationAndMaterialVo> selectOperationAndMaterialByBlankId(@Param("blankId") String blankId);
+
     List<ProcessIdRelationVo> getAllNextProcessOperationById(@Param("ids") List<String> ids);
 }

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

@@ -26,4 +26,7 @@ public interface ApsProcessOperationService extends IService<ApsProcessOperation
     清除工艺路线
      */
     void clearCraftRoute(Map<String, Object> params);
+
+
+    R checkOperation(Map<String, Object> params);
 }

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

@@ -1,24 +1,26 @@
 package com.rongwei.bscommon.sys.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationDao;
 import com.rongwei.bscommon.sys.service.*;
-import com.rongwei.bsentity.domain.ApsCraftRouteOutMaterRequestDo;
-import com.rongwei.bsentity.domain.ApsCraftRouteStepDo;
-import com.rongwei.bsentity.domain.ApsProcessOperationDo;
-import com.rongwei.bsentity.domain.ApsProcessOperationOutMaterDo;
+import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.PreviousProcessVo;
 import com.rongwei.bsentity.vo.ProcessIdRelationVo;
+import com.rongwei.commonservice.service.SysMindMappingService;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
+import com.rongwei.rwcommonentity.commonservers.domain.SysMindMappingDo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -50,12 +52,19 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
 
     @Autowired
     ApsProcessOperationOutMaterService apsProcessOperationOutMaterService;
+    @Autowired
+    ApsProcessOperationEquService apsProcessOperationEquService;
+
+    @Autowired
+    SysMindMappingService sysMindMappingService;
 
     private final static Map<String, String> UNIT_MAP = new HashMap<String, String>() {{
         put("kg", "公斤");
         put("ton", "吨");
     }};
 
+    DecimalFormat df = new DecimalFormat("0.####");
+
 
     /**
      * 更新工序的待加工批次号信息
@@ -111,11 +120,28 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             map.put("CRAFTROUTEID", craftrouteid);
             List<ApsCraftRouteStepDo> apsCraftRouteStepDoList = apsCraftRouteStepService.listByMap(map).stream().collect(Collectors.toList());
             Collections.sort(apsCraftRouteStepDoList, Comparator.comparingInt(ApsCraftRouteStepDo::getLevel));
+            Collections.sort(apsCraftRouteStepDoList, Comparator.comparing(ApsCraftRouteStepDo::getCreatedate));
+
+            //工艺路线对应的思维导图
+            List<SysMindMappingDo> sysMindMappingDos = new ArrayList<>();
+            Map<String, Object> mindMap = new HashMap<>();
+            mindMap.put("BSID", craftrouteid);
+            List<SysMindMappingDo> sysMindMappingDoList = sysMindMappingService.listByMap(mindMap).stream().collect(Collectors.toList());
+            Collections.sort(sysMindMappingDoList, Comparator.comparing(SysMindMappingDo::getTreecode, Comparator.nullsFirst(Comparator.naturalOrder())));
+            Collections.sort(sysMindMappingDoList, Comparator.comparing(SysMindMappingDo::getCreatedate));
+            SysMindMappingDo sysMindMappingDo = BeanUtil.toBean(sysMindMappingDoList.get(0), SysMindMappingDo.class);
+            String mindStrId = SecurityUtil.getUUID();
+            sysMindMappingDo.setId(mindStrId);
+            sysMindMappingDo.setBsid(blanckdata.getStr("ID"));
+            sysMindMappingDo.setBstable("aps_process_operation");
+            sysMindMappingDos.add(sysMindMappingDo);
+
 
             List<String> overRouteStepIds = new ArrayList<>();
             List<PreviousProcessVo> newProcessIds = new ArrayList<>();//前道工序信息
             List<ApsProcessOperationDo> apsProcessOperationDoList = new ArrayList<>();
             List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterDoList = new ArrayList<>();
+            List<ApsProcessOperationEquDo> apsProcessOperationEquDoList = new ArrayList<>();
             for (ApsCraftRouteStepDo apsCraftRouteStepDo : apsCraftRouteStepDoList) {
                 if (overRouteStepIds.contains(apsCraftRouteStepDo.getId())) {
                     continue;
@@ -136,10 +162,21 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             //前道工序输出
                             List<PreviousProcessVo> processVo = newProcessIds.stream().filter(pro -> pro.getPreviousstepid().equals(apsCraftRouteStepDo1.getPreviousstepid())).collect(Collectors.toList());
                             ApsProcessOperationOutMaterDo outMaterDo = processVo.get(0).getApsProcessOperationOutMaterDo();
+
+                            //更新前道工序的后道工序
+                            ApsProcessOperationDo aDo = apsProcessOperationDoList.stream().filter(qtr -> processVo.get(0).getProcessId().equals(qtr.getId())).findAny().orElse(null);
+                            if (StringUtils.isBlank(aDo.getNextprocessid())) {
+                                aDo.setNextprocessid(processId);
+                                aDo.setNextprocess(apsProcessOperationDo.getProcessname());
+                            } else {
+                                aDo.setNextprocessid(aDo.getNextprocessid() + "," + processId);
+                                aDo.setNextprocess(aDo.getNextprocess() + "," + apsProcessOperationDo.getProcessname());
+                            }
+
                             apsProcessOperationDo.setPreviousprocessid(processVo.get(0).getProcessId());
                             apsProcessOperationDo.setPreviousprocess(processVo.get(0).getProcessName());
                             apsProcessOperationDo.setPlaninputid(outMaterDo.getId());
-                            String meterInput = getMeterInfo(outMaterDo.getProducttype(), outMaterDo.getMetal(), outMaterDo.getMetalstate(), outMaterDo.getThickness(), outMaterDo.getProwidth(), outMaterDo.getProlength());
+                            String meterInput = getInMeterInfo(outMaterDo.getProducttype(), outMaterDo.getMetal(), outMaterDo.getMetalstate(), outMaterDo.getThickness(), outMaterDo.getProwidth(), outMaterDo.getProlength());
 //                            apsProcessOperationDo.setPlaninput(meterInput + outMaterDo.getSinglerollweight() + cxAdminFeginClient.getDictNameByValue("MATERIAL_UNIT", outMaterDo.getNumunit()));
                             apsProcessOperationDo.setPlaninput(meterInput + outMaterDo.getSinglerollweight() + UNIT_MAP.getOrDefault(outMaterDo.getNumunit(), ""));
                             apsProcessOperationDo.setProducttypeid(outMaterDo.getProducttypeid());
@@ -151,8 +188,9 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             apsProcessOperationDo.setProlength(outMaterDo.getProlength());
                             apsProcessOperationDo.setSinglerollweight(outMaterDo.getSinglerollweight());
                             apsProcessOperationDo.setPlaninrall(outMaterDo.getPlanrollnum() - outMaterDo.getPlanstockrollnum() - outMaterDo.getPlanprodrollnum());
-                            apsProcessOperationDo.setPlanprocessrall(outMaterDo.getPlanrollnum() - outMaterDo.getPlanstockrollnum() - outMaterDo.getPlanprodrollnum());
+//                            apsProcessOperationDo.setPlanprocessrall(outMaterDo.getPlanrollnum() - outMaterDo.getPlanstockrollnum() - outMaterDo.getPlanprodrollnum());
                             apsProcessOperationDo.setBlankid(blanckdata.getStr("ID"));
+                            apsProcessOperationDo.setCraftstepid(apsCraftRouteStepDo1.getId());
                             if (outMaterDo.getThickrule().equals("自定义") || outMaterDo.getWidthrule().equals("自定义") || outMaterDo.getLengthrule().equals("自定义")) {
                                 apsProcessOperationDo.setChangeinmeter("1");//输入物料是否可编辑
                             }
@@ -167,32 +205,93 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo = BeanUtil.toBean(apsCraftRouteOutMaterRequestDo.get(0), ApsProcessOperationOutMaterDo.class);
                             apsProcessOperationOutMaterDo.setId(SecurityUtil.getUUID());
                             if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getProducttypeid())) {
-                                apsProcessOperationOutMaterDo.setProducttypeid(blanckdata.getStr("PRODUCTTYPEID"));
+                                apsProcessOperationOutMaterDo.setProducttypeid(outMaterDo.getProducttypeid());
                             }
-                            if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getProducttype())) {
-                                apsProcessOperationOutMaterDo.setProducttype(blanckdata.getStr("PRODUCTTYPE"));
+                            String outProducttype = apsProcessOperationOutMaterDo.getProducttype();
+                            if (StringUtils.isBlank(outProducttype)) {
+                                outProducttype = outMaterDo.getProducttype();
+                                apsProcessOperationOutMaterDo.setProducttype(outMaterDo.getProducttype());
                             }
-                            if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getMetal())) {
-                                apsProcessOperationOutMaterDo.setMetal(blanckdata.getStr("ALLOY"));
+                            String outMeter = apsProcessOperationOutMaterDo.getMetal();
+                            if (StringUtils.isBlank(outMeter)) {
+                                outMeter = outMaterDo.getMetal();
+                                apsProcessOperationOutMaterDo.setMetal(outMaterDo.getMetal());
                             }
-                            if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getMetalstate())) {
-                                apsProcessOperationOutMaterDo.setMetalstate(blanckdata.getStr("ALLOYSTATUS"));
+                            String outMetalstate = apsProcessOperationOutMaterDo.getMetalstate();
+                            if (StringUtils.isBlank(outMetalstate)) {
+                                outMetalstate = outMaterDo.getMetalstate();
+                                apsProcessOperationOutMaterDo.setMetalstate(outMaterDo.getMetalstate());
                             }
-                            apsProcessOperationOutMaterDo.setThickness(changeSize(outMaterDo.getThickness(), apsProcessOperationOutMaterDo.getThickrule(), apsProcessOperationOutMaterDo.getThickchange()));
-                            apsProcessOperationOutMaterDo.setProwidth(changeSize(outMaterDo.getProwidth(), apsProcessOperationOutMaterDo.getWidthrule(), apsProcessOperationOutMaterDo.getWidthchange()));
-                            apsProcessOperationOutMaterDo.setProlength(changeSize(outMaterDo.getProlength(), apsProcessOperationOutMaterDo.getLengthrule(), apsProcessOperationOutMaterDo.getLengthchange()));
+                            BigDecimal tval = changeSize(outMaterDo.getThickness(), apsProcessOperationOutMaterDo.getThickrule(), apsProcessOperationOutMaterDo.getThickchange());
+                            apsProcessOperationOutMaterDo.setThickness(tval);
+                            BigDecimal wval = changeSize(outMaterDo.getProwidth(), apsProcessOperationOutMaterDo.getWidthrule(), apsProcessOperationOutMaterDo.getWidthchange());
+                            apsProcessOperationOutMaterDo.setProwidth(wval);
+                            BigDecimal lval = changeSize(outMaterDo.getProlength(), apsProcessOperationOutMaterDo.getLengthrule(), apsProcessOperationOutMaterDo.getLengthchange());
+                            apsProcessOperationOutMaterDo.setProlength(lval);
                             apsProcessOperationOutMaterDo.setRipcutnum(1);
                             apsProcessOperationOutMaterDo.setCrosscutnum(1);
                             apsProcessOperationOutMaterDo.setOutval(1);
                             apsProcessOperationOutMaterDo.setPlanrollnum(blanckdata.getInt("ROLLNUM"));
-                            apsProcessOperationOutMaterDo.setSinglerollweight(blanckdata.getBigDecimal("SINGLEROLLWEIGHT"));
+                            //输入物料的输入单卷重*该输出物料的宽度/输入物料的宽度/该输出物料的单卷输出数量
+                            String singlerollweight = df.format(outMaterDo.getSinglerollweight().multiply(wval == null ? BigDecimal.valueOf(1) : wval).divide(outMaterDo.getProwidth() == null ? BigDecimal.valueOf(1) : outMaterDo.getProwidth(), 2, BigDecimal.ROUND_HALF_UP));
+                            apsProcessOperationOutMaterDo.setSinglerollweight(new BigDecimal(singlerollweight));
                             apsProcessOperationOutMaterDo.setNumunit(blanckdata.getStr("NUMBERUNIT"));
                             apsProcessOperationOutMaterDo.setPlanstockrollnum(0);
                             apsProcessOperationOutMaterDo.setPlanprodrollnum(0);
                             apsProcessOperationOutMaterDo.setMainid(processId);
                             apsProcessOperationOutMaterDo.setBlankid(blanckdata.getStr("ID"));
+                            //输出物料
+                            String outputMeter = getOutMeterInfo(outProducttype, outMeter, outMetalstate, tval, wval, lval, apsProcessOperationOutMaterDo.getThickoffset(), apsProcessOperationOutMaterDo.getWidthoffset(), apsProcessOperationOutMaterDo.getLengthoffset()) + singlerollweight + UNIT_MAP.getOrDefault(blanckdata.getStr("NUMBERUNIT"), "") + "*" + blanckdata.getInt("ROLLNUM") + "卷";
+                            apsProcessOperationOutMaterDo.setOutputmaterial(outputMeter);
+                            apsProcessOperationDo.setPlanoutput("[1]" + outputMeter);
+                            //输出成品 没有后道工序作业,则自动填入=“{输出物料的输入物料描述} * {计划成品卷数}卷”
+                            String outputfinishproduct = "";
+                            if (StringUtils.isBlank(apsCraftRouteStepDo1.getNextstepid())) {
+                                outputfinishproduct = getInMeterInfo(outProducttype, outMeter, outMetalstate, tval, wval, lval) + "*" + blanckdata.getInt("ROLLNUM") + "卷";
+                            }
+                            apsProcessOperationOutMaterDo.setOutputfinishproduct(outputfinishproduct);
                             previousProcessVo.setApsProcessOperationOutMaterDo(apsProcessOperationOutMaterDo);
 
+
+                            //本道工序的可选设备
+                            List<ApsCraftRouteStepEquDo> apsCraftRouteStepEquDos = apsCraftRouteStepEquService.listByMap(map).stream().collect(Collectors.toList());
+                            List<String> equIdList = new ArrayList<>();//设备
+                            List<String> equGroupIdList = new ArrayList<>();//资源组
+                            for (ApsCraftRouteStepEquDo apsCraftRouteStepEquDo : apsCraftRouteStepEquDos) {
+                                ApsProcessOperationEquDo apsProcessOperationEquDo;
+                                apsProcessOperationEquDo = BeanUtil.toBean(apsCraftRouteStepEquDo, ApsProcessOperationEquDo.class);
+                                apsProcessOperationEquDo.setId(SecurityUtil.getUUID());
+                                apsProcessOperationEquDo.setBlankid(blanckdata.getStr("ID"));
+                                apsProcessOperationEquDo.setMainid(processId);
+                                if (apsProcessOperationEquDo.getResourcetype().equals("资源组")) {
+                                    if (!equGroupIdList.contains(apsProcessOperationEquDo.getResourceid())) {
+                                        equGroupIdList.add(apsProcessOperationEquDo.getResourceid());
+                                    }
+                                } else {
+                                    if (!equIdList.contains(apsProcessOperationEquDo.getResourceid())) {
+                                        equIdList.add(apsProcessOperationEquDo.getResourceid());
+                                    }
+                                }
+
+                                apsProcessOperationEquDoList.add(apsProcessOperationEquDo);
+                            }
+                            //可选设备IDS
+                            if (equIdList.size() > 0 || equGroupIdList.size() > 0) {
+                                apsProcessOperationDo.setCanchoosedeviceid(getChooseequids(equIdList, equGroupIdList));
+                            }
+
+                            //本道工序思维导图
+                            List<SysMindMappingDo> sysMindMappingDoList1 = sysMindMappingDoList.stream().filter(mind -> mind.getId().equals(apsCraftRouteStepDo1.getId())).collect(Collectors.toList());
+                            SysMindMappingDo sysMindMappingDo1 = BeanUtil.toBean(sysMindMappingDoList1.get(0), SysMindMappingDo.class);
+                            sysMindMappingDo1.setId(processId);
+                            sysMindMappingDo1.setParentid(processVo.get(0).getProcessId());
+                            sysMindMappingDo1.setBsid(blanckdata.getStr("ID"));
+                            sysMindMappingDo1.setBstable("aps_process_operation");
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.putOpt("craftStepId", apsCraftRouteStepDo1.getId());
+                            sysMindMappingDo1.setRoption(jsonObject.toString());//存工艺路线的工艺步骤ID
+                            sysMindMappingDos.add(sysMindMappingDo1);
+
                             newProcessIds.add(previousProcessVo);
                             apsProcessOperationDoList.add(apsProcessOperationDo);
                             apsProcessOperationOutMaterDoList.add(apsProcessOperationOutMaterDo);
@@ -203,7 +302,7 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                         previousProcessVo = new PreviousProcessVo();
                         //首道工序
                         processId = SecurityUtil.getUUID();
-                        String meterInput = getMeterInfo(blanckdata.getStr("PRODUCTTYPE"), blanckdata.getStr("ALLOY"), blanckdata.getStr("ALLOYSTATUS"), blanckdata.getBigDecimal("THICKNESS"), blanckdata.getBigDecimal("PROWIDTH"), blanckdata.getBigDecimal("PROLENGTH"));
+                        String meterInput = getInMeterInfo(blanckdata.getStr("PRODUCTTYPE"), blanckdata.getStr("ALLOY"), blanckdata.getStr("ALLOYSTATUS"), blanckdata.getBigDecimal("THICKNESS"), blanckdata.getBigDecimal("PROWIDTH"), blanckdata.getBigDecimal("PROLENGTH"));
                         apsProcessOperationDo = BeanUtil.toBean(apsCraftRouteStepDo, ApsProcessOperationDo.class);
                         apsProcessOperationDo.setId(processId);
                         apsProcessOperationDo.setPlaninput(meterInput + blanckdata.getStr("SINGLEROLLWEIGHT") + UNIT_MAP.getOrDefault(blanckdata.getStr("NUMBERUNIT"), ""));
@@ -218,11 +317,13 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                         apsProcessOperationDo.setPlaninrall(blanckdata.getInt("ROLLNUM"));
                         apsProcessOperationDo.setPlanprocessrall(blanckdata.getInt("ROLLNUM"));
                         apsProcessOperationDo.setBlankid(blanckdata.getStr("ID"));
+                        apsProcessOperationDo.setCraftstepid(apsCraftRouteStepDo.getId());
 
                         //本道工序信息
                         previousProcessVo.setProcessId(processId);
                         previousProcessVo.setProcessName(apsProcessOperationDo.getProcessname());
                         previousProcessVo.setPreviousstepid(apsCraftRouteStepDo.getId());
+
                         //本道工序的输出
                         map.put("CRAFTSTEPID", apsCraftRouteStepDo.getId());
                         List<ApsCraftRouteOutMaterRequestDo> apsCraftRouteOutMaterRequestDo = apsCraftRouteOutMaterRequestService.listByMap(map).stream().collect(Collectors.toList());
@@ -231,30 +332,91 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                         if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getProducttypeid())) {
                             apsProcessOperationOutMaterDo.setProducttypeid(blanckdata.getStr("PRODUCTTYPEID"));
                         }
-                        if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getProducttype())) {
+                        String outProducttype = apsProcessOperationOutMaterDo.getProducttype();
+                        if (StringUtils.isBlank(outProducttype)) {
+                            outProducttype = blanckdata.getStr("PRODUCTTYPE");
                             apsProcessOperationOutMaterDo.setProducttype(blanckdata.getStr("PRODUCTTYPE"));
                         }
-                        if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getMetal())) {
+                        String outMeter = apsProcessOperationOutMaterDo.getMetal();
+                        if (StringUtils.isBlank(outMeter)) {
+                            outMeter = blanckdata.getStr("ALLOY");
                             apsProcessOperationOutMaterDo.setMetal(blanckdata.getStr("ALLOY"));
                         }
-                        if (StringUtils.isBlank(apsProcessOperationOutMaterDo.getMetalstate())) {
+                        String outMetalstate = apsProcessOperationOutMaterDo.getMetalstate();
+                        if (StringUtils.isBlank(outMetalstate)) {
+                            outMetalstate = blanckdata.getStr("ALLOYSTATUS");
                             apsProcessOperationOutMaterDo.setMetalstate(blanckdata.getStr("ALLOYSTATUS"));
                         }
-                        apsProcessOperationOutMaterDo.setThickness(changeSize(blanckdata.getBigDecimal("THICKNESS"), apsProcessOperationOutMaterDo.getThickrule(), apsProcessOperationOutMaterDo.getThickchange()));
-                        apsProcessOperationOutMaterDo.setProwidth(changeSize(blanckdata.getBigDecimal("PROWIDTH"), apsProcessOperationOutMaterDo.getWidthrule(), apsProcessOperationOutMaterDo.getWidthchange()));
-                        apsProcessOperationOutMaterDo.setProlength(changeSize(blanckdata.getBigDecimal("PROLENGTH"), apsProcessOperationOutMaterDo.getLengthrule(), apsProcessOperationOutMaterDo.getLengthchange()));
+                        BigDecimal tval = changeSize(blanckdata.getBigDecimal("THICKNESS"), apsProcessOperationOutMaterDo.getThickrule(), apsProcessOperationOutMaterDo.getThickchange());
+                        apsProcessOperationOutMaterDo.setThickness(tval);
+                        BigDecimal wval = changeSize(blanckdata.getBigDecimal("PROWIDTH"), apsProcessOperationOutMaterDo.getWidthrule(), apsProcessOperationOutMaterDo.getWidthchange());
+                        apsProcessOperationOutMaterDo.setProwidth(wval);
+                        BigDecimal lval = changeSize(blanckdata.getBigDecimal("PROLENGTH"), apsProcessOperationOutMaterDo.getLengthrule(), apsProcessOperationOutMaterDo.getLengthchange());
+                        apsProcessOperationOutMaterDo.setProlength(lval);
                         apsProcessOperationOutMaterDo.setRipcutnum(1);
                         apsProcessOperationOutMaterDo.setCrosscutnum(1);
                         apsProcessOperationOutMaterDo.setOutval(1);
                         apsProcessOperationOutMaterDo.setPlanrollnum(blanckdata.getInt("ROLLNUM"));
-                        apsProcessOperationOutMaterDo.setSinglerollweight(blanckdata.getBigDecimal("SINGLEROLLWEIGHT"));
+                        //输入物料的输入单卷重*该输出物料的宽度/输入物料的宽度/该输出物料的单卷输出数量
+                        String singlerollweight = df.format(blanckdata.getBigDecimal("SINGLEROLLWEIGHT").multiply(wval == null ? BigDecimal.valueOf(1) : wval).divide(blanckdata.getBigDecimal("PROWIDTH") == null ? BigDecimal.valueOf(1) : blanckdata.getBigDecimal("PROWIDTH"), 2, BigDecimal.ROUND_HALF_UP));
+                        apsProcessOperationOutMaterDo.setSinglerollweight(new BigDecimal(singlerollweight));
                         apsProcessOperationOutMaterDo.setNumunit(blanckdata.getStr("NUMBERUNIT"));
                         apsProcessOperationOutMaterDo.setPlanstockrollnum(0);
                         apsProcessOperationOutMaterDo.setPlanprodrollnum(0);
                         apsProcessOperationOutMaterDo.setMainid(processId);
                         apsProcessOperationOutMaterDo.setBlankid(blanckdata.getStr("ID"));
+                        //输出物料
+                        String outputMeter = getOutMeterInfo(outProducttype, outMeter, outMetalstate, tval, wval, lval, apsProcessOperationOutMaterDo.getThickoffset(), apsProcessOperationOutMaterDo.getWidthoffset(), apsProcessOperationOutMaterDo.getLengthoffset()) + singlerollweight + UNIT_MAP.getOrDefault(blanckdata.getStr("NUMBERUNIT"), "") + "*" + blanckdata.getInt("ROLLNUM") + "卷";
+                        apsProcessOperationOutMaterDo.setOutputmaterial(outputMeter);
+                        apsProcessOperationDo.setPlanoutput("[1]" + outputMeter);
+                        //输出成品 没有后道工序作业,则自动填入=“{输出物料的输入物料描述} * {计划成品卷数}卷”
+                        String outputfinishproduct = "";
+                        if (StringUtils.isBlank(apsCraftRouteStepDo.getNextstepid())) {
+                            outputfinishproduct = getInMeterInfo(outProducttype, outMeter, outMetalstate, tval, wval, lval) + "*" + blanckdata.getInt("ROLLNUM") + "卷";
+                        }
+                        apsProcessOperationOutMaterDo.setOutputfinishproduct(outputfinishproduct);
+
                         previousProcessVo.setApsProcessOperationOutMaterDo(apsProcessOperationOutMaterDo);
 
+                        //本道工序的可选设备
+                        List<ApsCraftRouteStepEquDo> apsCraftRouteStepEquDos = apsCraftRouteStepEquService.listByMap(map).stream().collect(Collectors.toList());
+                        List<String> equIdList = new ArrayList<>();//设备
+                        List<String> equGroupIdList = new ArrayList<>();//资源组
+                        for (ApsCraftRouteStepEquDo apsCraftRouteStepEquDo : apsCraftRouteStepEquDos) {
+                            ApsProcessOperationEquDo apsProcessOperationEquDo;
+                            apsProcessOperationEquDo = BeanUtil.toBean(apsCraftRouteStepEquDo, ApsProcessOperationEquDo.class);
+                            apsProcessOperationEquDo.setId(SecurityUtil.getUUID());
+                            apsProcessOperationEquDo.setBlankid(blanckdata.getStr("ID"));
+                            apsProcessOperationEquDo.setMainid(processId);
+                            if (apsProcessOperationEquDo.getResourcetype().equals("资源组")) {
+                                if (!equGroupIdList.contains(apsProcessOperationEquDo.getResourceid())) {
+                                    equGroupIdList.add(apsProcessOperationEquDo.getResourceid());
+                                }
+                            } else {
+                                if (!equIdList.contains(apsProcessOperationEquDo.getResourceid())) {
+                                    equIdList.add(apsProcessOperationEquDo.getResourceid());
+                                }
+                            }
+
+                            apsProcessOperationEquDoList.add(apsProcessOperationEquDo);
+                        }
+                        //可选设备IDS
+                        if (equIdList.size() > 0 || equGroupIdList.size() > 0) {
+                            apsProcessOperationDo.setCanchoosedeviceid(getChooseequids(equIdList, equGroupIdList));
+                        }
+
+                        //本道工序思维导图
+                        List<SysMindMappingDo> sysMindMappingDoList1 = sysMindMappingDoList.stream().filter(mind -> mind.getId().equals(apsCraftRouteStepDo.getId())).collect(Collectors.toList());
+                        SysMindMappingDo sysMindMappingDo1 = BeanUtil.toBean(sysMindMappingDoList1.get(0), SysMindMappingDo.class);
+                        sysMindMappingDo1.setId(processId);
+                        sysMindMappingDo1.setParentid(mindStrId);
+                        sysMindMappingDo1.setBsid(blanckdata.getStr("ID"));
+                        sysMindMappingDo1.setBstable("aps_process_operation");
+                        JSONObject jsonObject = new JSONObject();
+                        jsonObject.putOpt("craftStepId", apsCraftRouteStepDo.getId());
+                        sysMindMappingDo1.setRoption(jsonObject.toString());//存工艺路线的工艺步骤ID
+                        sysMindMappingDos.add(sysMindMappingDo1);
+
                         newProcessIds.add(previousProcessVo);
                         apsProcessOperationDoList.add(apsProcessOperationDo);
                         apsProcessOperationOutMaterDoList.add(apsProcessOperationOutMaterDo);
@@ -262,10 +424,17 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                 }
             }
 
+//            return R.ok();
+
             boolean bool1 = apsProcessOperationService.saveOrUpdateBatch(apsProcessOperationDoList);
             boolean bool2 = apsProcessOperationOutMaterService.saveOrUpdateBatch(apsProcessOperationOutMaterDoList);
+            boolean bool3 = true;
+            if (apsProcessOperationEquDoList.size() > 0) {
+                bool3 = apsProcessOperationEquService.saveOrUpdateBatch(apsProcessOperationEquDoList);
+            }
+            boolean bool4 = sysMindMappingService.saveOrUpdateBatch(sysMindMappingDos);
 
-            if (bool1 && bool2) {
+            if (bool1 && bool2 && bool3 && bool4) {
 //                r.setCode("200");
 //                r.putData(apsCraftRouteStepDoList);
                 return R.ok();
@@ -289,10 +458,72 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
         apsProcessOperationDao.updateProcessOperation(blankid);
         //工序作业输出物料
         apsProcessOperationDao.updateProcessOperationOutMeter(blankid);
+        //工序作业可选设备
+        apsProcessOperationDao.updateProcessOperationOEqu(blankid);
+        //工序作业思维导图
+        apsProcessOperationDao.updateSysMindMapping(blankid);
     }
 
-    //工艺步骤管理/物料输出规则
-    private String getMeterInfo(String producttype, String metal, String metalstate, BigDecimal thickness, BigDecimal prowidth, BigDecimal prolength) {
+    @Override
+    public R checkOperation(Map<String, Object> params) {
+        String blankId;
+        try {
+            blankId = params.get("BLANKID").toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error("请输入正确的坯料计划ID");
+        }
+        //查询坯料计划对应的工序作业
+        List<ApsProcessOperationDo> apsProcessOperationList = this.baseMapper.selectList(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, blankId));
+        //查询坯料计划对应的输出物料
+        List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterList = apsProcessOperationOutMaterService.getBaseMapper().selectList(new QueryWrapper<ApsProcessOperationOutMaterDo>().lambda().eq(ApsProcessOperationOutMaterDo::getBlankid, blankId));
+
+        //如果有前道工序作业,并且该工序输入物料ID不是前道工序作业的输出物料ID,错误提示:{工序}{工序显示名}的输入物料不存在,请重新选择
+
+        //遍历工序作业
+        for (ApsProcessOperationDo apsProcessOperationDo : apsProcessOperationList) {
+            //如果有前道工序
+            if (ObjectUtil.isNotEmpty(apsProcessOperationDo.getPreviousprocessid())) {
+                //获取当前工序的输入物料ID
+                String planInputId = apsProcessOperationDo.getPlaninputid();
+
+                //获取前道工序的输出物料的ID list
+                List<String> previousProcessOutMaterialIdList = apsProcessOperationOutMaterList.stream().filter(item -> item.getMainid().equals(apsProcessOperationDo.getPreviousprocessid())).map(ApsProcessOperationOutMaterDo::getId).collect(Collectors.toList());
+                //该工序输入物料ID不是前道工序作业的输出物料ID
+                if (!previousProcessOutMaterialIdList.contains(planInputId)) {
+                    return R.error(apsProcessOperationDo.getProcess() + apsProcessOperationDo.getProcessname() + "的输入物料不存在,请重新选择");
+                }
+            }
+        }
+
+        //检查该工序作业所有输出物料,如果(计划输出卷数-计划备料卷数-计划成品卷数)不等于所有后道工序作业计划加工卷数合计;错误提示:{工序}{工序显示名}的{输出物料} 计划输出卷数-计划备料卷数-计划成品卷数必须等于所有后道工序作业计划加工卷数合计
+        //遍历输出物料
+        for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : apsProcessOperationOutMaterList) {
+            //查询使用此输出物料的工序作业
+            List<ApsProcessOperationDo> processList = apsProcessOperationList.stream().filter(item -> ObjectUtil.isNotEmpty(item.getPlaninputid()) && item.getPlaninputid().equals(apsProcessOperationOutMaterDo.getId())).collect(Collectors.toList());
+            if (processList.size() > 0) {
+                //遍历工序作业,计算 计划加工卷数合计
+                int planProcessRollAll = 0;
+                for (ApsProcessOperationDo apsProcessOperationDo : processList) {
+                    planProcessRollAll += apsProcessOperationDo.getPlanprocessrall();
+                }
+                //计算输出物料的 (计划输出卷数-计划备料卷数-计划成品卷数)值
+                int outputRollAll = apsProcessOperationOutMaterDo.getPlanrollnum() - apsProcessOperationOutMaterDo.getPlanstockrollnum() - apsProcessOperationOutMaterDo.getPlanprodrollnum();
+                if (planProcessRollAll != outputRollAll) {
+                    //根据输出物料查询其工序信息
+                    ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationList.stream().filter(item -> item.getId().equals(apsProcessOperationOutMaterDo.getMainid())).findFirst().get();
+                    return R.error(apsProcessOperationDo.getProcess() + apsProcessOperationDo.getProcessname() + "的" + apsProcessOperationOutMaterDo.getOutputmaterial() + " 计划输出卷数-计划备料卷数-计划成品卷数必须等于所有后道工序作业计划加工卷数合计");
+                }
+            }
+        }
+        return R.ok();
+
+    }
+
+    /*
+    工艺步骤管理/输入物料描述
+     */
+    private String getInMeterInfo(String producttype, String metal, String metalstate, BigDecimal thickness, BigDecimal prowidth, BigDecimal prolength) {
         String res = "";
         StringBuilder resStr = new StringBuilder();
         StringBuilder resSizeStr = new StringBuilder();
@@ -306,13 +537,13 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             resStr.append(producttype);
         }
         if (thickness != null) {
-            resSizeStr.append("厚" + thickness + "*");
+            resSizeStr.append("厚" + df.format(thickness) + "*");
         }
         if (prowidth != null) {
-            resSizeStr.append("宽" + prowidth + "*");
+            resSizeStr.append("宽" + df.format(prowidth) + "*");
         }
         if (prolength != null) {
-            resSizeStr.append("长" + prolength + "*");
+            resSizeStr.append("长" + df.format(prolength) + "*");
         }
 
         if (StringUtils.isBlank(resSizeStr.toString())) {
@@ -321,10 +552,47 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             res = (StringUtils.isBlank(resStr.toString()) ? "" : (resStr.toString() + " ")) + resSizeStr.toString().substring(0, resSizeStr.toString().length() - 1) + "mm";
         }
 
-        return res;
+        return res + " ";
     }
 
-    //长宽高的计算规则
+    /*
+    工艺步骤管理/输出物料描述
+     */
+    private String getOutMeterInfo(String producttype, String metal, String metalstate, BigDecimal thickness, BigDecimal prowidth, BigDecimal prolength, String thickoffset, String widthoffset, String lengthoffset) {
+        String res = "";
+        StringBuilder resStr = new StringBuilder();
+        StringBuilder resSizeStr = new StringBuilder();
+        if (StringUtils.isNotBlank(metal)) {
+            resStr.append(metal);
+        }
+        if (StringUtils.isNotBlank(metalstate)) {
+            resStr.append(metalstate);
+        }
+        if (StringUtils.isNotBlank(producttype)) {
+            resStr.append(producttype);
+        }
+        if (thickness != null) {
+            resSizeStr.append("厚" + df.format(thickness) + (thickoffset == null ? "" : thickoffset) + "*");
+        }
+        if (prowidth != null) {
+            resSizeStr.append("宽" + df.format(prowidth) + (widthoffset == null ? "" : widthoffset) + "*");
+        }
+        if (prolength != null) {
+            resSizeStr.append("长" + df.format(prolength) + (lengthoffset == null ? "" : lengthoffset) + "*");
+        }
+
+        if (StringUtils.isBlank(resSizeStr.toString())) {
+            res = resStr.toString();
+        } else {
+            res = (StringUtils.isBlank(resStr.toString()) ? "" : (resStr.toString() + " ")) + resSizeStr.toString().substring(0, resSizeStr.toString().length() - 1) + "mm";
+        }
+
+        return res + " ";
+    }
+
+    /*
+    长宽高的计算规则
+     */
     private BigDecimal changeSize(BigDecimal oldVal, String countRule, BigDecimal changeVal) {
         BigDecimal newVal = null;
         if (!countRule.equals("自定义") && oldVal != null) {
@@ -340,4 +608,26 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
         }
         return newVal;
     }
+
+    /*
+    获取可选设备IDS
+     */
+    private String getChooseequids(List<String> equIds, List<String> equGroupIds) {
+        //资源组下所有的设备IDS
+        if (equGroupIds.size() > 0) {
+            List<Map<String, Object>> equGroupIdList = apsProcessOperationDao.getEquGroupIds();
+            for (String groupid : equGroupIds) {
+                List<Map<String, Object>> equGroupIds1 = equGroupIdList.stream().filter(equgroup -> equgroup.get("MAINID").toString().equals(groupid)).collect(Collectors.toList());
+                if (equGroupIds1.size() > 0) {
+                    String equIdStr = equGroupIds1.get(0).get("EQUIDS").toString();
+                    for (String equid : Arrays.asList(equIdStr.split(","))) {
+                        if (!equIds.contains(equid)) {
+                            equIds.add(equid);
+                        }
+                    }
+                }
+            }
+        }
+        return String.join(",", equIds);
+    }
 }