diff --git a/lms/nladmin-system/nlsso-server/pom.xml b/lms/nladmin-system/nlsso-server/pom.xml index 1ddb8c3..b7dbaab 100644 --- a/lms/nladmin-system/nlsso-server/pom.xml +++ b/lms/nladmin-system/nlsso-server/pom.xml @@ -196,7 +196,7 @@ mysql mysql-connector-java - runtime + 8.0.20 diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java new file mode 100644 index 0000000..f2ebd78 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java @@ -0,0 +1,88 @@ +package org.nl.config; + +import com.alibaba.druid.filter.FilterChain; +import com.alibaba.druid.filter.FilterEventAdapter; +import com.alibaba.druid.proxy.jdbc.JdbcParameter; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; +import com.alibaba.druid.proxy.jdbc.ResultSetProxy; +import com.alibaba.druid.proxy.jdbc.StatementProxy; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcUtils; +import com.mysql.cj.jdbc.result.ResultSetImpl; +import lombok.extern.slf4j.Slf4j; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/* + * @author ZZQ + * @Date 2023/2/10 11:27 上午 + */ +@Slf4j +public class DruidFilter extends FilterEventAdapter { + + @Override + public int preparedStatement_executeUpdate(FilterChain chain, PreparedStatementProxy statement) throws SQLException { + + return super.preparedStatement_executeUpdate(chain, statement); + } + + @Override + public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql) throws SQLException { + + return super.statement_executeUpdate(chain, statement, sql); + } + + @Override + protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) { + int size = statement.getParametersSize(); + String executeSql = sql; + int count = 0; + try { + count = statement.getUpdateCount(); + } catch (Exception ex) { + } + if (count > 0) { + if (size > 0) { + Collection values = statement.getParameters().values(); + List params = new ArrayList<>(); + for (JdbcParameter value : values) { + params.add(value.getValue()); + } + executeSql = SQLUtils.format(executeSql, JdbcUtils.MYSQL, params); + } + log.info("[----SQL----][update][ SQL: {} ]", executeSql); + } + super.statementExecuteAfter(statement, sql, result); + } + + @Override + public ResultSetProxy statement_getResultSet(FilterChain chain, StatementProxy statement) throws SQLException { + ResultSetProxy rs = super.statement_getResultSet(chain, statement); + String executeSql = statement.getLastExecuteSql(); + int result = 0; + if (rs != null) { + ResultSetImpl rss = rs.getResultSetRaw().unwrap(ResultSetImpl.class); + result = rss.getRows().size(); + } + try { + int size = statement.getParametersSize(); + if (size > 0) { + Collection values = statement.getParameters().values(); + List params = new ArrayList<>(); + for (JdbcParameter value : values) { + params.add(value.getValue()); + } + executeSql = SQLUtils.format(executeSql, JdbcUtils.MYSQL, params); + } + } catch (Exception ex) { + log.warn("[-SQL解析异常-][{}]", ex.getMessage()); + } + log.info("[----SQL----][select][执行结果:{}][ SQL: {} ]", result, executeSql); + return rs; + } + + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/IMdBaseMaterialService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/IMdBaseMaterialService.java index 09a7453..afedb9b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/IMdBaseMaterialService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/IMdBaseMaterialService.java @@ -62,4 +62,6 @@ public interface IMdBaseMaterialService extends IService { * @return */ IPage queryByInventory(MdBaseMaterialQuery whereJson, PageQuery page); + + IPage queryCoolingMaterials(MdBaseMaterialQuery whereJson, PageQuery page); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java index 2ff0531..9c2d89b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java @@ -130,4 +130,6 @@ public class MdBaseMaterial implements Serializable { private String reduce_volume; @TableField(exist = false) private String total_material_qty; + @TableField(exist = false) + private String cooling_name; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.java index 6bc1f7f..eb310f5 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.java @@ -19,4 +19,6 @@ public interface MdBaseMaterialMapper extends BaseMapper { * @return */ IPage queryByInventory(IPage pages, MdBaseMaterialQuery query); + + IPage queryCoolingMaterials(IPage pages, MdBaseMaterialQuery query); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.xml index 9d75ddf..18b8611 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/mapper/MdBaseMaterialMapper.xml @@ -48,4 +48,61 @@ row_num = 1 ORDER BY CTE.total_material_qty DESC + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/impl/MdBaseMaterialServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/impl/MdBaseMaterialServiceImpl.java index 255f468..b3f8e69 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/impl/MdBaseMaterialServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/impl/MdBaseMaterialServiceImpl.java @@ -117,4 +117,11 @@ public class MdBaseMaterialServiceImpl extends ServiceImpl queryCoolingMaterials(MdBaseMaterialQuery whereJson, PageQuery page) { + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + pages = mdBaseMaterialMapper.queryCoolingMaterials(pages, whereJson); + return pages; + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index f470d8e..fbd0f49 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -195,4 +195,6 @@ public interface AcsToWmsService { * @return */ BaseResponse applyOneCloth(JSONObject param); + + ApplyTaskResponse recordOutCoolKilnTime(ApplyTaskRequest request); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/ApplyTaskRequest.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/ApplyTaskRequest.java index 830c043..91287e7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/ApplyTaskRequest.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/ApplyTaskRequest.java @@ -52,4 +52,6 @@ public class ApplyTaskRequest extends BaseRequest { * 关联设备属性 */ private List list; + + private String isEmpty; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index aa6a2af..6d0648d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -5,6 +5,7 @@ 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.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.SneakyThrows; @@ -30,7 +31,9 @@ import org.nl.wms.ext.mes.service.dto.SpreaderDto; import org.nl.wms.ext.mms.service.WmsToMmsService; import org.nl.wms.ext.record.service.ISysInteractRecordService; import org.nl.wms.pdm.consumption.service.IPdmBdMudConsumptionService; +import org.nl.wms.pdm.record.service.IPdmBdKilnRecordService; import org.nl.wms.pdm.record.service.IPdmBdRequestMaterialRecordService; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; import org.nl.wms.pdm.record.service.dao.PdmBdRequestMaterialRecord; import org.nl.wms.pdm.residue.service.IPdmBdMaterialResidueService; import org.nl.wms.pdm.track.service.IPdmBdProductionProcessTrackingService; @@ -64,6 +67,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; +import javax.annotation.Resource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; @@ -122,6 +126,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private WmsToMmsService wmsToMmsService; @Autowired private FJMapper fjMapper; + @Resource + private IPdmBdKilnRecordService kilnRecordService; // 初始化反射方法 @PostConstruct @@ -661,6 +667,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { // 如果是入窑口就是记录数据 case GeneralDefinition.GZY: return this.recordKilnTime(baseRequest); + case GeneralDefinition.LQY: + return this.recordOutCoolKilnTime(baseRequest); default: taskResponse.setMessage("参数错误!"); taskResponse.setCode(HttpStatus.HTTP_BAD_REQUEST); @@ -779,31 +787,36 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { baseRequest.setVehicle_code(TaskUtils.defaultVehicleCode(baseRequest.getVehicle_code())); baseRequest.setVehicle_type(GeneralDefinition.STEEL_TRAY); SchBasePoint basePoint = pointService.getById(baseRequest.getDevice_code()); - // 入窑记录时间 - SchBaseVehiclematerialgroup groupInfo = vehiclematerialgroupService.getGroupInfo(baseRequest.getVehicle_code(), - baseRequest.getVehicle_type(), GroupBindMaterialStatusEnum.BOUND.getValue()); - if (ObjectUtil.isEmpty(groupInfo)) { - throw new BadRequestException("入窑失败:载具[" + baseRequest.getVehicle_code() + "]组盘信息不存在!"); + if ("1".equals(baseRequest.getIsEmpty())) { + // 记录入窑记录 + kilnRecordService.recordEmptyKilnInfo(baseRequest.getVehicle_code(), basePoint); + } else { + // 入窑记录时间 + SchBaseVehiclematerialgroup groupInfo = vehiclematerialgroupService.getGroupInfo(baseRequest.getVehicle_code(), + baseRequest.getVehicle_type(), GroupBindMaterialStatusEnum.BOUND.getValue()); + if (ObjectUtil.isEmpty(groupInfo)) { + throw new BadRequestException("入窑失败:载具[" + baseRequest.getVehicle_code() + "]组盘信息不存在!"); + } + // 记录入窑数据给MES + groupInfo.setInto_kiln_time(DateUtil.now()); + if (ObjectUtil.isNotEmpty(basePoint)) { + // 记录当前位置 + groupInfo.setPoint_code(basePoint.getPoint_code()); + groupInfo.setPoint_name(basePoint.getPoint_name()); + groupInfo.setMove_way(groupInfo.getMove_way() + " -> " + basePoint.getPoint_code()); + } + TaskUtils.setGroupUpdateByAcs(groupInfo); + vehiclematerialgroupService.updateById(groupInfo); + // 记录入窑记录 + kilnRecordService.recordKilnInfo(groupInfo, basePoint); + // 插入生产过程跟踪表 + PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); + processTracking.setBuss_move_id(groupInfo.getBuss_move_id()); + processTracking.setProcess_action("送料到入窑口"); + processTracking.setProcess_location(baseRequest.getDevice_code()); + processTracking.setRecord_time(DateUtil.now()); + processTrackingService.create(processTracking); } - // 记录入窑数据给MES - groupInfo.setInto_kiln_time(DateUtil.now()); - if (ObjectUtil.isNotEmpty(basePoint)) { - // 记录当前位置 - groupInfo.setPoint_code(basePoint.getPoint_code()); - groupInfo.setPoint_name(basePoint.getPoint_name()); - groupInfo.setMove_way(groupInfo.getMove_way() + " -> " + basePoint.getPoint_code()); - } - TaskUtils.setGroupUpdateByAcs(groupInfo); - vehiclematerialgroupService.updateById(groupInfo); - wmsToMesService.reportGdyMaterialInfoIn(groupInfo); - // 插入生产过程跟踪表 - PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); - processTracking.setBuss_move_id(groupInfo.getBuss_move_id()); - processTracking.setProcess_action("送料到入窑口"); - processTracking.setProcess_location(baseRequest.getDevice_code()); - processTracking.setRecord_time(DateUtil.now()); - processTrackingService.create(processTracking); - // delete: 点位解锁 return ApplyTaskResponse.responseOk(baseRequest.getRequestNo(), "扫码成功申请"); } @@ -1064,4 +1077,30 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { wmsToMesService.reportSpreaderInfoToMes(spreaderDto); return BaseResponse.responseOk(actionRequest.getRequestNo()); } + + @Override + public ApplyTaskResponse recordOutCoolKilnTime(ApplyTaskRequest baseRequest) { + log.info("扫码成功申请 - 出冷却窑记录时间的参数: {}", baseRequest); + if (ObjectUtil.isEmpty(baseRequest.getVehicle_code())) { + throw new BadRequestException("载具编码不能为空"); + } + baseRequest.setVehicle_code(TaskUtils.defaultVehicleCode(baseRequest.getVehicle_code())); + baseRequest.setVehicle_type(GeneralDefinition.STEEL_TRAY); + if ("1".equals(baseRequest.getIsEmpty())) { + // 空盘只做记录 + // 记录入窑记录 + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(baseRequest.getVehicle_code(), "2"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); + } + kilnRecordService.outCoolEmptyKilnInfo(record); + } else { + JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(baseRequest)); + jsonObject.put("config_code", "LQYMLTask"); + // 创建任务 + AbstractTask lqymlTask = taskFactory.getTask("LQYMLTask"); + lqymlTask.apply(jsonObject); + } + return ApplyTaskResponse.responseOk(baseRequest.getRequestNo(), "扫码成功申请"); + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/controller/PdmBdKilnRecordController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/controller/PdmBdKilnRecordController.java new file mode 100644 index 0000000..f5ce6de --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/controller/PdmBdKilnRecordController.java @@ -0,0 +1,59 @@ +package org.nl.wms.pdm.record.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pdm.record.service.IPdmBdKilnRecordService; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; +/** +* @author liyongde +* @date 2025-12-17 +**/ +@Slf4j +@RestController +@RequestMapping("/api/pdmBdKilnRecord") +public class PdmBdKilnRecordController { + + @Autowired + private IPdmBdKilnRecordService pdmBdKilnRecordService; + + @GetMapping + @Log("查询窑信息历史记录") + //@SaCheckPermission("@el.check('pdmBdKilnRecord:list')") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page){ + return new ResponseEntity<>(TableDataInfo.build(pdmBdKilnRecordService.queryAll(whereJson,page)),HttpStatus.OK); + } + + @PostMapping + @Log("新增窑信息历史记录") + //@SaCheckPermission("@el.check('pdmBdKilnRecord:add')") + public ResponseEntity create(@Validated @RequestBody PdmBdKilnRecord entity){ + pdmBdKilnRecordService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改窑信息历史记录") + //@SaCheckPermission("@el.check('pdmBdKilnRecord:edit')") + public ResponseEntity update(@Validated @RequestBody PdmBdKilnRecord entity){ + pdmBdKilnRecordService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除窑信息历史记录") + //@SaCheckPermission("@el.check('pdmBdKilnRecord:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + pdmBdKilnRecordService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/IPdmBdKilnRecordService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/IPdmBdKilnRecordService.java new file mode 100644 index 0000000..4848784 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/IPdmBdKilnRecordService.java @@ -0,0 +1,63 @@ +package org.nl.wms.pdm.record.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.dao.SchBasePoint; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* @description 服务接口 +* @author liyongde +* @date 2025-12-17 +**/ +public interface IPdmBdKilnRecordService extends IService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + /** + * 创建 + * @param entity / + */ + void create(PdmBdKilnRecord entity); + + /** + * 编辑 + * @param entity / + */ + void update(PdmBdKilnRecord entity); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Set ids); + + void recordKilnInfo(SchBaseVehiclematerialgroup groupInfo, SchBasePoint basePoint); + + void recordEmptyKilnInfo(String vehicleCode, SchBasePoint basePoint); + + void outDryKilnInfo(String vehicleCode); + + void outDryKilnInfo(PdmBdKilnRecord record); + + List listByVehicleAndStatus(String vehicleCode, List status); + PdmBdKilnRecord oneByVehicleAndStatus(String vehicleCode, String status); + + void inCoolKilnInfo(String vehicleCode, SchBasePoint basePoint); + + void outCoolEmptyKilnInfo(PdmBdKilnRecord record); + void outCoolKilnInfo(PdmBdKilnRecord record); + void outCoolStatusKilnInfo(PdmBdKilnRecord record); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/PdmBdKilnRecord.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/PdmBdKilnRecord.java new file mode 100644 index 0000000..9f1a3a2 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/PdmBdKilnRecord.java @@ -0,0 +1,86 @@ +package org.nl.wms.pdm.record.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** +* @description / +* @author liyongde +* @date 2025-12-17 +**/ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("pdm_bd_kiln_record") +public class PdmBdKilnRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "record_id", type = IdType.NONE) + /** 记录id */ + private String record_id; + + /** + * 托盘编码 + */ + private String vehicle_code; + + /** + * 托盘类型 + */ + private String vehicle_type; + + /** + * 入干燥窑时间 + */ + private String into_dry_kiln_time; + + /** + * 出干燥窑时间 + */ + private String out_dry_kiln_time; + + /** + * 入冷却窑时间 + */ + private String into_cooling_kiln_time; + + /** + * 出冷却窑时间 + */ + private String out_cooling_kiln_time; + + /** + * 干燥窑号 + */ + private String dry_code; + + /** + * 干燥窑名称 + */ + private String dry_name; + + /** + * 冷却窑号 + */ + private String cooling_code; + + /** + * 冷却窑名称 + */ + private String cooling_name; + + /** + * 状态(1:干燥窑、2:冷却窑、3:历史记录) + */ + private String status; + private String create_time; + private String update_time; + private String group_id; + private String remark; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.java new file mode 100644 index 0000000..566dee5 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.java @@ -0,0 +1,12 @@ +package org.nl.wms.pdm.record.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; + +/** +* @author liyongde +* @date 2025-12-17 +**/ +public interface PdmBdKilnRecordMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.xml new file mode 100644 index 0000000..d3e8f1b --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dao/mapper/PdmBdKilnRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordDto.java new file mode 100644 index 0000000..8e65b94 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordDto.java @@ -0,0 +1,55 @@ +package org.nl.wms.pdm.record.service.dto; + +import lombok.Data; +import java.io.Serializable; + +/** +* @description / +* @author liyongde +* @date 2025-12-17 +**/ +@Data +public class PdmBdKilnRecordDto implements Serializable { + + /** 记录id */ + private String record_id; + + /** 托盘编码 */ + private String vehicle_code; + + /** 托盘类型 */ + private String vehicle_type; + + /** 入干燥窑时间 */ + private String into_dry_kiln_time; + + /** 出干燥窑时间 */ + private String out_dry_kiln_time; + + /** 入冷却窑时间 */ + private String into_cooling_kiln_time; + + /** 出冷却窑时间 */ + private String out_cooling_kiln_time; + + /** 干燥窑号 */ + private String dry_no; + + /** 干燥窑名称 */ + private String dry_name; + + /** 冷却窑号 */ + private String cooling_code; + + /** 冷却窑名称 */ + private String cooling_name; + + /** 状态(1:干燥窑、2:冷却窑、3:历史记录) */ + private String status; + + /** 创建时间 */ + private String create_time; + + /** 更新时间 */ + private String update_time; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordQuery.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordQuery.java new file mode 100644 index 0000000..7e6e40b --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/dto/PdmBdKilnRecordQuery.java @@ -0,0 +1,12 @@ +package org.nl.wms.pdm.record.service.dto; + +import org.nl.common.domain.query.BaseQuery; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; + +/** +* @author liyongde +* @date 2025-12-17 +**/ +public class PdmBdKilnRecordQuery extends BaseQuery { + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/impl/PdmBdKilnRecordServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/impl/PdmBdKilnRecordServiceImpl.java new file mode 100644 index 0000000..16df1a7 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/record/service/impl/PdmBdKilnRecordServiceImpl.java @@ -0,0 +1,197 @@ +package org.nl.wms.pdm.record.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.pdm.record.service.IPdmBdKilnRecordService; +import org.nl.wms.pdm.record.service.dao.mapper.PdmBdKilnRecordMapper; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** +* @description 服务实现 +* @author liyongde +* @date 2025-12-17 +**/ +@Slf4j +@Service +public class PdmBdKilnRecordServiceImpl extends ServiceImpl implements IPdmBdKilnRecordService { + + @Autowired + private PdmBdKilnRecordMapper pdmBdKilnRecordMapper; + @Resource + private ISchBasePointService pointService; + + @Override + public IPage queryAll(Map whereJson, PageQuery page){ + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + pdmBdKilnRecordMapper.selectPage(pages, lam); + return pages; + } + + @Override + public void create(PdmBdKilnRecord entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + entity.setRecord_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setCreate_time(now); + entity.setUpdate_time(now); + pdmBdKilnRecordMapper.insert(entity); + } + + @Override + public void update(PdmBdKilnRecord entity) { + PdmBdKilnRecord dto = pdmBdKilnRecordMapper.selectById(entity.getRecord_id()); + if (dto == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_time(now); + + pdmBdKilnRecordMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + pdmBdKilnRecordMapper.deleteBatchIds(ids); + } + + @Override + public void recordKilnInfo(SchBaseVehiclematerialgroup groupInfo, SchBasePoint basePoint) { + SchBasePoint device = pointService.getById(basePoint.getParent_point_code()); + PdmBdKilnRecord record = new PdmBdKilnRecord(); + record.setRecord_id(IdUtil.getSnowflake(1,1).nextIdStr()); + record.setVehicle_code(groupInfo.getVehicle_code()); + // 满托 + record.setVehicle_type("1"); + record.setInto_dry_kiln_time(DateUtil.now()); + record.setDry_code(device.getPoint_code()); + record.setDry_name(device.getPoint_name()); + record.setStatus("1"); + record.setCreate_time(DateUtil.now()); + record.setGroup_id(groupInfo.getGroup_id()); + pdmBdKilnRecordMapper.insert(record); + } + + @Override + public void recordEmptyKilnInfo(String vehicleCode, SchBasePoint basePoint) { + SchBasePoint device = pointService.getById(basePoint.getParent_point_code()); + PdmBdKilnRecord record = new PdmBdKilnRecord(); + record.setRecord_id(IdUtil.getSnowflake(1,1).nextIdStr()); + record.setVehicle_code(basePoint.getVehicle_code()); + // 空托 + record.setVehicle_code(vehicleCode); + record.setVehicle_type("2"); + record.setInto_dry_kiln_time(DateUtil.now()); + record.setDry_code(device.getPoint_code()); + record.setDry_name(device.getPoint_name()); + record.setStatus("1"); + record.setCreate_time(DateUtil.now()); + pdmBdKilnRecordMapper.insert(record); + } + + @Override + public void outDryKilnInfo(String vehicleCode) { + // 出干燥窑 + List kilnRecords = listByVehicleAndStatus(vehicleCode, Collections.singletonList("1")); + if (kilnRecords.size() == 0) { + throw new BadRequestException("记录不存在!"); + } + PdmBdKilnRecord record = kilnRecords.get(0); + if (ObjectUtil.isEmpty(record.getOut_dry_kiln_time())) { + record.setOut_dry_kiln_time(DateUtil.now()); + record.setUpdate_time(DateUtil.now()); + updateById(record); + } + } + + @Override + public void outDryKilnInfo(PdmBdKilnRecord record) { + if (ObjectUtil.isEmpty(record.getOut_dry_kiln_time())) { + record.setOut_dry_kiln_time(DateUtil.now()); + record.setUpdate_time(DateUtil.now()); + updateById(record); + } + } + + @Override + public List listByVehicleAndStatus(String vehicleCode, List status) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(PdmBdKilnRecord::getVehicle_code, vehicleCode) + .in(PdmBdKilnRecord::getStatus, status); + return list(lam); + } + + @Override + public PdmBdKilnRecord oneByVehicleAndStatus(String vehicleCode, String status) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(PdmBdKilnRecord::getVehicle_code, vehicleCode) + .eq(PdmBdKilnRecord::getStatus, status); + return getOne(lam); + } + + @Override + public void inCoolKilnInfo(String vehicleCode, SchBasePoint basePoint) { + SchBasePoint device = pointService.getById(basePoint.getParent_point_code()); + // 入冷却窑 + List kilnRecords = listByVehicleAndStatus(vehicleCode, Collections.singletonList("1")); + if (kilnRecords.size() == 0) { + throw new BadRequestException("记录不存在!"); + } + PdmBdKilnRecord record = kilnRecords.get(0); + if (ObjectUtil.isEmpty(record.getInto_cooling_kiln_time())) { + record.setInto_cooling_kiln_time(DateUtil.now()); + record.setCooling_code(device.getPoint_code()); + record.setCooling_name(device.getPoint_name()); + record.setUpdate_time(DateUtil.now()); + record.setStatus("2"); + updateById(record); + } + } + + @Override + public void outCoolEmptyKilnInfo(PdmBdKilnRecord record) { + if (ObjectUtil.isEmpty(record.getOut_cooling_kiln_time())) { + record.setOut_cooling_kiln_time(DateUtil.now()); + record.setUpdate_time(DateUtil.now()); + record.setStatus("3"); + updateById(record); + } + } + + @Override + public void outCoolKilnInfo(PdmBdKilnRecord record) { + record.setOut_cooling_kiln_time(DateUtil.now()); + record.setUpdate_time(DateUtil.now()); + updateById(record); + } + + @Override + public void outCoolStatusKilnInfo(PdmBdKilnRecord record) { + record.setUpdate_time(DateUtil.now()); + record.setStatus("3"); + updateById(record); + } + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/controller/PdmBdWorkorderController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/controller/PdmBdWorkorderController.java index da00e2a..51be359 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/controller/PdmBdWorkorderController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/controller/PdmBdWorkorderController.java @@ -64,6 +64,14 @@ public class PdmBdWorkorderController { return new ResponseEntity<>(TableDataInfo.build(mdBaseMaterialService.queryByInventory(whereJson, page)), HttpStatus.OK); } + + @GetMapping("/cooling") + @Log("查询物料基础信息") + //@SaCheckPermission("@el.check('mdBaseMaterial:list')") + public ResponseEntity queryCoolingMaterials(MdBaseMaterialQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(mdBaseMaterialService.queryCoolingMaterials(whereJson, page)), HttpStatus.OK); + } + @PostMapping @Log("新增工单管理") @SaIgnore diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java index 21eaaf6..25cfccb 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java @@ -118,7 +118,7 @@ public class PdmBdWorkorder implements Serializable { /** * 比例 */ - private Integer material_ratio; + private BigDecimal material_ratio; @TableField(exist = false) private String material_name; diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java index 0d49b18..c8944d5 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java @@ -46,6 +46,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -127,28 +128,47 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl inventoryCeil ? BigDecimal.valueOf(inventoryCeil) : BigDecimal.valueOf(ceil)); - entity.setPlan_weight(ceil > inventoryCeil ? BigDecimal.valueOf(inventoryQty) : BigDecimal.valueOf(residueNum)); // 对于分拣就是计划钢托盘上的砖数量 - entity.setProduce_order(entity.getOrder_no()); + // 计算一个托盘能放多少块砖 + BigDecimal multiply = new BigDecimal(TaskUtils.convertMultiply(entity.getPack_method())); + // 1 获取所需数(以库存为主) + BigDecimal totalNum; + // 1.1 工单指定数 + BigDecimal orderSubnum = entity.getPlan_weight(); + // 1.2 获取此物料在库存中有多少 + BigDecimal inventoryQty = new BigDecimal(vehiclematerialgroupService.getInventoryQtyByMaterialId(entity.getMaterial_id())); + // 1.3 获取两个的最小值 + totalNum = orderSubnum.min(inventoryQty); + // 2 计算需要多少木托 + // 2.1 计算半托数量 + List allQtys = vehiclematerialgroupService.getHalfCacheQty(entity.getMaterial_id()); + // 缓存可放多少数量 + BigDecimal btCanPutQty = BigDecimal.ZERO; + // 缓存要用多少托盘 + BigDecimal btTpPutQty = BigDecimal.ZERO; + for (BigDecimal allQty : allQtys) { + // 计算需要放多少 + BigDecimal needPut = multiply.subtract(allQty); + if (btCanPutQty.compareTo(totalNum) < 0) { + btCanPutQty.add(needPut); + btTpPutQty.add(BigDecimal.ONE); + } + } + if (btTpPutQty.compareTo(totalNum) >= 0) { + // 代表已经够了 + entity.setPlan_qty(btTpPutQty); + // 对于分拣就是计划钢托盘上的砖数量 + entity.setPlan_weight(totalNum); + return; + } + // 还需要空托盘 + BigDecimal needTotal = totalNum.subtract(btCanPutQty); + + // 计算需要多少木托 - 使用divide方法并指定舍入模式为向上取整 + int ceil = needTotal.divide(multiply, 0, RoundingMode.CEILING).intValue(); + entity.setPlan_qty(BigDecimal.valueOf(ceil)); + // 对于分拣就是计划钢托盘上的砖数量 + entity.setPlan_weight(needTotal); } - // 工单号和客户编码存放json - JSONObject res = new JSONObject(); - res.put("order_no", entity.getOrder_no()); - res.put("custer_no", entity.getCuster_no()); - entity.setExt_data(res.toJSONString()); } @Override @@ -361,12 +381,12 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl getHalfCacheQty(String materialId); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.java index c0fb8db..ec524bc 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.java @@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; import org.nl.wms.sch.group.service.dto.SchBaseVehiclematerialgroupQuery; +import java.math.BigDecimal; +import java.util.List; + /** * @author lyd * @date 2023-05-16 @@ -25,4 +28,6 @@ public interface SchBaseVehiclematerialgroupMapper extends BaseMapper getHalfCacheQty(String materialId); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.xml index ffa4677..b37e197 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/mapper/SchBaseVehiclematerialgroupMapper.xml @@ -81,4 +81,15 @@ ORDER BY vg.group_bind_material_status, vg.update_time DESC LIMIT 1 + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java index 1621058..e90d113 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java @@ -119,7 +119,7 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl selectOne = vehiclematerialgroupMapper.selectList(lambda); + List selectOne = list(lambda); return selectOne.size() > 0 ? selectOne.get(0) : null; } @@ -233,4 +233,9 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl 0 ? selectOne.get(0) : null; } + @Override + public List getHalfCacheQty(String materialId) { + return vehiclematerialgroupMapper.getHalfCacheQty(materialId); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java index bd98d61..d4a9009 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java @@ -158,4 +158,6 @@ public class SchBasePoint implements Serializable { private String raw_material_code; @TableField(exist = false) private String task_warn; + @TableField(exist = false) + private SchBasePoint flagPoint; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml index 54337c4..698cbd3 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml @@ -41,7 +41,7 @@ AND vg.vehicle_type = p.vehicle_type AND vg.group_bind_material_status = '2' LEFT JOIN md_base_material mm ON mm.material_id = vg.material_id - + p.workshop_code = #{whereJson.workshop_code} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java index 0edd2eb..5146202 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java @@ -83,6 +83,10 @@ public class GeneralDefinition { * 对接位 */ public static final String DOCKING_POINT = "2"; + /** + * 物料位 + */ + public static final String MATERIAL_POINT = "2"; /** * 检测位 */ @@ -131,6 +135,7 @@ public class GeneralDefinition { * 干燥窑区域 */ public static final String GZY = "GZY"; + public static final String LQY = "LQY"; // 特殊: 1-缓存输送线入口,2-缓存输送线出口,3-上输送线,4-下输送线 /** * 上输送线 diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/common/MoveTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/common/MoveTask.java new file mode 100644 index 0000000..b4b932f --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/common/MoveTask.java @@ -0,0 +1,178 @@ +package org.nl.wms.sch.task_manage.task.tasks.common; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; +import org.nl.wms.pdm.track.service.IPdmBdProductionProcessTrackingService; +import org.nl.wms.pdm.track.service.dao.PdmBdProductionProcessTracking; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 转运任务 + * @Author: lyd + * @Date: 2025/12/22 + */ +@Component("MoveTask") +public class MoveTask extends AbstractTask { + private static final String TASK_CONFIG_CODE = "MoveTask"; + @Resource + private ISchBaseTaskService taskService; + @Resource + private ISchBasePointService pointService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private IPdmBdProductionProcessTrackingService processTrackingService; + @Override + public void create() throws BadRequestException { + + } + + @Override + public void createCompletion(SchBaseTask task) { + JSONObject req = JSONObject.parseObject(task.getRequest_param()); + task.setPoint_code2(req.getString("target")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + TaskUtils.setUpdateByAcs(task); + taskService.save(task); + } + + @Override + public String setGroupPlate(JSONObject param) { + return param.getString("group_id"); + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 载具编码:前面需要根据任务判断,没有载具不能生成任务 + String vehicle_code = taskObj.getVehicle_code(); + String vehicleType = taskObj.getVehicle_type(); + if (vehicleType == null || vehicleType.equals(GeneralDefinition.NO)) { + vehicleType = GeneralDefinition.STEEL_TRAY; + } + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + // 修改组盘信息 + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicle_code) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, + GroupBindMaterialStatusEnum.BOUND.getValue())); + if (ObjectUtil.isEmpty(one)) { + throw new BadRequestException(vehicle_code + " => " + vehicleType + "的组盘信息未找到"); + } + one.setTask_code(taskObj.getTask_code()); + one.setPoint_code(endPointObj.getPoint_code()); + one.setPoint_name(endPointObj.getPoint_name()); + one.setMove_way(one.getMove_way() + " -> " + endPointObj.getPoint_code()); + TaskUtils.setGroupUpdateByType(one, taskFinishedType); + vehiclematerialgroupService.updateById(one); + // 插入生产过程跟踪表 + PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); + processTracking.setBuss_move_id(one.getBuss_move_id()); + processTracking.setProcess_action("出中转进入缓存"); + processTracking.setProcess_location(endPoint); + processTracking.setRecord_time(DateUtil.now()); + processTrackingService.create(processTracking); + // 记录库存并解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(vehicle_code); + endPointObj.setVehicle_type(vehicleType); + endPointObj.setVehicle_qty(1); + endPointObj.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java index e518b4b..5fe39b8 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java @@ -230,7 +230,7 @@ public class FJQLTask extends AbstractTask { PointUtils.setUpdateByType(startPointObj, taskFinishedType); PointUtils.clearPoint(startPointObj); SchBaseVehiclematerialgroup vehicleMaterialGroupObj = - vehiclematerialgroupService.getById(taskObj.getGroup_id()); + vehiclematerialgroupService.getById(taskObj.getGroup_id()); // 等到变成空盘才能解除 vehicleMaterialGroupObj.setPoint_code(endPointObj.getPoint_code()); vehicleMaterialGroupObj.setPoint_name(endPointObj.getPoint_name()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/CYZCTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/CYZCTask.java index 27109af..fd02790 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/CYZCTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/CYZCTask.java @@ -7,9 +7,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; 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.mes.service.WmsToMesService; +import org.nl.wms.pdm.record.service.IPdmBdKilnRecordService; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; import org.nl.wms.pdm.track.service.IPdmBdProductionProcessTrackingService; import org.nl.wms.pdm.track.service.dao.PdmBdProductionProcessTracking; +import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; import org.nl.wms.sch.point.service.ISchBasePointService; @@ -26,6 +32,7 @@ import org.nl.wms.sch.task_manage.enums.PointStatusEnum; import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.task.TaskType; import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.yao.mapper.GZYMapper; import org.nl.wms.util.PointUtils; import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -46,6 +53,7 @@ import java.util.stream.Collectors; @TaskType("GZYMLTask") public class CYZCTask extends AbstractTask { private static final String TASK_CONFIG_CODE = "GZYMLTask"; + private static final String COOL_KILN_MAX = "COOL_KILN_MAX"; @Autowired private ISchBasePointService pointService; @Autowired @@ -61,6 +69,14 @@ public class CYZCTask extends AbstractTask { private IPdmBdProductionProcessTrackingService processTrackingService; @Autowired private WmsToMesService wmsToMesService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISysParamService paramService; + @Autowired + private IPdmBdKilnRecordService kilnRecordService; + @Autowired + private GZYMapper gzyMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -133,19 +149,36 @@ public class CYZCTask extends AbstractTask { @Override public String setGroupPlate(JSONObject param) { - // 查找组盘表信息,不做修改 + String res = ""; + // 查找组盘表信息 String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code")); String vehicleType = GeneralDefinition.STEEL_TRAY; if (ObjectUtil.isEmpty(vehicleCode)) { throw new BadRequestException("载具号不能为空"); } - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getGroupInfo(vehicleCode, - vehicleType, GroupBindMaterialStatusEnum.BOUND.getValue()); - if (ObjectUtil.isNotEmpty(one.getOut_kiln_time())) { - throw new BadRequestException("托盘[" + vehicleCode + "]已经出窑"); + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(vehicleCode, "1"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); } - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException("载具号[" + vehicleCode + "]的组盘信息不存在"); + if ("1".equals(record.getVehicle_type())) { + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getGroupInfo(vehicleCode, + vehicleType, GroupBindMaterialStatusEnum.BOUND.getValue()); + if (ObjectUtil.isNotEmpty(one.getOut_kiln_time())) { + throw new BadRequestException("托盘[" + vehicleCode + "]已经出窑"); + } + if (ObjectUtil.isEmpty(one)) { + throw new BadRequestException("载具号[" + vehicleCode + "]的组盘信息不存在"); + } + String deviceCode = param.getString("device_code"); + SchBasePoint basePoint = pointService.getById(deviceCode); + one.setPoint_code(basePoint.getPoint_code()); + one.setPoint_name(basePoint.getPoint_name()); + one.setMove_way(one.getMove_way() + " -> " + basePoint.getPoint_code()); + one.setIs_firing(true); + one.setOut_kiln_time(DateUtil.now()); + TaskUtils.setGroupUpdateByPC(one); + vehiclematerialgroupService.updateById(one); + res = one.getGroup_id(); } List list = taskService.list(new LambdaQueryWrapper() .eq(SchBaseTask::getVehicle_code, vehicleCode) @@ -153,28 +186,70 @@ public class CYZCTask extends AbstractTask { if (list.size() > 0) { throw new BadRequestException("已经存在相同托盘号[" + vehicleCode + "]的任务!"); } - return one.getGroup_id(); + kilnRecordService.outDryKilnInfo(record); + return res; } /** - * 找终点:到钢托盘缓存区中获取一个空位 + * 找终点:创建入冷却窑的任务 + * 根据相同物料最多的窑优先, 如果是加急,则去3号窑 + * todo: opt * * @param nextRegionStr * @param extData * @return */ - private SchBasePoint findNextPoint(List nextRegionStr, JSONObject extData) { + public SchBasePoint findNextPoint(List nextRegionStr, JSONObject extData) { + SchBaseVehiclematerialgroup vehilceCode = vehiclematerialgroupService.getGroupInfo(extData.getString("vehicle_code"), GeneralDefinition.STEEL_TRAY, "2"); + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(extData.getString("vehicle_code"), "1"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); + } + if ("1".equals(record.getVehicle_type())) { + if (ObjectUtil.isEmpty(vehilceCode)) { + throw new BadRequestException("托盘号不能为空!"); + } + PdmBdWorkorder order = workorderService.getByCode(vehilceCode.getWorkorder_code()); + if (order.getIs_urgent()) { + // 加急,直接去3号窑 + return pointService.getById("LQYRK03"); + } + } LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); lam.in(SchBasePoint::getRegion_code, nextRegionStr) .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .eq(SchBasePoint::getPoint_type, GeneralDefinition.ENTRANCE) + .ne(SchBasePoint::getPoint_code, "LQYRK03") // 当前执行的任务为空或者NULL,有数据表示锁住 .and(la -> la.isNull(SchBasePoint::getIng_task_code) .or() .eq(SchBasePoint::getIng_task_code, "")) - .eq(SchBasePoint::getIs_used, true) - .ne(SchBasePoint::getLayer_num, "3") - .orderByAsc(SchBasePoint::getIn_order_seq); + .eq(SchBasePoint::getIs_used, true); List schBasePoints = pointService.list(lam); + // 过滤窑内现有的托盘数不超过设定值 + Param param = paramService.findByCode(COOL_KILN_MAX); + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("未配置冷却窑最大托盘数!"); + } + List collect = schBasePoints.stream().filter(p -> { + int count = kilnRecordService.count(new LambdaQueryWrapper() + .eq(PdmBdKilnRecord::getCooling_code, p.getPoint_code()) + .eq(PdmBdKilnRecord::getStatus, "2")); + // 加上任务数 + int taskNum = taskService.count(new LambdaQueryWrapper() + .eq(SchBaseTask::getPoint_code2, p.getPoint_code()) + .eq(SchBaseTask::getIs_delete, false) + .lt(SchBaseTask::getTask_status, "5")); + return (count + taskNum) < Integer.parseInt(param.getValue()); + }).collect(Collectors.toList()); + if (collect.size() == 0) { + return null; + } + if (collect.size() == 1) { + return collect.get(0); + } + // 两个都没超过,todo: 获取相同物料最多的 + schBasePoints = gzyMapper.getPointByML(nextRegionStr.get(0)); return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; } @@ -199,7 +274,7 @@ public class CYZCTask extends AbstractTask { if (status.equals(TaskStatus.FINISHED)) { this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); // todo 出窑上报出窑记录 - wmsToMesService.reportGdyMaterialInfoOut(taskObj.getGroup_id()); +// wmsToMesService.reportGdyMaterialInfoOut(taskObj.getGroup_id()); } if (status.equals(TaskStatus.CANCELED)) { this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); @@ -237,37 +312,39 @@ public class CYZCTask extends AbstractTask { SchBasePoint endPointObj = pointService.getById(endPoint); // 终点解锁 if (ObjectUtil.isNotEmpty(endPointObj)) { - // 修改组盘信息 - 设置已烧制 - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicle_code) - .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) - .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, - GroupBindMaterialStatusEnum.BOUND.getValue())); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException(vehicle_code + " => " + vehicleType + "的组盘信息未找到"); + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(vehicle_code, "1"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); + } + // 满托 + if ("1".equals(record.getVehicle_type())) { + // 修改组盘信息 - 设置已烧制 + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicle_code) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, + GroupBindMaterialStatusEnum.BOUND.getValue())); + if (ObjectUtil.isEmpty(one)) { + throw new BadRequestException(vehicle_code + " => " + vehicleType + "的组盘信息未找到"); + } + one.setTask_code(taskObj.getTask_code()); + one.setPoint_code(endPointObj.getPoint_code()); + one.setPoint_name(endPointObj.getPoint_name()); + one.setMove_way(one.getMove_way() + " -> " + endPointObj.getPoint_code()); + TaskUtils.setGroupUpdateByType(one, taskFinishedType); + vehiclematerialgroupService.updateById(one); + // 插入生产过程跟踪表 + PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); + processTracking.setBuss_move_id(one.getBuss_move_id()); + processTracking.setProcess_action("出窑进入冷却窑"); + processTracking.setProcess_location(endPoint); + processTracking.setRecord_time(DateUtil.now()); + processTrackingService.create(processTracking); } - one.setTask_code(taskObj.getTask_code()); - one.setPoint_code(endPointObj.getPoint_code()); - one.setPoint_name(endPointObj.getPoint_name()); - one.setMove_way(one.getMove_way() + " -> " + endPointObj.getPoint_code()); - one.setIs_firing(true); - one.setOut_kiln_time(DateUtil.now()); - TaskUtils.setGroupUpdateByType(one, taskFinishedType); - vehiclematerialgroupService.updateById(one); - // 插入生产过程跟踪表 - PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); - processTracking.setBuss_move_id(one.getBuss_move_id()); - processTracking.setProcess_action("出窑到钢托盘缓存位"); - processTracking.setProcess_location(endPoint); - processTracking.setRecord_time(DateUtil.now()); - processTrackingService.create(processTracking); + kilnRecordService.inCoolKilnInfo(vehicle_code, endPointObj); // 记录库存并解锁 endPointObj.setIng_task_code(""); - endPointObj.setVehicle_code(vehicle_code); - endPointObj.setVehicle_qty(1); - endPointObj.setVehicle_type(vehicleType); - endPointObj.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); PointUtils.setUpdateByType(endPointObj, taskFinishedType); pointService.updateById(endPointObj); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQKTask.java new file mode 100644 index 0000000..113161b --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQKTask.java @@ -0,0 +1,218 @@ +package org.nl.wms.sch.task_manage.task.tasks.yao; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 干燥窑缺空 + * @Author: lyd + * @Date: 2025/12/17 + */ +@Slf4j +@Component(value = "GZYQKTask") +public class GZYQKTask extends AbstractTask { + private static final String TASK_CONFIG_CODE = "GZYQKTask"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + TaskUtils.setUpdateByAcs(task); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + // 消息通知 + noticeService.createNotice("未找到所需点位!", TASK_CONFIG_CODE + task.getPoint_code2(), + NoticeTypeEnum.WARN.getCode()); + throw new BadRequestException("未找到所需点位!"); + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setRemark(""); + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create() { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + TaskUtils.setUpdateByAcs(task); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.updateById(task); + // 消息通知 + noticeService.createNotice("未找到所需点位!", TASK_CONFIG_CODE + task.getTask_code(), + NoticeTypeEnum.WARN.getCode()); + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setRemark(""); + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.updateById(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + } + + /** + * 业务过程:到指定的区域获取空托盘 + * + * @param startRegionStr + * @param requestParam + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject requestParam) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + // 默认一直都有载具 + lam.in(SchBasePoint::getRegion_code, startRegionStr) + // 点位类型是拆盘机出口 + .eq(SchBasePoint::getPoint_type, GeneralDefinition.DOCKING_POINT) + // 当前执行的任务为空或者NULL,有数据表示锁住 + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); + SchBasePoint startPointObj = pointService.selectByIdLock(startPoint); + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + startPointObj.setIng_task_code(""); + pointService.updateById(startPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); + SchBasePoint startPointObj = pointService.getById(startPoint); + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + pointService.updateById(startPointObj); + } + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQLTask.java index e75be6f..2cf81e7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/GZYQLTask.java @@ -20,6 +20,7 @@ import org.nl.wms.sch.task_manage.enums.PointStatusEnum; import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.task.TaskType; import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.yao.mapper.GZYMapper; import org.nl.wms.sch.task_manage.task.tasks.yz.mapper.YZMapper; import org.nl.wms.util.PointUtils; import org.nl.wms.util.TaskUtils; @@ -52,7 +53,7 @@ public class GZYQLTask extends AbstractTask { @Autowired private ISysNoticeService noticeService; @Autowired - private YZMapper yzMapper; + private GZYMapper gzyMapper; @Override public void create() throws BadRequestException { @@ -88,9 +89,6 @@ public class GZYQLTask extends AbstractTask { point.setIng_task_code(task.getTask_code()); PointUtils.setUpdateByAcs(point); pointService.updateById(point); - - //下发 - //this.renotifyAcs(task); } } @@ -127,32 +125,28 @@ public class GZYQLTask extends AbstractTask { } /** - * 找到有货最多的那层搬运到入窑口 + * 将货架上未烧制的物料搬运到入窑口 * * @param startRegionStr * @param jsonObject * @return */ private SchBasePoint findStartPoint(List startRegionStr, JSONObject jsonObject) { - // 无需工单 - // 如果一个有货一个没货,但是载具数量又是5的时候,就要不需要检测不能为5 - LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); - lam.in(SchBasePoint::getRegion_code, startRegionStr) - // 点位类型是缓存输送线出口 - .eq(SchBasePoint::getPoint_type, GeneralDefinition.EXIT) - // 当前执行的任务为空或者NULL,有数据表示锁住 - .and(la -> la.isNull(SchBasePoint::getIng_task_code) - .or() - .eq(SchBasePoint::getIng_task_code, "")) - .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) - .eq(SchBasePoint::getIs_used, true); - List list = pointService.list(lam); - // 如果只有一条符合的数据就不需要检验不符合5个托 - boolean doDetection = list.size() != 1; - // 默认认为缓存线有东西 - // 每次都将载具数量+1,每次拿最大的 - lam.ne(doDetection, SchBasePoint::getVehicle_qty, 5).orderByDesc(SchBasePoint::getVehicle_qty); - List schBasePoints = pointService.list(lam); + // 顺序:加急、时间顺序 + List schBasePoints = gzyMapper.getPointByQL(startRegionStr); + if (schBasePoints.size() == 0) { + // 无需工单 + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getPoint_type, GeneralDefinition.MATERIAL_POINT) + // 当前执行的任务为空或者NULL,有数据表示锁住 + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.FULL_POINT.getCode()) + .eq(SchBasePoint::getIs_used, true); + schBasePoints = pointService.list(lam); + } return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/LQYMLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/LQYMLTask.java new file mode 100644 index 0000000..4388ad8 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/LQYMLTask.java @@ -0,0 +1,383 @@ +package org.nl.wms.sch.task_manage.task.tasks.yao; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.param.ISysParamService; +import org.nl.wms.ext.mes.service.WmsToMesService; +import org.nl.wms.pdm.record.service.IPdmBdKilnRecordService; +import org.nl.wms.pdm.record.service.dao.PdmBdKilnRecord; +import org.nl.wms.pdm.track.service.IPdmBdProductionProcessTrackingService; +import org.nl.wms.pdm.track.service.dao.PdmBdProductionProcessTracking; +import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.common.MoveTask; +import org.nl.wms.sch.task_manage.task.tasks.yao.mapper.GZYMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 冷却窑满料任务 + * @Author: lyd + * @Date: 2025/12/18 + */ +@Slf4j +@Component(value = "LQYMLTask") +public class LQYMLTask extends AbstractTask { + private static final String TASK_CONFIG_CODE = "LQYMLTask"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + + @Autowired + private ISysNoticeService noticeService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private IPdmBdProductionProcessTrackingService processTrackingService; + @Autowired + private WmsToMesService wmsToMesService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISysParamService paramService; + @Autowired + private IPdmBdKilnRecordService kilnRecordService; + @Autowired + private GZYMapper gzyMapper; + @Autowired + private MoveTask moveTask; + + @Override + @Transactional(rollbackFor = Exception.class) + public void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")).collect(Collectors.toList()); + // 找终点 + String extGroupData = task.getExt_group_data(); + JSONObject jsonObject = JSONObject.parseObject(extGroupData); + SchBasePoint point = findNextPoint(jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到钢托盘缓存区域空位!"); + taskService.updateById(task); + // 消息通知 + noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getTask_code(), + NoticeTypeEnum.WARN.getCode()); + continue; + } + // 设置终点并修改创建成功状态 + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + TaskUtils.setUpdateByAcs(task); + taskService.updateById(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createCompletion(SchBaseTask task) { + // 找终点 + String extGroupData = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(extGroupData); + SchBaseVehiclematerialgroup vehicleObj = vehiclematerialgroupService.getGroupInfo(task.getVehicle_code(), GeneralDefinition.STEEL_TRAY, "2"); + if (ObjectUtil.isEmpty(vehicleObj)) { + throw new BadRequestException(task.getVehicle_code() + "组盘信息不存在!"); + } + jsonObject.put("vehicleObj", vehicleObj); + // 标记是否呼叫AGV中转 + jsonObject.put("flag", "0"); + SchBasePoint point = findNextPoint(jsonObject); + if (ObjectUtil.isEmpty(point)) { + // 消息通知 + noticeService.createNotice("未找到钢托盘缓存区域空位!", TASK_CONFIG_CODE + task.getPoint_code1(), + NoticeTypeEnum.WARN.getCode()); + throw new BadRequestException("未找到钢托盘缓存区域空位!"); + } + // 设置组盘 - 需要的话由子类自行实现 + task.setGroup_id(setGroupPlate(jsonObject)); + // 设置终点并修改创建成功状态 + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + if ("1".equals(point.getTask_warn())) { + // 提前分配的货位需要锁住 + SchBasePoint flagPoint = point.getFlagPoint(); + flagPoint.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(flagPoint); + pointService.updateById(flagPoint); + jsonObject.put("flag", "1"); + jsonObject.put("target", flagPoint.getPoint_code()); + jsonObject.put("vehicleObj", "-"); + task.setPoint_code3(flagPoint.getPoint_code()); + task.setRequest_param(JSONObject.toJSONString(jsonObject)); + } + task.setRemark(""); + TaskUtils.setUpdateByAcs(task); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + @Override + public String setGroupPlate(JSONObject param) { + String res = ""; + // 查找组盘表信息 + String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code")); + String vehicleType = GeneralDefinition.STEEL_TRAY; + if (ObjectUtil.isEmpty(vehicleCode)) { + throw new BadRequestException("载具号不能为空"); + } + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(vehicleCode, "2"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); + } + if ("1".equals(record.getVehicle_type())) { + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getGroupInfo(vehicleCode, + vehicleType, GroupBindMaterialStatusEnum.BOUND.getValue()); + if (ObjectUtil.isEmpty(one)) { + throw new BadRequestException("载具号[" + vehicleCode + "]的组盘信息不存在"); + } + String deviceCode = param.getString("device_code"); + SchBasePoint basePoint = pointService.getById(deviceCode); + one.setPoint_code(basePoint.getPoint_code()); + one.setPoint_name(basePoint.getPoint_name()); + one.setMove_way(one.getMove_way() + " -> " + basePoint.getPoint_code()); + one.setIs_firing(true); + one.setOut_kiln_time(DateUtil.now()); + TaskUtils.setGroupUpdateByPC(one); + vehiclematerialgroupService.updateById(one); + res = one.getGroup_id(); + } + List list = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getVehicle_code, vehicleCode) + .lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())); + if (list.size() > 0) { + throw new BadRequestException("已经存在相同托盘号[" + vehicleCode + "]的任务!"); + } + kilnRecordService.outCoolKilnInfo(record); + return res; + } + + /** + * 找终点 + * 先判断人工还是自动,人工则去3号窑 + * 如果与分拣工单的物料一样,则分配到双层缓存线/拆垛位;分配到钢托缓存库; + * + * @param extData + * @return + */ + public SchBasePoint findNextPoint(JSONObject extData) { + SchBaseVehiclematerialgroup vehicleObj = JSONObject + .parseObject(JSON.toJSONString(extData.getJSONObject("vehicleObj")), SchBaseVehiclematerialgroup.class); + PdmBdWorkorder order = workorderService.getByCode(vehicleObj.getWorkorder_code()); + // 如果工单是自动,则去3号冷却窑(从出口进) + if ("2".equals(order.getWorkorder_type())) { + // todo: 判断窑内数量是否满了 + return pointService.getById("LQYCK03"); + } + // 判断双层输送线和钢托缓存库有没有相同物料 + List list = gzyMapper.getPointTheSameMaterial(vehicleObj.getMaterial_id()); + List useList = new ArrayList<>(); + if (list.size() == 0) { + // 分配一个到对应分拣工单的空位置。 + useList = gzyMapper.getSortingEmptyPoint(vehicleObj.getMaterial_id()); + } + if (useList.size() == 0) { + // 分配一个双层输送线的一层货位 + useList = gzyMapper.getOneLayerConveyor(vehicleObj.getMaterial_id()); + if (useList.size() == 0) { + // 分配钢托盘缓存库 + useList = gzyMapper.getSteelLib(); + } + } + if (useList.size() == 0) { + return null; + } + SchBasePoint basePoint = useList.get(0); + if ("GTPHC".equals(basePoint.getRegion_code())) { + // 获取中转位(默认中转位不为空且均可用) + SchBasePoint hcssx = pointService.getOne(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, "HCSSX") + .eq(SchBasePoint::getPoint_type, "3"), false); + hcssx.setTask_warn("1"); + hcssx.setFlagPoint(basePoint); + return hcssx; + } + return basePoint; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + // todo 出窑上报出窑记录 +// wmsToMesService.reportGdyMaterialInfoOut(taskObj.getGroup_id()); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 载具编码:前面需要根据任务判断,没有载具不能生成任务 + String vehicle_code = taskObj.getVehicle_code(); + String vehicleType = taskObj.getVehicle_type(); + if (vehicleType == null || vehicleType.equals(GeneralDefinition.NO)) { + vehicleType = GeneralDefinition.STEEL_TRAY; + } + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + PdmBdKilnRecord record = kilnRecordService.oneByVehicleAndStatus(vehicle_code, "2"); + if (ObjectUtil.isEmpty(record)) { + throw new BadRequestException("入窑记录不存在!"); + } + // 修改组盘信息 + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicle_code) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, + GroupBindMaterialStatusEnum.BOUND.getValue())); + if (ObjectUtil.isEmpty(one)) { + throw new BadRequestException(vehicle_code + " => " + vehicleType + "的组盘信息未找到"); + } + one.setTask_code(taskObj.getTask_code()); + one.setPoint_code(endPointObj.getPoint_code()); + one.setPoint_name(endPointObj.getPoint_name()); + one.setMove_way(one.getMove_way() + " -> " + endPointObj.getPoint_code()); + TaskUtils.setGroupUpdateByType(one, taskFinishedType); + vehiclematerialgroupService.updateById(one); + // 插入生产过程跟踪表 + PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); + processTracking.setBuss_move_id(one.getBuss_move_id()); + processTracking.setProcess_action("出冷却窑进入缓存"); + processTracking.setProcess_location(endPoint); + processTracking.setRecord_time(DateUtil.now()); + processTrackingService.create(processTracking); + // 记录出冷却窑 + kilnRecordService.outCoolStatusKilnInfo(record); + // 记录库存并解锁 + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + + // 判断是否转运 + JSONObject reqObj = JSONObject.parseObject(taskObj.getRequest_param()); + String flag = reqObj.getString("flag"); + if (ObjectUtil.isNotEmpty(flag) && "1".equals(flag)) { + // 创建AGV任务 + JSONObject param = new JSONObject(); + param.put("device_code", taskObj.getPoint_code2()); + param.put("target", taskObj.getPoint_code3()); + param.put("vehicle_code", taskObj.getVehicle_code()); + param.put("vehicle_type", taskObj.getVehicle_type()); + param.put("config_code", "MoveTask"); + param.put("group_id", one.getGroup_id()); + moveTask.apply(param); + } + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.java new file mode 100644 index 0000000..64f34bc --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.java @@ -0,0 +1,35 @@ +package org.nl.wms.sch.task_manage.task.tasks.yao.mapper; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.wms.sch.point.service.dao.SchBasePoint; + +import java.util.List; + +/** + * @Author: lyd + * @Date: 2025/12/17 + */ +public interface GZYMapper extends BaseMapper { + List getPointByQL(List regionCode); + + List getPointByML(String regionCode); + + List getPointTheSameMaterial(String materialId); + + /** + * 获取分拣存在工单,且物料符合的点位数据 + * @param materialId + * @return + */ + List getSortingEmptyPoint(String materialId); + + /** + * 获取一层双层输送线的空点位,有对应工单物料的情况下才有数据 + * @param materialId 物料id + * @return + */ + List getOneLayerConveyor(String materialId); + + List getSteelLib(); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.xml new file mode 100644 index 0000000..1338157 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yao/mapper/GZYMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java index ae17f44..e10bf7c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java @@ -70,6 +70,7 @@ public class YZQKTask extends AbstractTask { // 设置终点并修改创建成功状态 task.setPoint_code1(point.getPoint_code()); task.setRemark(""); + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); task.setTask_status(TaskStatus.CREATED.getCode()); taskService.save(task); @@ -105,6 +106,7 @@ public class YZQKTask extends AbstractTask { // 设置终点并修改创建成功状态 task.setPoint_code1(point.getPoint_code()); task.setRemark(""); + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); task.setTask_status(TaskStatus.CREATED.getCode()); taskService.updateById(task); @@ -129,7 +131,7 @@ public class YZQKTask extends AbstractTask { // 默认一直都有载具 lam.in(SchBasePoint::getRegion_code, startRegionStr) // 点位类型是拆盘机出口 - .eq(SchBasePoint::getPoint_type, GeneralDefinition.EXIT) + .eq(SchBasePoint::getPoint_type, GeneralDefinition.DOCKING_POINT) // 当前执行的任务为空或者NULL,有数据表示锁住 .and(la -> la.isNull(SchBasePoint::getIng_task_code) .or() diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java index 96ad618..f25feaf 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java @@ -1,171 +1,268 @@ -//package org.nl.wms.sch.task_manage.task.tasks.yz; -// -//import cn.hutool.core.lang.Assert; -//import cn.hutool.core.util.ObjectUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.common.exception.BadRequestException; -//import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; -//import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; -//import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -//import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -//import org.nl.wms.sch.point.service.ISchBasePointService; -//import org.nl.wms.sch.point.service.dao.SchBasePoint; -//import org.nl.wms.sch.task.service.ISchBaseTaskService; -//import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -//import org.nl.wms.sch.task.service.dao.SchBaseTask; -//import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -//import org.nl.wms.sch.task_manage.AbstractTask; -//import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -//import org.nl.wms.sch.task_manage.task.TaskType; -//import org.nl.wms.sch.task_manage.task.core.TaskStatus; -//import org.nl.wms.sch.task_manage.task.tasks.yz.mapper.YZMapper; -//import org.nl.wms.util.PointUtils; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Component; -// -//import java.util.Arrays; -//import java.util.List; -//import java.util.stream.Collectors; -// -///** -// * @Author: lyd -// * @Description: 压制缺料任务 -// * @Date: 2023/5/25 -// */ -//@Slf4j -//@Deprecated -//@Component -//@TaskType("-") -//public class YZQLTask extends AbstractTask { -// private static String TASK_CONFIG_CODE = "-"; -// -// @Autowired -// private ISchBasePointService pointService; -// @Autowired -// private ISchBaseTaskService taskService; -// @Autowired -// private ISchBaseTaskconfigService taskConfigService; -// @Autowired -// private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; -// @Autowired -// private IPdmBdWorkorderService workorderService; -// @Autowired -// private YZMapper yzMapper; -// -// @Override -// public void create() throws BadRequestException { -// // 获取任务 -// List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); -// // 配置信息 -// SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() -// .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); -// for (SchBaseTask task : tasks) { -// List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")).collect(Collectors.toList()); -// // 找起点 -// String extGroupData = task.getExt_group_data(); -// JSONObject jsonObject = JSONObject.parseObject(extGroupData); -// jsonObject.put("vehicle_type", task.getVehicle_type()); -// SchBasePoint point = findStartPoint(startRegionStr, jsonObject); -// if (ObjectUtil.isEmpty(point)) { -// task.setRemark("未找到所需点位!"); -// taskService.update(task); -// // 消息通知 -// continue; -// } -// // 设置起点并修改创建成功状态 -// task.setPoint_code1(point.getPoint_code()); -// task.setTask_status(TaskStatus.CREATED.getCode()); -// task.setVehicle_code(point.getVehicle_code()); -// taskService.update(task); -// -// point.setIng_task_code(task.getTask_code()); -// pointService.update(point); -// -// //下发 -//// this.renotifyAcs(task); -// } -// } -// -// /** -// * 找起点业务:混碾机工单的物料标识相同的位置 -// * -// * @param startRegionStr : 区域列表 -// * @param extGroupData : 外部参数,包含条件所需的信息 -// * @return -// * @description : JSONObject获取不到就是null -// */ -// private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { -// // 获取当前工单 -// String workorderCode = extGroupData.getString("workorder_code"); -// PdmBdWorkorder workOrder = ObjectUtil.isNotEmpty(workorderCode) -// ? workorderService.getOne(new LambdaQueryWrapper() -// .eq(PdmBdWorkorder::getWorkorder_code, workorderCode)) -// : null; -// Assert.notNull(workOrder, "工单不能为空!"); -// // 查找混碾机工单的物料相同的位置 -// List points = yzMapper.findPointForYZQL(startRegionStr, workOrder.getMaterial_id()); -// return ObjectUtil.isNotEmpty(points) ? points.get(0) : null; -// } -// -// -// @Override -// protected void updateStatus(String task_code, TaskStatus status) { -// // 校验任务 -// SchBaseTask taskObj = taskService.getByCode(task_code); -// if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { -// throw new BadRequestException("该任务已完成!"); -// } -// if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { -// throw new BadRequestException("该任务已取消!"); -// } -// // 获取参数 -// String startPoint = taskObj.getPoint_code1(); // 起点 -// JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) -// ? JSONObject.parseObject(taskObj.getExt_group_data()) -// : null; -// SchBasePoint startPointObj = pointService.getById(startPoint); -// // 根据传来的类型去对任务进行操作 -// if (status.equals(TaskStatus.EXECUTING)) { -// taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); -// taskObj.setRemark("执行中"); -// } -// if (status.equals(TaskStatus.FINISHED)) { -// // 任务上有载具编码 -> 获取当前载具编码的组盘信息 -// SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() -// .eq(SchBaseVehiclematerialgroup::getVehicle_code, taskObj.getVehicle_code()) -// .eq(SchBaseVehiclematerialgroup::getVehicle_type, taskObj.getVehicle_type()) -// .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, GroupBindMaterialStatusEnum.BOUND.getValue())); -// // 将载具设置为已解绑 -// one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); -// vehiclematerialgroupService.update(one); -// // 释放点位,将点位设置为空位,清空数据 -// if (ObjectUtil.isNotEmpty(startPointObj)) { -// PointUtils.clearPoint(startPointObj); -// // todo: 终点暂时无设置 -// } -// // 任务修改成完成 -// taskObj.setTask_status(TaskStatus.FINISHED.getCode()); -// } -// if (status.equals(TaskStatus.CANCELED)) { -// taskObj.setTask_status(TaskStatus.CANCELED.getCode()); -// // 释放点位,起点正在执行的任务清空 -// if (ObjectUtil.isNotEmpty(startPointObj)) { -// startPointObj.setIng_task_code(""); -// pointService.update(startPointObj); -// } -// } -// taskService.update(taskObj); -// } -// -// @Override -// public void forceFinish(String task_code) { -// this.updateStatus(task_code, TaskStatus.FINISHED); -// } -// -// @Override -// public void cancel(String task_code) { -// this.updateStatus(task_code, TaskStatus.CANCELED); -// } -//} +package org.nl.wms.sch.task_manage.task.tasks.yz; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.database.material.service.dao.MdBaseMaterial; +import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.yz.mapper.YZMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 压制缺料任务 + * @Date: 2023/5/25 + */ +@Slf4j +@Component("YZQLTask") +public class YZQLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "YZQLTask"; + + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private YZMapper yzMapper; + + @Override + public void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + for (SchBaseTask task : tasks) { + // 找起点 + JSONObject jsonObject = JSONObject.parseObject(task.getRequest_param()); + // 获取当前位置 + SchBasePoint YZPoint = pointService.getById(task.getPoint_code2()); + // 获取工单 + PdmBdWorkorder workOrder = workorderService.getByCode(jsonObject.getString("workorder_code")); + // 获取比例 + BigDecimal materialRatio = workOrder.getMaterial_ratio(); + // 获取计划重量 + BigDecimal planWeight = workOrder.getPlan_weight(); + BigDecimal needSmall = planWeight.multiply(materialRatio).divide(new BigDecimal(100)); + BigDecimal needBig = planWeight.subtract(needSmall); + if ("DLZ".equals(YZPoint.getVehicle_type())) { + // 判断大 + if (workOrder.getReal_new_weight().compareTo(needBig) > 0) { + task.setRemark("数量以达到, 不允许叫料!"); + taskService.update(task); + // 消息通知 + continue; + } + } else { + // 判断小 + if (workOrder.getReal_old_weight().compareTo(needSmall) > 0) { + task.setRemark("数量以达到, 不允许叫料!"); + taskService.update(task); + // 消息通知 + continue; + } + } + jsonObject.put("vehicle_type", YZPoint.getCan_vehicle_type()); + SchBasePoint point = findStartPoint(jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setVehicle_code(point.getVehicle_code()); + taskService.updateById(task); + + point.setIng_task_code(task.getTask_code()); + pointService.updateById(point); + } + } + + @Override + public void createCompletion(SchBaseTask task) { + TaskUtils.setUpdateByAcs(task); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject extGroupData = JSONObject.parseObject(requestParam); + // 如果新料或者旧料比例到了,就不允许叫料 + // 获取当前位置 + SchBasePoint YZPoint = pointService.getById(task.getPoint_code2()); + // 获取工单 + PdmBdWorkorder workOrder = workorderService.getByCode(extGroupData.getString("workorder_code")); + // 获取比例 + BigDecimal materialRatio = workOrder.getMaterial_ratio(); + // 获取计划重量 + BigDecimal planWeight = workOrder.getPlan_weight(); + BigDecimal needSmall = planWeight.multiply(materialRatio).divide(new BigDecimal(100)); + BigDecimal needBig = planWeight.subtract(needSmall); + if ("DLZ".equals(YZPoint.getVehicle_type())) { + // 判断大 + if (workOrder.getReal_new_weight().compareTo(needBig) >= 0) { + throw new BadRequestException("数量已达到, 不允许叫料!"); + } + } else { + // 判断小 + if (workOrder.getReal_old_weight().compareTo(needSmall) >= 0) { + throw new BadRequestException("数量已达到, 不允许叫料!"); + } + } + extGroupData.put("vehicle_type", YZPoint.getCan_vehicle_type()); + extGroupData.put("order", workOrder); + SchBasePoint point = findStartPoint(extGroupData); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("未找到所需点位!"); + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setVehicle_code(point.getVehicle_code()); + task.setGroup_id(point.getGroup_id()); + task.setRemark(""); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 找起点业务:压机工单的物料标识相同的位置 + * 判断工单对应的大小盅的实际重量是否达到 (小盅所需重量:总重*比例) + * + * @param extGroupData : 外部参数,包含条件所需的信息 + * @return + * @description : JSONObject获取不到就是null + */ + private SchBasePoint findStartPoint(JSONObject extGroupData) { + // 获取当前工单 + JSONObject order = extGroupData.getJSONObject("order"); + String vehicleType = extGroupData.getString("vehicle_type"); + Assert.notNull(order, "工单不能为空!"); + Assert.notNull(vehicleType, "料盅类型不能为空!"); + PdmBdWorkorder workOrder = JSONObject.parseObject(JSON.toJSONString(order), PdmBdWorkorder.class); + // 查找工单的物料相同的位置 + List points = yzMapper.findPointForYZQL(workOrder.getRaw_material_code(), vehicleType, workOrder.getPoint_code()); + return ObjectUtil.isNotEmpty(points) ? points.get(0) : null; + } + + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 起点 + JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getRequest_param()) + ? JSONObject.parseObject(taskObj.getRequest_param()) + : null; + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.selectByIdLock(taskObj.getPoint_code2()); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { + // 任务上有载具编码 -> 获取当前载具编码的组盘信息 + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getVehicle_code, taskObj.getVehicle_code()) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, taskObj.getVehicle_type()) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, GroupBindMaterialStatusEnum.BOUND.getValue())); + // 将载具设置为已解绑 + one.setPoint_code(endPointObj.getPoint_code()); + one.setPoint_name(endPointObj.getPoint_name()); + one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); + vehiclematerialgroupService.update(one); + // 释放点位,将点位设置为空位,清空数据 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + endPointObj.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_qty(1); + PointUtils.setUpdateByType(endPointObj, TaskFinishedTypeEnum.AUTO_ACS); + pointService.updateById(endPointObj); + } + // 获取工单 + PdmBdWorkorder productionTask = workorderService.getByCode(extGroupData.getString("workorder_code")); + switch (taskObj.getVehicle_type()) { + case "DLZ": + productionTask.setReal_new_weight(productionTask.getReal_new_weight() + .add(one.getMaterial_weight())); + break; + case "XLZ": + productionTask.setReal_old_weight(productionTask.getReal_old_weight() + .add(one.getMaterial_weight())); + break; + default: + throw new BadRequestException("点位区域配置错误!"); + } + productionTask.setReal_qty(productionTask.getReal_qty().add(one.getMaterial_weight())); + TaskUtils.setWorkOrderUpdateByType(productionTask, TaskFinishedTypeEnum.AUTO_ACS); + workorderService.updateById(productionTask); + + // 任务修改成完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + } + if (status.equals(TaskStatus.CANCELED)) { + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + // 释放点位,起点正在执行的任务清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + } + taskService.update(taskObj); + } + + @Override + public void forceFinish(String task_code) { + this.updateStatus(task_code, TaskStatus.FINISHED); + } + + @Override + public void cancel(String task_code) { + this.updateStatus(task_code, TaskStatus.CANCELED); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java index b98c874..f141c9d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java @@ -1,6 +1,7 @@ package org.nl.wms.sch.task_manage.task.tasks.yz; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; @@ -35,10 +36,10 @@ import java.util.stream.Collectors; * @Date: 2023/5/25 */ @Slf4j -@Component(value = "LZKLXSKTask") -@TaskType("LZKLXSKTask") +@Component(value = "YZSKTask") +@TaskType("YZSKTask") public class YZSKTask extends AbstractTask { - private static final String TASK_CONFIG_CODE = "LZKLXSKTask"; + private static final String TASK_CONFIG_CODE = "YZSKTask"; @Autowired private ISchBasePointService pointService; @Autowired @@ -60,21 +61,23 @@ public class YZSKTask extends AbstractTask { // 找终点 String requestParam = task.getRequest_param(); JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint startPoint = pointService.getById(task.getPoint_code1()); + String vehicleType = startPoint.getCan_vehicle_type(); + jsonObject.put("vehicle_type", vehicleType); SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); - String vehicleType = jsonObject.getString("vehicle_type"); if (ObjectUtil.isEmpty(point)) { // 消息通知 - noticeService.createNotice("送空盅任务未找到混料机空位!", TASK_CONFIG_CODE + task.getPoint_code1(), + noticeService.createNotice("送空盅任务未找到可用的货架!", task.getPoint_code1() + "请求送空盅失败", NoticeTypeEnum.WARN.getCode()); - throw new BadRequestException("送空盅任务未找到混料机空位!"); + throw new BadRequestException("送空盅任务未找到可用的货架!"); } log.warn("送空盅找到点位的信息:{}", point); // 设置终点并修改创建成功状态 task.setPoint_code2(point.getPoint_code()); task.setTask_status(TaskStatus.CREATED.getCode()); - if (task.getVehicle_type() == null) { - task.setVehicle_type(vehicleType != null ? vehicleType : GeneralDefinition.MATERIAL_CUP); - } + task.setVehicle_type(vehicleType); + task.setRequest_param(JSON.toJSONString(jsonObject)); + task.setVehicle_code(startPoint.getVehicle_code()); taskService.save(task); point.setIng_task_code(task.getTask_code()); @@ -97,22 +100,24 @@ public class YZSKTask extends AbstractTask { // 找终点 String requestParam = task.getRequest_param(); JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint startPoint = pointService.getById(task.getPoint_code1()); + String vehicleType = startPoint.getCan_vehicle_type(); + jsonObject.put("vehicle_type", vehicleType); SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); - String vehicleType = jsonObject.getString("vehicle_type"); if (ObjectUtil.isEmpty(point)) { - task.setRemark("送空盅任务未找到混料机空位!"); + task.setRemark("送空盅任务未找到可用的货架!"); taskService.updateById(task); // 消息通知 - noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getTask_code(), + noticeService.createNotice(task.getRemark(), task.getPoint_code1() + "请求送空盅失败", NoticeTypeEnum.WARN.getCode()); continue; } // 设置终点并修改创建成功状态 task.setPoint_code2(point.getPoint_code()); task.setTask_status(TaskStatus.CREATED.getCode()); - if (task.getVehicle_type() == null) { - task.setVehicle_type(vehicleType != null ? vehicleType : GeneralDefinition.MATERIAL_CUP); - } + task.setVehicle_type(vehicleType); + task.setRequest_param(JSON.toJSONString(jsonObject)); + task.setVehicle_code(startPoint.getVehicle_code()); taskService.updateById(task); point.setIng_task_code(task.getTask_code()); @@ -129,21 +134,18 @@ public class YZSKTask extends AbstractTask { * @return */ private SchBasePoint findNextPoint(List nextRegionStr, JSONObject requestParam) { - String vehicleType = ObjectUtil.isNotEmpty(requestParam.getString("vehicle_type")) - ? requestParam.getString("vehicle_type") - : GeneralDefinition.MATERIAL_CUP; + String vehicleType = requestParam.getString("vehicle_type"); // 载具已经设置可为空,当不需要校验工单时候也不会出现空指针 LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); lam.in(SchBasePoint::getRegion_code, nextRegionStr) .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) .like(SchBasePoint::getCan_vehicle_type, vehicleType) - .eq(SchBasePoint::getPoint_type, GeneralDefinition.DOCKING_POINT) // 当前执行的任务为空或者NULL,有数据表示锁住 .and(la -> la.isNull(SchBasePoint::getIng_task_code) .or() .eq(SchBasePoint::getIng_task_code, "")) .eq(SchBasePoint::getIs_used, true) - .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_type) .orderByAsc(SchBasePoint::getPoint_code); List schBasePoints = pointService.list(lam); return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; @@ -200,8 +202,10 @@ public class YZSKTask extends AbstractTask { ? taskObj.getVehicle_type() : GeneralDefinition.MATERIAL_CUP; SchBasePoint endPointObj = pointService.getById(endPoint); + SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1()); // 设置载具类型、点位状态、释放点位 if (ObjectUtil.isNotEmpty(endPoint)) { + PointUtils.clearPoint(startPointObj); endPointObj.setIng_task_code(""); endPointObj.setVehicle_type(vehicleType); endPointObj.setVehicle_qty(1); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSLTask.java index 264c6f8..4e81f1c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSLTask.java @@ -44,7 +44,7 @@ import java.util.stream.Collectors; /** * @Author: lyd - * @Description: 压制送料 + * @Description: 压制送料 直接送到窑口 * @Date: 2023/6/19 */ @Slf4j @@ -100,20 +100,8 @@ public class YZSLTask extends AbstractTask { task.setGroup_id(setGroupPlate(jsonObject)); SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); if (ObjectUtil.isEmpty(point)) { - // 消息通知 - noticeService.createNotice("压机[" + task.getPoint_code1() + "]未找到所需点位!", TASK_CONFIG_CODE + task.getPoint_code1(), - NoticeTypeEnum.WARN.getCode()); throw new BadRequestException("压机[" + task.getPoint_code1() + "]未找到所需点位!"); } - // 特殊处理,创建半条任务 - if (ObjectUtil.isNotEmpty(point.getTask_warn()) && point.getTask_warn().equals(GeneralDefinition.NO)) { - // 加急工单就创建半条任务 - task.setTask_status(TaskStatus.APPLY.getCode()); - task.setRemark("加急工单任务"); - TaskUtils.setUpdateByAcs(task); - taskService.save(task); - return; - } // 设置终点并修改创建成功状态 task.setPoint_code2(point.getPoint_code()); task.setTask_status(TaskStatus.CREATED.getCode()); @@ -136,9 +124,6 @@ public class YZSLTask extends AbstractTask { */ private SchBasePoint findNextPoint(List nextRegionStr, JSONObject requestParam) { // 需要获取nextRegionStr - if (nextRegionStr.size() < 2) { - throw new BadRequestException("压制送料任务的配置文件有错!"); - } String regionCode = nextRegionStr.get(0); // 当前设备的工单 String workorderCode = requestParam.getString("workorder_code"); @@ -149,15 +134,7 @@ public class YZSLTask extends AbstractTask { if (one == null) { throw new BadRequestException("压制机的工单不能为空!"); } - // 判断是否加急,加急则去窑口,不加急就是去双层缓存输送线 - if (one.getIs_urgent()) { - // 直接创建半条任务供缓存线任务类扫描 - // todo: 2判断窑内数量是否大于177,如果窑口不能用,还是去双层输送线 后话 - SchBasePoint warnPoint = new SchBasePoint(); - warnPoint.setTask_warn(GeneralDefinition.NO); - return warnPoint; - } - // 双层缓存货架的一上一下的区分 -> 上五下五区分 + // 入窑口, 随机分配 LambdaQueryWrapper lam = new QueryWrapper().lambda(); lam.eq(SchBasePoint::getRegion_code, regionCode) .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) @@ -166,14 +143,20 @@ public class YZSLTask extends AbstractTask { .or() .eq(SchBasePoint::getIng_task_code, "")) .eq(SchBasePoint::getIs_used, true); - // 如果一个有货一个没货,但是载具数量又是5的时候,就要不需要检测不能为5 - List list = pointService.list(lam); - // 如果只有一条符合的数据就不需要检验不符合5个托 - boolean doDetection = list.size() != 1; - // 载具数量不能等于5 - lam.ne(doDetection, SchBasePoint::getVehicle_qty, 5) - .orderByDesc(SchBasePoint::getVehicle_qty); List schBasePoints = pointService.list(lam); + // todo: 判断该入窑口的位置是否能用 + if (schBasePoints.size() == 0 && nextRegionStr.size() > 1) { + // 去另一个区域 + regionCode = nextRegionStr.get(1); + lam.eq(SchBasePoint::getRegion_code, regionCode) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .eq(SchBasePoint::getPoint_type, GeneralDefinition.MATERIAL_POINT) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + schBasePoints = pointService.list(lam); + } return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; } @@ -193,13 +176,9 @@ public class YZSLTask extends AbstractTask { taskObj.setRemark("执行中"); TaskUtils.setUpdateByAcs(taskObj); taskService.updateById(taskObj); - // mark:暂时现在执行中的时候将满托上给mes - wmsToMesService.reportProductData(taskObj.getGroup_id()); } if (status.equals(TaskStatus.FINISHED)) { this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); - // mark: 完成后上报给MES - wmsToMesService.reportSemiProductionInfoIn(taskObj.getGroup_id()); } if (status.equals(TaskStatus.CANCELED)) { this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); @@ -308,7 +287,7 @@ public class YZSLTask extends AbstractTask { // 插入生产过程跟踪表 PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); processTracking.setBuss_move_id(vehiclematerialgroup.getBuss_move_id()); - processTracking.setProcess_action("压制送料入双层缓存线"); + processTracking.setProcess_action("压制送料入窑口或钢托缓存架"); processTracking.setProcess_location(endPoint); processTracking.setRecord_time(DateUtil.now()); processTrackingService.create(processTracking); @@ -319,13 +298,9 @@ public class YZSLTask extends AbstractTask { bdWorkorder.setReal_qty(NumberUtil.add(realQty, materialQty)); TaskUtils.setWorkOrderUpdateByType(bdWorkorder, taskFinishedType); workorderService.updateById(bdWorkorder); - // 终点解锁 - 工单不加急 - if (!bdWorkorder.getIs_urgent()) { - endPointObj.setIng_task_code(""); - PointUtils.setUpdateByType(endPointObj, taskFinishedType); - PointUtils.clearPointAndRetainNum(endPointObj); - pointService.updateById(endPointObj); - } + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.java index e531ae4..5aa9929 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.java @@ -11,7 +11,7 @@ import java.util.List; * @Date: 2023/6/19 */ public interface YZMapper { - List findPointForYZQL(List regionCode, String materialId); + List findPointForYZQL(String materialCode, String vehicleType, String device); @Deprecated List findPointForYZSL(JSONObject param); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.xml index 92d561a..6dbf68b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/mapper/YZMapper.xml @@ -3,18 +3,47 @@