opt: 套轴时无轴干扰

feat: 饵料下卷
This commit is contained in:
2025-04-26 13:38:34 +08:00
parent bbdb26cb43
commit 0e7e839d0e
10 changed files with 383 additions and 63 deletions

View File

@@ -134,4 +134,6 @@ public interface IBstIvtCutpointivtService extends IService<BstIvtCutpointivt> {
List<BstIvtCutpointivt> getPintByAgvCodesByPointTypeAndArea(String area, List<String> types);
List<BstIvtCutpointivt> getNBJCanUsePoint(String type, String pointStatus, String area, String sort);
List<BstIvtCutpointivt> getNBJAreaNotTaskPointByStatus(String type, String pointStatus, String area, String sort);
}

View File

@@ -27,4 +27,6 @@ public interface BstIvtCutpointivtMapper extends BaseMapper<BstIvtCutpointivt> {
List<BstIvtCutpointivt> getAreaNotTaskPointByStatusNotCheckPickUpCompleted(String type, String pointStatus, String area, String sort);
List<BstIvtCutpointivt> getNBJCanUsePoint(String type, String pointStatus, String area, String sort);
List<BstIvtCutpointivt> getNBJAreaNotTaskPointByStatus(String type, String pointStatus, String area, String sort);
}

View File

@@ -15,8 +15,8 @@
WHERE t.task_status <![CDATA[ <= ]]> '071' AND t.task_status <![CDATA[ <> ]]> '07'
AND t.is_delete = '0'
AND (t.point_code1 = bic.point_code OR t.point_code2 = bic.point_code
OR t.point_code1 = bic.truss_point_code1 oR t.point_code2 = bic.truss_point_code1
OR t.point_code1 = bic.truss_point_code2 oR t.point_code2 = bic.truss_point_code2)
OR t.point_code1 = bic.truss_point_code1 OR t.point_code2 = bic.truss_point_code1
OR t.point_code1 = bic.truss_point_code2 OR t.point_code2 = bic.truss_point_code2)
)
<if test="sort == '1'">
ORDER BY bic.sort_seq ASC
@@ -165,4 +165,27 @@
ORDER BY bic.sort_seq DESC
</if>
</select>
<select id="getNBJAreaNotTaskPointByStatus"
resultType="org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt">
SELECT bic.*
FROM bst_ivt_cutpointivt bic
WHERE bic.point_type = #{type}
AND bic.is_used = '1'
AND bic.point_status = #{pointStatus}
AND bic.point_location = #{area}
AND 0 = (SELECT COUNT(*)
FROM sch_base_task t
WHERE t.task_status <![CDATA[ <= ]]> '071' AND t.task_status <![CDATA[ <> ]]> '07'
AND t.is_delete = '0'
AND (t.point_code2 = bic.point_code
OR t.point_code1 = bic.truss_point_code1 OR t.point_code2 = bic.truss_point_code1
OR t.point_code1 = bic.truss_point_code2 OR t.point_code2 = bic.truss_point_code2)
)
<if test="sort == '1'">
ORDER BY bic.sort_seq ASC
</if>
<if test="sort == '2'">
ORDER BY bic.sort_seq DESC
</if>
</select>
</mapper>

View File

@@ -158,4 +158,9 @@ public class BstIvtCutpointivtServiceImpl extends ServiceImpl<BstIvtCutpointivtM
public List<BstIvtCutpointivt> getNBJCanUsePoint(String type, String pointStatus, String area, String sort) {
return bstIvtCutpointivtMapper.getNBJCanUsePoint(type, pointStatus, area, sort);
}
@Override
public List<BstIvtCutpointivt> getNBJAreaNotTaskPointByStatus(String type, String pointStatus, String area, String sort) {
return bstIvtCutpointivtMapper.getNBJAreaNotTaskPointByStatus(type, pointStatus, area, sort);
}
}

View File

@@ -1,15 +1,14 @@
package org.nl.b_lms.bst.ivt.stockingivt.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt;
import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto;
import org.nl.common.domain.query.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt;
import java.util.List;
import java.util.Map;

View File

@@ -3,7 +3,6 @@ package org.nl.b_lms.bst.ivt.stockingivt.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -12,18 +11,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.bst.ivt.papervehicle.service.IMdPbPapervehicleService;
import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle;
import org.nl.b_lms.bst.ivt.stockingivt.service.IBstIvtStockingivtService;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.mapper.BstIvtStockingivtMapper;
import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo;
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto;
import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.SecurityUtils;
import org.nl.b_lms.bst.ivt.stockingivt.service.IBstIvtStockingivtService;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.mapper.BstIvtStockingivtMapper;
import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt;
import org.nl.modules.wql.WQL;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.wms.basedata.master.service.MaterialbaseService;
import org.nl.wms.basedata.master.service.dto.MaterialbaseDto;
import org.nl.wms.ext.acs.service.WmsToAcsService;
@@ -32,7 +30,10 @@ import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author lyd

View File

@@ -24,100 +24,100 @@ import org.springframework.web.bind.annotation.RestController;
public class SlitterPdaController {
@Autowired
private SlitterService slitterDevices;
private SlitterService slitterService;
@PostMapping("/slitterDevices")
@Log("获取分切设备")
@SaIgnore
public ResponseEntity<Object> slitterDevices(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.slitterDevices(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.slitterDevices(param), HttpStatus.OK);
}
@PostMapping("/downRolls")
@Log("下卷")
@SaIgnore
public ResponseEntity<Object> downRolls(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.downRolls(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.downRolls(param), HttpStatus.OK);
}
@PostMapping("/downRolls2")
@Log("下卷2")
@SaIgnore
public ResponseEntity<Object> downRolls2(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.downRolls2(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.downRolls2(param), HttpStatus.OK);
}
@PostMapping("/downRollsCheck")
@Log("下卷2提示确认")
@SaIgnore
public ResponseEntity<Object> downRollsCheck(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.downRollsCheck(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.downRollsCheck(param), HttpStatus.OK);
}
@PostMapping("/moveVehicle")
@Log("搬运废箔斗")
@SaIgnore
public ResponseEntity<Object> moveVehicle(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.moveVehicle(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.moveVehicle(param), HttpStatus.OK);
}
@PostMapping("/getShaftPoint")
@Log("获取套拔轴下拉框数据")
@SaIgnore
public ResponseEntity<Object> getShaftPoint() {
return new ResponseEntity<>(slitterDevices.getShaftPoint(), HttpStatus.OK);
return new ResponseEntity<>(slitterService.getShaftPoint(), HttpStatus.OK);
}
@PostMapping("/doInitShaftPoint")
@Log("初始化套拔轴点位")
@SaIgnore
public ResponseEntity<Object> doInitShaftPoint(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doInitShaftPoint(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doInitShaftPoint(param), HttpStatus.OK);
}
@PostMapping("/cutIn")
@Log("分切母卷上料")
@SaIgnore
public ResponseEntity<Object> cutIn(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.cutIn(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.cutIn(param), HttpStatus.OK);
}
@PostMapping("/sendSubVolumeToNBJ")
@Log("分切缓存到内包间任务")
@SaIgnore
public ResponseEntity<Object> sendSubVolumeToNBJ(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.pdaSendSubVolumeToNBJ(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.pdaSendSubVolumeToNBJ(param), HttpStatus.OK);
}
@PostMapping("/markingFoilSlittingToCache")
@Log("标箔分切下料AGV任务")
@SaIgnore
public ResponseEntity<Object> markingFoilSlittingToCache(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.markingFoilSlittingToCache(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.markingFoilSlittingToCache(param), HttpStatus.OK);
}
@PostMapping("/getCutCacheAgvPoints")
@Log("获取分切暂存位AGV点位下拉框数据")
@SaIgnore
public ResponseEntity<Object> getCutCacheAgvPoints(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.getCutCacheAgvPoints(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.getCutCacheAgvPoints(param), HttpStatus.OK);
}
@PostMapping("/toCleanCutCacheInventory")
@Log("清理分切缓存")
@SaIgnore
public ResponseEntity<Object> toCleanCutCacheInventory(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.toCleanCutCacheInventory(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.toCleanCutCacheInventory(param), HttpStatus.OK);
}
@PostMapping("/toSubvolumeBinding")
@Log("子卷绑定")
@SaIgnore
public ResponseEntity<Object> toSubvolumeBinding(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.toSubvolumeBinding(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.toSubvolumeBinding(param), HttpStatus.OK);
}
@PostMapping("/shaftMaintenanceInventory")
@Log("气胀轴库维护库存")
@SaIgnore
public ResponseEntity<Object> shaftMaintenanceInventory(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.shaftMaintenanceInventory(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.shaftMaintenanceInventory(param), HttpStatus.OK);
}
@@ -125,116 +125,123 @@ public class SlitterPdaController {
@Log("气胀轴绑定")
@SaIgnore
public ResponseEntity<Object> toShaftBinding(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.toShaftBinding(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.toShaftBinding(param), HttpStatus.OK);
}
@PostMapping("/querySlitterSubVolumeInfo")
@Log("查询分切机上的子卷信息")
@SaIgnore
public ResponseEntity<Object> querySlitterSubVolumeInfo(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.querySlitterSubVolumeInfo(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.querySlitterSubVolumeInfo(param), HttpStatus.OK);
}
@PostMapping("/bindSlitterSubVolumeInfo")
@Log("绑定分切机上的子卷信息")
@SaIgnore
public ResponseEntity<Object> bindSlitterSubVolumeInfo(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.bindSlitterSubVolumeInfo(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.bindSlitterSubVolumeInfo(param), HttpStatus.OK);
}
@PostMapping("/unBindSlitterSubVolumeInfo")
@Log("接绑分切机上的子卷信息")
@SaIgnore
public ResponseEntity<Object> unBindSlitterSubVolumeInfo(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.unBindSlitterSubVolumeInfo(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.unBindSlitterSubVolumeInfo(param), HttpStatus.OK);
}
@PostMapping("/querySlitterDeviceSubVolumeInfos")
@Log("查询手持查询设备对应的子卷数据")
@SaIgnore
public ResponseEntity<Object> querySlitterDeviceSubVolumeInfos(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.querySlitterDeviceSubVolumeInfos(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.querySlitterDeviceSubVolumeInfos(param), HttpStatus.OK);
}
@PostMapping("/queryCacheDownSubVolumeInfos")
@Log("手持查询暂存位置的子卷数据")
@SaIgnore
public ResponseEntity<Object> queryCacheDownSubVolumeInfos(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.queryCacheDownSubVolumeInfos(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.queryCacheDownSubVolumeInfos(param), HttpStatus.OK);
}
@PostMapping("/doStockAreaBinding")
@Log("手持备货区绑定")
@SaIgnore
public ResponseEntity<Object> doStockAreaBinding(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doStockAreaBinding(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doStockAreaBinding(param), HttpStatus.OK);
}
@PostMapping("/doStockAreaUnbinding")
@Log("手持备货区解除绑定")
@SaIgnore
public ResponseEntity<Object> doStockAreaUnbinding(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doStockAreaUnbinding(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doStockAreaUnbinding(param), HttpStatus.OK);
}
@PostMapping("/doSubRollWeightBinding")
@Log("手持子卷重量绑定")
@SaIgnore
public ResponseEntity<Object> doSubRollWeightBinding(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doSubRollWeightBinding(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doSubRollWeightBinding(param), HttpStatus.OK);
}
@PostMapping("/doSubRollWeightBindingTip")
@Log("手持子卷重量绑定提示")
@SaIgnore
public ResponseEntity<Object> doSubRollWeightBindingTip(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doSubRollWeightBindingTip(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doSubRollWeightBindingTip(param), HttpStatus.OK);
}
@PostMapping("/doUpShaftToSlitter")
@Log("手持分切机上气胀轴")
@SaIgnore
public ResponseEntity<Object> doUpShaftToSlitter(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doUpShaftToSlitter(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doUpShaftToSlitter(param), HttpStatus.OK);
}
@PostMapping("/doUpShaftToSlitterByDevice")
@Log("手持分切机上气胀轴2")
@SaIgnore
public ResponseEntity<Object> doUpShaftToSlitterByDevice(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doUpShaftToSlitterByDevice(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doUpShaftToSlitterByDevice(param), HttpStatus.OK);
}
@PostMapping("/doUpShaftToSlitterByDeviceTip")
@Log("手持分切机上气胀轴提示")
@SaIgnore
public ResponseEntity<Object> doUpShaftToSlitterByDeviceTip(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.doUpShaftToSlitterByDeviceTip(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.doUpShaftToSlitterByDeviceTip(param), HttpStatus.OK);
}
@PostMapping("/getUpShaftTip")
@Log("手持分切机上气胀轴-查询信息")
@SaIgnore
public ResponseEntity<Object> getUpShaftTip(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.getUpShaftTip(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.getUpShaftTip(param), HttpStatus.OK);
}
@PostMapping("/forcedFeedShaft")
@Log("强制送轴")
@SaIgnore
public ResponseEntity<Object> forcedFeedShaft(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.forcedFeedShaft(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.forcedFeedShaft(param), HttpStatus.OK);
}
@PostMapping("/showManualView")
@Log("送轴情况")
@SaIgnore
public ResponseEntity<Object> showManualView(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.showManualView(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.showManualView(param), HttpStatus.OK);
}
@PostMapping("/urgentPlan")
@Log("加急送轴")
@SaIgnore
public ResponseEntity<Object> urgentPlan(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.urgentPlan(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.urgentPlan(param), HttpStatus.OK);
}
@PostMapping("/rollCacheManage")
@Log("母卷暂存架子管理")
@SaIgnore
public ResponseEntity<Object> rollCacheManage(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.rollCacheManage(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.rollCacheManage(param), HttpStatus.OK);
}
@PostMapping("/rollCacheManageTip")
@Log("母卷暂存架子管理提示")
@SaIgnore
public ResponseEntity<Object> rollCacheManageTip(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterDevices.rollCacheManageTip(param), HttpStatus.OK);
return new ResponseEntity<>(slitterService.rollCacheManageTip(param), HttpStatus.OK);
}
@PostMapping("/downBait")
@Log("饵料下卷")
@SaIgnore
public ResponseEntity<Object> downBait(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(slitterService.downBait(whereJson), HttpStatus.OK);
}
}

View File

@@ -95,9 +95,6 @@ public class AutoCallAirShaftTask {
public final static String TZ_DAY = "TZ_DAY";
public String stepStr = "";
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* hint: 目前只是考虑了上区域
* 执行套轴和拔轴任务的逻辑处理。
@@ -209,12 +206,15 @@ public class AutoCallAirShaftTask {
// 获取一个分切计划的Dto。如果是6寸可以直接使用、如果是3寸需要判断当前位置是否满足
// todo: 需要校验分切设备是在对应的区域中
SlitterPlanDistinctDto planDto = plans.stream()
.filter(planD -> "6".equals(planD.getQzz_size()) ||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation())))
.filter(planD -> ("6".equals(planD.getQzz_size()) ||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation()))) &&
havaEmptyShaft(planD, empty))
.findFirst()
.orElse(null);
if (planDto == null) {
log.warn("过滤3/6寸和代数输出结果为空跳过此次套轴。此时点位对应代数{}", specification);
log.warn("过滤3/6寸和代数输出结果为空跳过此次套轴,直接拔轴。此时点位对应代数:{}", specification);
// 如果不需要套轴,就只做拔轴
makePullShaft(empty, specification);
return;
}
log.info("此时获取的分切计划dto: {}", planDto);
@@ -251,11 +251,6 @@ public class AutoCallAirShaftTask {
if (qzzPoint.size() == 0) {
stepStr += ",16";
//若套轴暂存位没有相同规格的气胀轴,直接去气胀轴库找即可
// 要先判断AGV任务才能去呼叫出轴
// if (!toCallAgvMovePaperTube(needPlans, location, empty)) {
// log.error("呼叫AGV失败-穿拔轴{}不进行套轴,跳过!", empty.getPoint_code());
// return;
// }
// 调用ACS滚条气涨轴下来
if (!toAcsOutShaft(qzzSize,location, empty)) {
log.error("呼叫出轴失败-穿拔轴{}不进行套轴,跳过!", empty.getPoint_code());
@@ -324,10 +319,6 @@ public class AutoCallAirShaftTask {
param.put("qzz_size", needPlan.getQzz_size());
// 所需的纸管规格
SlitterTaskUtil.putNeedPaperSpec(param, needPlans);
// if (!toCallAgvMovePaperTube(needPlans, location, empty)) {
// log.error("呼叫AGV失败-穿拔轴{}不进行套轴,跳过!", empty.getPoint_code());
// return;
// }
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
// 设置是否套轴1正常套轴2待定到后面还会申请套轴
@@ -358,6 +349,62 @@ public class AutoCallAirShaftTask {
stepStr += ",97";
}
/**
* 判断是不是有空位置
* @param planD
* @return
*/
public boolean havaEmptyShaft(SlitterPlanDistinctDto planD, BstIvtShafttubeivt empty) {
String qzzSize = planD.getQzz_size();
String qzzGeneration = planD.getQzz_generation();
String location = empty.getPoint_location();
// 需要区分上下
List<BstIvtShafttubeivt> shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize ,empty.getPoint_code(), location);
if (shafttubeivts.size() == 0) {
log.error("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位");
return false;
}
// 气涨轴库
BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0);
// 判断气胀轴是否有轴
JSONArray device_rows = new JSONArray();
JSONObject device_obj = new JSONObject();
device_rows.add(device_obj);
device_obj.put("device_code", shafttubeivt.getPoint_code());
// todo: 暂时都是B1
device_obj.put("product_area", "B1");
JSONObject pointStatus = wmsToAcsService.getPointStatus(device_rows);
if (ObjectUtil.isEmpty(pointStatus) || ObjectUtil.isEmpty(pointStatus.getJSONArray("data"))) {
log.error("获取气胀轴库信息失败");
return false;
}
boolean judgment1 = true;
boolean judgment2 = true;
JSONObject data2 = pointStatus.getJSONArray("data").getJSONObject(0);
if (data2.getInteger("qty") == 0) {
log.warn("气胀轴库【" + shafttubeivt.getPoint_code() + "】没有气胀轴。");
judgment1 = false;
}
// 获取气涨轴缓存没有任务的点位
List<BstIvtShafttubeivt> qzzCache = bstIvtShafttubeivtService.getNotTaskShaftCache(qzzSize,
shafttubeivt.getQzz_generation(), location);
if (qzzCache.size() == 0) {
log.warn("未找到气胀轴密集库气涨轴规格「" + qzzSize + "」的暂存位");
judgment2 = false;
}
// 从套轴对接位获取相同气涨轴大小
// update: 不需要(同标箔或者锂电分开)
// todo: 需要校验区域0/1
stepStr += ",15";
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, qzzGeneration);
log.info("查找可以拔轴的点位数:{}", qzzPoint.size());
if (!judgment1 && !judgment2 && qzzPoint.size() == 0) {
log.warn("都没有气胀轴");
return false;
}
return true;
}
/**
* 设置是否套轴
*
@@ -678,6 +725,7 @@ public class AutoCallAirShaftTask {
throw new BadRequestException("气涨轴[" + qzzNo + "]对应的分切计划不存在!");
}
PdmBiSlittingproductionplan plan = list.get(0);
// todo: 考虑是否有空位(如果气涨轴库和气胀轴暂存架都没有空位,则退出)【暂时不考虑】
List<String> collect = list.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList());
JSONObject param = new JSONObject();
param.put("point_code1", pointCode1);

View File

@@ -348,4 +348,11 @@ public interface SlitterService {
* @return
*/
JSONObject downRollsCheck(JSONObject param);
/**
* 饵料下卷
* @param param
* @return
*/
JSONObject downBait(JSONObject param);
}

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -42,10 +43,12 @@ import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.CallPlanViewVO;
import org.nl.b_lms.sch.tasks.slitter.service.SlitterService;
import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil;
import org.nl.common.enums.NoticeTypeEnum;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.TaskUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.wms.ext.acs.service.WmsToAcsService;
@@ -120,6 +123,8 @@ public class SlitterServiceImpl implements SlitterService {
private IpdmBiSubpackagerelationService subpackagerelationService;
@Autowired
private UpShaftTrussTask upShaftTrussTask;
@Autowired
private ISysNoticeService noticeService;
@Override
@@ -343,7 +348,9 @@ public class SlitterServiceImpl implements SlitterService {
}
if (ObjectUtil.isEmpty(cutPoint)) {
// 获取一个空位 (上下区域)
List<BstIvtCutpointivt> emptyNotTaskPoint = bcutpointivtService.getAreaNotTaskPointByStatus(
// List<BstIvtCutpointivt> emptyNotTaskPoint = bcutpointivtService.getAreaNotTaskPointByStatus(
// "1", "1", startPoint.getPoint_location(), "1");
List<BstIvtCutpointivt> emptyNotTaskPoint = bcutpointivtService.getNBJAreaNotTaskPointByStatus(
"1", "1", startPoint.getPoint_location(), "1");
if (emptyNotTaskPoint.size() == 0) {
throw new BadRequestException("找不到可用套轴对接位!");
@@ -909,8 +916,20 @@ public class SlitterServiceImpl implements SlitterService {
.eq("row_num", param.getString("row_num"))
.eq("qty", "0");
boolean remove = papervehicleService.remove(deleteWrapper);
// todo: 如果qty=0创建AGV送空任务新的task_type、后期优化可以新增诺宝取货完成提前释放货位任务状态变成071
// if (remove) { // hint: 错误
// // 证明删除成功,创建任务搬走
// // 查找一个没有任务的空位
// List<BstIvtStockingivt> list = stockingivtService.getEmptyPointNotTask(device.getPoint_location(), "0");
// if (list.size() == 0) {
// noticeService.createNotice("管芯抓取备货区找不到空位置搬运",
// "管芯抓取点位[" + device.getPoint_name() + "]无法从备货区找到空位",
// NoticeTypeEnum.EXCEPTION.getCode());
// return res;
// }
// BstIvtStockingivt stockingivt = list.get(0);
// }
}
// todo: 如果qty=0创建AGV送空任务新的task_type、后期优化可以新增诺宝取货完成提前释放货位任务状态变成071
return res;
}
@@ -2334,4 +2353,211 @@ public class SlitterServiceImpl implements SlitterService {
res.put("flag", "1");
return res;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject downBait(JSONObject param) {
log.info("饵料下卷:{}", param);
// param: area, device_code, point_code, left_spec, right_spec
String area = param.getString("area");
String point_code = param.getString("point_code");
String up_or_down = param.getString("up_or_down");
String left_spec = param.getString("left_spec_value");
String right_spec = param.getString("right_spec_value");
String left_spec_value = param.getString("left_spec");
String right_spec_value = param.getString("right_spec");
int num = ObjectUtil.isNotEmpty(left_spec) && ObjectUtil.isNotEmpty(right_spec) ? 2 : 1;
if (!area.startsWith("B")) {
throw new BadRequestException("仅限于二期使用");
}
//查询该点位对应的机台编号
StIvtCutpointivt cutDevice = cutpointivtService.getPintByUpOrDownCode(point_code, false);
// JSONObject cut_ivt = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("up_point_code ='" + point_code + "' OR down_point_code ='" + point_code + "'").uniqueResult(0);
String device_code = cutDevice.getExt_code();
if (ObjectUtil.isEmpty(cutDevice)) {
throw new BadRequestException("未查询到对应的分切机!");
}
// 判断是否存在任务
List<SchBaseTask> tasks = taskService.checkHaveTask("1".equals(up_or_down) ? cutDevice.getUp_point_code() : cutDevice.getDown_point_code());
if (tasks.size() > 0) {
throw new BadRequestException("该点位已经创建过任务");
}
List<PdmBiSlittingproductionplan> plans = new ArrayList<>();
String qzzNo = device_code.substring(0, 2)
+ device_code.substring(device_code.length() - 2)
+ TaskUtils.getDateTime("yyMMddHHmmss") + "-饵料";
String code = "饵料" + TaskUtils.getDateTime("yyMMddHHmmss");
// 创建饵料计划
for (int i = 0; i < num; i++) {
String containerName = area + code + "-" + i;
PdmBiSlittingproductionplan plan = new PdmBiSlittingproductionplan();
plan.setWorkorder_id(IdUtil.getSnowflake(1,1).nextIdStr());
// 公共部分插入
plan.setOrder_type("1");
plan.setContainer_name(containerName);
plan.setProduct_name("220890200000001");
plan.setDescription("虚拟卷");
plan.setParent_container_name(code);
plan.setRestruct_container_name("");
plan.setWare_house("1");
plan.setResource_name(device_code);
plan.setSplit_group("A");
plan.setManufacture_sort("P1");
plan.setMfg_order_name("-");
plan.setManufacture_date(DateUtil.format(DateUtil.date(), "yyyy-MM-dd"));
plan.setSplit_breadth(new BigDecimal("999"));
plan.setSplit_height(new BigDecimal("999"));
plan.setSplit_weight(new BigDecimal("999"));
plan.setStart_time(DateUtil.now());
plan.setEnd_time("");
plan.setStatus("01");
plan.setIs_parent_ok("0");
plan.setIs_child_tz_ok("0");
plan.setIs_child_ps_ok("0");
plan.setPaper_weight("0");
plan.setQzzno("");
plan.setIs_delete("0");
plan.setSale_order_name("-");
plan.setIs_call("0");
plan.setIs_paper_ok("1");
plan.setFRP_model("");
plan.setFRP_material("");
plan.setFRP_description("");
plan.setPaper_tube_model("");
plan.setPaper_tube_material("");
plan.setPaper_tube_description("");
plan.setQzzno(qzzNo);
plan.setLevel("5");
// 区分位置创建
if (i == 0 && ObjectUtil.isNotEmpty(left_spec) && "1".equals(up_or_down)) {
// 上左
plan.setPaper_tube_or_FRP(left_spec_value.startsWith("48") ? "1" : "2");
String[] split = left_spec.split("\\|");
plan.setQzz_size(String.valueOf(split[2].charAt(0)));
if ("1".equals(plan.getPaper_tube_or_FRP())) {
plan.setPaper_tube_material(left_spec_value);
plan.setPaper_tube_model(left_spec);
plan.setPaper_tube_description(left_spec);
} else {
plan.setFRP_material(left_spec_value);
plan.setFRP_model(left_spec);
plan.setFRP_description(left_spec);
}
if (left_spec.contains("3英寸") || left_spec.contains("3.12英寸")) {
plan.setQzz_generation("4");
} else {
plan.setQzz_generation("5");
}
plan.setUp_or_down("1");
plan.setLeft_or_right("1");
}
if (i == 1 && ObjectUtil.isNotEmpty(right_spec) && "1".equals(up_or_down)) {
// 上右
plan.setPaper_tube_or_FRP(right_spec_value.startsWith("48") ? "1" : "2");
String[] split = right_spec.split("\\|");
plan.setQzz_size(String.valueOf(split[2].charAt(0)));
if ("1".equals(plan.getPaper_tube_or_FRP())) {
plan.setPaper_tube_material(right_spec_value);
plan.setPaper_tube_model(right_spec);
plan.setPaper_tube_description(right_spec);
} else {
plan.setFRP_material(right_spec_value);
plan.setFRP_model(right_spec);
plan.setFRP_description(right_spec);
}
plan.setUp_or_down("1");
plan.setLeft_or_right("2");
if (right_spec.contains("3英寸") || right_spec.contains("3.12英寸")) {
plan.setQzz_generation("4");
} else {
plan.setQzz_generation("5");
}
}
if (i == 0 && ObjectUtil.isNotEmpty(left_spec) && "2".equals(up_or_down)) {
// 下左
plan.setPaper_tube_or_FRP(left_spec_value.startsWith("48") ? "1" : "2");
String[] split = left_spec.split("\\|");
plan.setQzz_size(String.valueOf(split[2].charAt(0)));
if ("1".equals(plan.getPaper_tube_or_FRP())) {
plan.setPaper_tube_material(left_spec_value);
plan.setPaper_tube_model(left_spec);
plan.setPaper_tube_description(left_spec);
} else {
plan.setFRP_material(left_spec_value);
plan.setFRP_model(left_spec);
plan.setFRP_description(left_spec);
}
plan.setUp_or_down("2");
plan.setLeft_or_right("1");
if (left_spec.contains("3英寸") || left_spec.contains("3.12英寸")) {
plan.setQzz_generation("4");
} else {
plan.setQzz_generation("5");
}
}
if (i == 1 && ObjectUtil.isNotEmpty(right_spec) && "2".equals(up_or_down)) {
// 下右
plan.setPaper_tube_or_FRP(right_spec_value.startsWith("48") ? "1" : "2");
String[] split = right_spec.split("\\|");
plan.setQzz_size(String.valueOf(split[2].charAt(0)));
if ("1".equals(plan.getPaper_tube_or_FRP())) {
plan.setPaper_tube_material(right_spec_value);
plan.setPaper_tube_model(right_spec);
plan.setPaper_tube_description(right_spec);
} else {
plan.setFRP_material(right_spec_value);
plan.setFRP_model(right_spec);
plan.setFRP_description(right_spec);
}
plan.setUp_or_down("2");
plan.setLeft_or_right("2");
if (right_spec.contains("3英寸") || right_spec.contains("3.12英寸")) {
plan.setQzz_generation("4");
} else {
plan.setQzz_generation("5");
}
}
plans.add(plan);
}
// 校验设备对应的分切暂存架子是不是可用切无数据无任务。
BstIvtCutpointivt cutCacheShelf = bcutpointivtService.getOne(new LambdaQueryWrapper<BstIvtCutpointivt>()
.eq(BstIvtCutpointivt::getProduct_area, cutDevice.getProduct_area())
.eq(BstIvtCutpointivt::getPlan, cutDevice.getPoint_code())
.eq(BstIvtCutpointivt::getIs_used, SlitterConstant.SLITTER_YES));
if (ObjectUtil.isEmpty(cutCacheShelf)) {
throw new BadRequestException("分切机{" + cutDevice.getPoint_code() + "}对应的分切架子不存在!");
}
if (!SlitterConstant.SLITTER_YES.equals(cutCacheShelf.getPoint_status())) {
throw new BadRequestException("架子[" + cutCacheShelf.getPoint_code() + "]上有货!");
}
// 判断任务
List<SchBaseTask> taskList = taskService.checkHaveTask(cutCacheShelf.getPoint_code());
if (taskList.size() > 0) {
throw new BadRequestException("分切架子存在任务!");
}
// 创建任务
JSONObject taskParam = new JSONObject();
List<String> containers = plans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList());
taskParam.put("containers", containers);
taskParam.put("point_code1", "1".equals(up_or_down)
? cutDevice.getUp_point_code() : cutDevice.getDown_point_code());
taskParam.put("point_code2", "1".equals(up_or_down)
? cutCacheShelf.getTruss_point_code1() : cutCacheShelf.getTruss_point_code2());
taskParam.put("truss_type", "1");
taskParam.put("empty_site", "0");
taskParam.put("task_type", SlitterEnum.TASK_TYPE.code("分切机下料桁架任务"));
taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
// 分切计划修改状态 05 -> 06
plans.forEach(plan -> {
plan.setStatus("06");
TaskUtils.updateOptMessageBySlitterPlan(plan);
});
slittingproductionplanService.saveBatch(plans);
// 创建任务
slitterDownTrussTask.createTask(taskParam);
JSONObject res = new JSONObject();
res.put("status", HttpStatus.HTTP_OK);
res.put("message", "饵料下卷成功!");
return res;
}
}