diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java new file mode 100644 index 000000000..8877dcc42 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java @@ -0,0 +1,96 @@ +package org.nl.b_lms.pdm.productionplan.controller; + +import java.util.Set; +import java.util.Map; + +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import org.nl.common.TableDataInfo; +import org.springframework.web.bind.annotation.*; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.nl.modules.logging.annotation.Log; +import org.nl.b_lms.pdm.productionplan.service.IpdmBiSlittingproductionplanService; + + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)控制层 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/pdmBiSlittingproductionplan") +@Slf4j +public class PdmBiSlittingproductionplanController { + + + @Resource + private IpdmBiSlittingproductionplanService pdmBiSlittingproductionplanService; + + + /** + * 分页查询 + * + * @param whereJson 查询条件 + * @param page 分页参数 + */ + @GetMapping + @Log("查询分切生产计划") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(pdmBiSlittingproductionplanService.queryAll(whereJson, page)), HttpStatus.OK); + } + + + /** + * 新增数据 + * + * @param entity 实体对象 + * @return 新增结果 + */ + @PostMapping + @Log("新增分切生产计划") + public ResponseEntity create(PdmBiSlittingproductionplan entity) { + pdmBiSlittingproductionplanService.create(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + + /** + * 修改数据 + * + * @param entity 实体对象 + * @return 修改结果 + */ + @PutMapping + @Log("修改分切生产计划") + //@SaCheckPermission("@el.check(PdmBiSlittingproductionplan:edit')") + public ResponseEntity update(PdmBiSlittingproductionplan entity) { + pdmBiSlittingproductionplanService.update(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + + /** + * 删除数据 + * + * @param ids 多个主键Id + * @return 删除结果 + */ + @Log("删除分切生产计划") + //@SaCheckPermission("@el.check(PdmBiSlittingproductionplan:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + pdmBiSlittingproductionplanService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/PdmBiSlittingproductionplan.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/PdmBiSlittingproductionplan.java new file mode 100644 index 000000000..d6c9cadb5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/PdmBiSlittingproductionplan.java @@ -0,0 +1,306 @@ +package org.nl.b_lms.pdm.productionplan.dao; + +import java.math.BigDecimal; +import java.io.Serializable; +import java.math.BigDecimal; + +import lombok.*; +import lombok.Data; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.AllArgsConstructor; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; + + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)实体类 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +@Data +@Builder +@ToString +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@SuppressWarnings("serial") +@TableName("pdm_bi_slittingproductionplan") +public class PdmBiSlittingproductionplan extends Model { + + private static final long serialVersionUID = -7739291296662381393L; + + + + + /** + * 分切计划标识 + */ + @TableId(value = "workorder_id", type = IdType.NONE) + private Long workorder_id; + + + /** + * 分切订单类型 + */ + private String order_type; + + + /** + * 子卷号 + */ + private String container_name; + + + /** + * 产品编码 + */ + private String product_name; + + + /** + * 产品描述 + */ + private String description; + + + /** + * 来源母卷号 + */ + private String parent_container_name; + + + /** + * 改制来源子卷号 + */ + private String restruct_container_name; + + + /** + * 子卷立库木箱号 + */ + private String package_box_sn; + + + /** + * 来源卷位置 + */ + private String ware_house; + + + /** + * 分切机台编码 + */ + private String resource_name; + + + /** + * 分切组 + */ + private String split_group; + + + /** + * 生产顺序 + */ + private String manufacture_sort; + + + /** + * 生产订单 + */ + private String mfg_order_name; + + + /** + * 生产日期 + */ + private String manufacture_date; + + + /** + * 管件类型 + */ + private String paper_tube_or_FRP; + + + /** + * 纸筒物料编码 + */ + private String paper_tube_material; + + + /** + * 纸筒物料描述 + */ + private String paper_tube_description; + + + /** + * 纸筒规格 + */ + private String paper_tube_model; + + + + /** + * 纸管定级(待检区:1,2,3;管制区:4,6) + */ + @TableField(exist = false) + private String level; + + /** + * FRP管物料编码 + */ + private String FRP_material; + + + /** + * FRP管物料描述 + */ + private String FRP_description; + + + /** + * FRP管规格 + */ + private String FRP_model; + + + /** + * 子卷幅宽 + */ + private BigDecimal split_breadth; + + + /** + * 子卷理论长度 + */ + private BigDecimal split_height; + + + /** + * 子卷理论重量 + */ + private BigDecimal split_weight; + + + /** + * 开始时间 + */ + private String start_time; + + + /** + * 结束时间 + */ + private String end_time; + + + /** + * 状态 + */ + private String status; + + + /** + * 上料完成 + */ + private String is_parent_ok; + + + /** + * 子卷套轴完成 + */ + private String is_child_tz_ok; + + + /** + * 子卷配送完成 + */ + private String is_child_ps_ok; + + + /** + * 气涨轴编码 + */ + private String qzzno; + + + /** + * 修改人 + */ + private Long update_optid; + + + /** + * 修改人姓名 + */ + private String update_optname; + + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String update_time; + + + /** + * 部门ID + */ + private Long sysdeptid; + + + /** + * 公司ID + */ + private Long syscompanyid; + + + /** + * 是否删除 + */ + @TableField(fill = FieldFill.INSERT) + private String is_delete; + + + /** + * 销售订单及行号 + */ + private String sale_order_name; + + + /** + * 是否呼叫 + */ + private String is_call; + + + /** + * 呼叫时间 + */ + private String call_time; + + + /** + * 是否呼叫纸管 + */ + private String is_paper_ok; + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.workorder_id; + } + +} + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/mapper/PdmBiSlittingproductionplanMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/mapper/PdmBiSlittingproductionplanMapper.java new file mode 100644 index 000000000..19d5f2e47 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/mapper/PdmBiSlittingproductionplanMapper.java @@ -0,0 +1,15 @@ +package org.nl.b_lms.pdm.productionplan.dao.mapper; + +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)数据持久层 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +public interface PdmBiSlittingproductionplanMapper extends BaseMapper { + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/xml/PdmBiSlittingproductionplanMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/xml/PdmBiSlittingproductionplanMapper.xml new file mode 100644 index 000000000..e88f31caf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dao/xml/PdmBiSlittingproductionplanMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanDto.java new file mode 100644 index 000000000..638be3ec6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanDto.java @@ -0,0 +1,190 @@ +package org.nl.b_lms.pdm.productionplan.dto; + +import java.math.BigDecimal; +import java.io.Serializable; + +import lombok.*; +import lombok.Data; +import lombok.Builder; + + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)数据传输类 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +@Data +@Builder +@ToString +public class PdmBiSlittingproductionplanDto implements Serializable { + + /** + * 分切计划标识 + */ + private Long workorder_id; + /** + * 分切订单类型 + */ + private String order_type; + /** + * 子卷号 + */ + private String container_name; + /** + * 产品编码 + */ + private String product_name; + /** + * 产品描述 + */ + private String description; + /** + * 来源母卷号 + */ + private String parent_container_name; + /** + * 改制来源子卷号 + */ + private String restruct_container_name; + /** + * 子卷立库木箱号 + */ + private String package_box_sn; + /** + * 来源卷位置 + */ + private String ware_house; + /** + * 分切机台编码 + */ + private String resource_name; + /** + * 分切组 + */ + private String split_group; + /** + * 生产顺序 + */ + private String manufacture_sort; + /** + * 生产订单 + */ + private String mfg_order_name; + /** + * 生产日期 + */ + private String manufacture_date; + /** + * 管件类型 + */ + private String paper_tube_or_FRP; + /** + * 纸筒物料编码 + */ + private String paper_tube_material; + /** + * 纸筒物料描述 + */ + private String paper_tube_description; + /** + * 纸筒规格 + */ + private String paper_tube_model; + /** + * FRP管物料编码 + */ + private String FRP_material; + /** + * FRP管物料描述 + */ + private String FRP_description; + /** + * FRP管规格 + */ + private String FRP_model; + /** + * 子卷幅宽 + */ + private BigDecimal split_breadth; + /** + * 子卷理论长度 + */ + private BigDecimal split_height; + /** + * 子卷理论重量 + */ + private BigDecimal split_weight; + /** + * 开始时间 + */ + private String start_time; + /** + * 结束时间 + */ + private String end_time; + /** + * 状态 + */ + private String status; + /** + * 上料完成 + */ + private String is_parent_ok; + /** + * 子卷套轴完成 + */ + private String is_child_tz_ok; + /** + * 子卷配送完成 + */ + private String is_child_ps_ok; + /** + * 气涨轴编码 + */ + private String qzzno; + /** + * 修改人 + */ + private Long update_optid; + /** + * 修改人姓名 + */ + private String update_optname; + /** + * 修改时间 + */ + private String update_time; + /** + * 部门ID + */ + private Long sysdeptid; + /** + * 公司ID + */ + private Long syscompanyid; + /** + * 是否删除 + */ + private String is_delete; + /** + * 销售订单及行号 + */ + private String sale_order_name; + /** + * 是否呼叫 + */ + private String is_call; + /** + * 呼叫时间 + */ + private String call_time; + /** + * 是否呼叫纸管 + */ + private String is_paper_ok; + +} + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanQuery.java new file mode 100644 index 000000000..4623d06ae --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/dto/PdmBiSlittingproductionplanQuery.java @@ -0,0 +1,22 @@ +package org.nl.b_lms.pdm.productionplan.dto; + + +import java.math.BigDecimal; + + +import lombok.Data; +import lombok.Builder; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import org.nl.common.domain.query.BaseQuery; + +/** + * @Author: gbx + * @since 2024-01-27 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PdmBiSlittingproductionplanQuery extends BaseQuery { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/IpdmBiSlittingproductionplanService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/IpdmBiSlittingproductionplanService.java new file mode 100644 index 000000000..e6366cc64 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/IpdmBiSlittingproductionplanService.java @@ -0,0 +1,57 @@ +package org.nl.b_lms.pdm.productionplan.service; + +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.Map; +import java.util.Set; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; + + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)服务接口层 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +public interface IpdmBiSlittingproductionplanService extends IService { + + + /** + * 查询数据分页 + * + * @param whereJson 查询条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + + /** + * 创建 + * + * @param entity / + */ + void create(PdmBiSlittingproductionplan entity); + + + /** + * 编辑 + * + * @param entity / + */ + void update(PdmBiSlittingproductionplan entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + +} + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java new file mode 100644 index 000000000..92ee36e29 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java @@ -0,0 +1,106 @@ +package org.nl.b_lms.pdm.productionplan.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.pdm.productionplan.dao.mapper.PdmBiSlittingproductionplanMapper; +import org.nl.b_lms.pdm.productionplan.service.IpdmBiSlittingproductionplanService; +import cn.hutool.core.date.DateUtil; +import org.nl.common.utils.SecurityUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Set; + + +/** + * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)服务实现层 + * {@code @Author:} gbx + * + * @since 2024-01-27 + */ +@Service("pdmBiSlittingproductionplanService") +public class PdmBiSlittingproductionplanServiceImpl extends ServiceImpl implements IpdmBiSlittingproductionplanService { + + + @Resource + private PdmBiSlittingproductionplanMapper pdmBiSlittingproductionplanMapper; + + + /** + * 查询数据分页 + * + * @param whereJson 查询条件 + * @param page 分页参数 + */ + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + return pdmBiSlittingproductionplanMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()), new QueryWrapper() + .lambda() + ); + } + + + /** + * 创建 + * + * @param entity 对象实体 + */ + @Override + public void create(PdmBiSlittingproductionplan entity) { + pdmBiSlittingproductionplanMapper.insert(getBasicInfo(entity, true)); + } + + + /** + * 编辑 + * + * @param entity 对象实体 + */ + @Override + public void update(PdmBiSlittingproductionplan entity) { + // PdmBiSlittingproductionplan dto = pdmBiSlittingproductionplanMapper.selectById(entity.getId); + // if (dto == null) { + // throw new BadRequestException("不存在该数据!"); + // } + pdmBiSlittingproductionplanMapper.updateById(getBasicInfo(entity, false)); + } + + + /** + * 多选删除 + * + * @param ids 多个Id主键 + */ + @Override + public void deleteAll(Set ids) { + // 物理删除 + pdmBiSlittingproductionplanMapper.deleteBatchIds(ids); + } + + + /** + * 获取实体基础信息 + * + * @param entity 对象实体 + * @param isCreate 是否创建 + */ + private PdmBiSlittingproductionplan getBasicInfo(PdmBiSlittingproductionplan entity, boolean isCreate) { + // if (isCreate) { + // entity.setCreate_id(Long.valueOf(SecurityUtils.getCurrentUserId())); + // entity.setCreate_name(SecurityUtils.getCurrentNickName()); + // entity.setCreate_time(DateUtil.now()); + // } + // entity.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + // entity.setUpdate_optname(SecurityUtils.getCurrentNickName()); + // entity.setUpdate_time(DateUtil.now()); + return entity; + } + + +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java new file mode 100644 index 000000000..1df15b381 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java @@ -0,0 +1,96 @@ +package org.nl.b_lms.pdm.subpackagerelation.controller; + +import java.util.Set; +import java.util.Map; + +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import org.nl.common.TableDataInfo; +import org.springframework.web.bind.annotation.*; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.nl.modules.logging.annotation.Log; +import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; + + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)控制层 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/pdmBiSubpackagerelation") +@Slf4j +public class PdmBiSubpackagerelationController { + + + @Resource + private IpdmBiSubpackagerelationService pdmBiSubpackagerelationService; + + + /** + * 分页查询 + * + * @param whereJson 查询条件 + * @param page 分页参数 + */ + @GetMapping + @Log("查询子卷包装关系表") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(pdmBiSubpackagerelationService.queryAll(whereJson, page)), HttpStatus.OK); + } + + + /** + * 新增数据 + * + * @param entity 实体对象 + * @return 新增结果 + */ + @PostMapping + @Log("新增子卷包装关系表") + public ResponseEntity create(PdmBiSubpackagerelation entity) { + pdmBiSubpackagerelationService.create(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + + /** + * 修改数据 + * + * @param entity 实体对象 + * @return 修改结果 + */ + @PutMapping + @Log("修改子卷包装关系表") + //@SaCheckPermission("@el.check(PdmBiSubpackagerelation:edit')") + public ResponseEntity update(PdmBiSubpackagerelation entity) { + pdmBiSubpackagerelationService.update(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + + /** + * 删除数据 + * + * @param ids 多个主键Id + * @return 删除结果 + */ + @Log("删除子卷包装关系表") + //@SaCheckPermission("@el.check(PdmBiSubpackagerelation:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + pdmBiSubpackagerelationService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java new file mode 100644 index 000000000..91da401fb --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java @@ -0,0 +1,325 @@ +package org.nl.b_lms.pdm.subpackagerelation.dao; + +import java.math.BigDecimal; +import java.io.Serializable; + +import lombok.*; +import lombok.Data; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.AllArgsConstructor; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; + + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)实体类 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +@Data +@Builder +@ToString +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@SuppressWarnings("serial") +@TableName("pdm_bi_subpackagerelation") +public class PdmBiSubpackagerelation extends Model { + + private static final long serialVersionUID = -7739291296662381393L; + //@TableId(value = "id", type = IdType.NONE) + + + /** + * 子卷包装标识 + */ + private Long workorder_id; + + + /** + * 木箱唯一码 + */ + private String package_box_sn; + + + /** + * 箱内子卷数量 + */ + private BigDecimal quanlity_in_box; + + + /** + * 木箱自身重量 + */ + private BigDecimal box_weight; + + + /** + * 保质期 + */ + private String quality_guaran_period; + + + /** + * 销售订单及行号 + */ + private String sale_order_name; + + + /** + * 客户编号 + */ + private String customer_name; + + + /** + * 客户名称 + */ + private String customer_description; + + + /** + * 产品编码 + */ + private String product_name; + + + /** + * 产品描述 + */ + private String product_description; + + + /** + * 入库日期 + */ + private String date_of_FG_inbound; + + + /** + * 子卷号 + */ + private String container_name; + + + /** + * 产品规格(幅宽) + */ + private String width; + + + /** + * 产品厚度 + */ + private String thickness; + + + /** + * 单位面积质量 + */ + private BigDecimal mass_per_unit_area; + + + /** + * 净重 + */ + private BigDecimal net_weight; + + + /** + * 长度 + */ + private BigDecimal length; + + + /** + * 制造完成日期 + */ + private String date_of_production; + + + /** + * 计划外分切的子卷 + */ + private String is_un_plan_production; + + + /** + * 子卷的物性值1 + */ + private String un_plan_product_property1; + + + /** + * 子卷的物性值2 + */ + private String un_plan_product_property2; + + + /** + * 子卷的物性值3 + */ + private String un_plan_product_property3; + + + /** + * 备注 + */ + private String remark; + + + /** + * 创建人 + */ + private Long create_id; + + + /** + * 创建人姓名 + */ + private String create_name; + + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private String create_time; + + + /** + * 状态 + */ + private String status; + + + /** + * 是否需要重打外包装标签 + */ + private String isRePrintPackageBoxLabel; + + + /** + * 是否需要拆包重打子卷标签 + */ + private String isUnPackBox; + + + /** + * 木箱料号 + */ + private String box_type; + + + /** + * SAP批次 + */ + private String sap_pcsn; + + + /** + * 交货单号 + */ + private String vbeln; + + + /** + * 交货单行号 + */ + private String posnr; + + + /** + * 木箱长度 + */ + private String box_length; + + + /** + * 木箱宽度 + */ + private String box_width; + + + /** + * 木箱高度 + */ + private String box_high; + + + /** + * 销售订单描述 + */ + private String sale_order_description; + + + /** + * 客户要求规格幅宽 + */ + private String width_standard; + + + /** + * 物料标准厚度 + */ + private String thickness_request; + + + /** + * 实际木箱自身重量 + */ + private BigDecimal real_weight; + + + /** + * 包装关系类型 + */ + private String sub_type; + + + /** + * 客户需求抗拉下限 + */ + private String demand_limit; + + + /** + * 内控标准抗拉下限 + */ + private String standard_limit; + + + /** + * 生产实际抗拉值 + */ + private String actual_value; + + + /** + * 解绑删除标识 + */ + private String need_delete; + + + /** + * 储存地点 + */ + private String ext_code; + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.workorder_id; + } + +} + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.java new file mode 100644 index 000000000..2e1c77d0c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.java @@ -0,0 +1,15 @@ +package org.nl.b_lms.pdm.subpackagerelation.dao.mapper; + +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)数据持久层 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +public interface PdmBiSubpackagerelationMapper extends BaseMapper { + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/xml/PdmBiSubpackagerelationMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/xml/PdmBiSubpackagerelationMapper.xml new file mode 100644 index 000000000..6c542686c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/xml/PdmBiSubpackagerelationMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationDto.java new file mode 100644 index 000000000..e10974569 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationDto.java @@ -0,0 +1,210 @@ +package org.nl.b_lms.pdm.subpackagerelation.dto; + +import java.math.BigDecimal; +import java.io.Serializable; + +import lombok.*; +import lombok.Data; +import lombok.Builder; + + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)数据传输类 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +@Data +@Builder +@ToString +public class PdmBiSubpackagerelationDto implements Serializable { + + /** + * 子卷包装标识 + */ + private Long workorder_id; + /** + * 木箱唯一码 + */ + private String package_box_sn; + /** + * 箱内子卷数量 + */ + private BigDecimal quanlity_in_box; + /** + * 木箱自身重量 + */ + private BigDecimal box_weight; + /** + * 保质期 + */ + private String quality_guaran_period; + /** + * 销售订单及行号 + */ + private String sale_order_name; + /** + * 客户编号 + */ + private String customer_name; + /** + * 客户名称 + */ + private String customer_description; + /** + * 产品编码 + */ + private String product_name; + /** + * 产品描述 + */ + private String product_description; + /** + * 入库日期 + */ + private String date_of_FG_inbound; + /** + * 子卷号 + */ + private String container_name; + /** + * 产品规格(幅宽) + */ + private String width; + /** + * 产品厚度 + */ + private String thickness; + /** + * 单位面积质量 + */ + private BigDecimal mass_per_unit_area; + /** + * 净重 + */ + private BigDecimal net_weight; + /** + * 长度 + */ + private BigDecimal length; + /** + * 制造完成日期 + */ + private String date_of_production; + /** + * 计划外分切的子卷 + */ + private String is_un_plan_production; + /** + * 子卷的物性值1 + */ + private String un_plan_product_property1; + /** + * 子卷的物性值2 + */ + private String un_plan_product_property2; + /** + * 子卷的物性值3 + */ + private String un_plan_product_property3; + /** + * 备注 + */ + private String remark; + /** + * 创建人 + */ + private Long create_id; + /** + * 创建人姓名 + */ + private String create_name; + /** + * 创建时间 + */ + private String create_time; + /** + * 状态 + */ + private String status; + /** + * 是否需要重打外包装标签 + */ + private String isRePrintPackageBoxLabel; + /** + * 是否需要拆包重打子卷标签 + */ + private String isUnPackBox; + /** + * 木箱料号 + */ + private String box_type; + /** + * SAP批次 + */ + private String sap_pcsn; + /** + * 交货单号 + */ + private String vbeln; + /** + * 交货单行号 + */ + private String posnr; + /** + * 木箱长度 + */ + private String box_length; + /** + * 木箱宽度 + */ + private String box_width; + /** + * 木箱高度 + */ + private String box_high; + /** + * 销售订单描述 + */ + private String sale_order_description; + /** + * 客户要求规格幅宽 + */ + private String width_standard; + /** + * 物料标准厚度 + */ + private String thickness_request; + /** + * 实际木箱自身重量 + */ + private BigDecimal real_weight; + /** + * 包装关系类型 + */ + private String sub_type; + /** + * 客户需求抗拉下限 + */ + private String demand_limit; + /** + * 内控标准抗拉下限 + */ + private String standard_limit; + /** + * 生产实际抗拉值 + */ + private String actual_value; + /** + * 解绑删除标识 + */ + private String need_delete; + /** + * 储存地点 + */ + private String ext_code; + +} + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationQuery.java new file mode 100644 index 000000000..708cb1616 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dto/PdmBiSubpackagerelationQuery.java @@ -0,0 +1,17 @@ +package org.nl.b_lms.pdm.subpackagerelation.dto; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import org.nl.common.domain.query.BaseQuery; + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)查询参数类 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PdmBiSubpackagerelationQuery extends BaseQuery { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java new file mode 100644 index 000000000..51227c501 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java @@ -0,0 +1,57 @@ +package org.nl.b_lms.pdm.subpackagerelation.service; + +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.Map; +import java.util.Set; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; + + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)服务接口层 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +public interface IpdmBiSubpackagerelationService extends IService { + + + /** + * 查询数据分页 + * + * @param whereJson 查询条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + + /** + * 创建 + * + * @param entity / + */ + void create(PdmBiSubpackagerelation entity); + + + /** + * 编辑 + * + * @param entity / + */ + void update(PdmBiSubpackagerelation entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + +} + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java new file mode 100644 index 000000000..0143b6f05 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java @@ -0,0 +1,102 @@ +package org.nl.b_lms.pdm.subpackagerelation.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; +import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; +import cn.hutool.core.date.DateUtil; +import org.nl.common.utils.SecurityUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Set; + + +/** + * {@code @Description:} 子卷包装关系表(PdmBiSubpackagerelation)服务实现层 + * {@code @Author:} gbx + * + * @since 2024-02-01 + */ +@Service("pdmBiSubpackagerelationService") +public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl implements IpdmBiSubpackagerelationService { + + + @Resource + private PdmBiSubpackagerelationMapper pdmBiSubpackagerelationMapper; + + + /** + * 查询数据分页 + * + * @param whereJson 查询条件 + * @param page 分页参数 + */ + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + return pdmBiSubpackagerelationMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()), new QueryWrapper() + .lambda()); + } + + + /** + * 创建 + * + * @param entity 对象实体 + */ + @Override + public void create(PdmBiSubpackagerelation entity) { + pdmBiSubpackagerelationMapper.insert(getBasicInfo(entity, true)); + } + + + /** + * 编辑 + * + * @param entity 对象实体 + */ + @Override + public void update(PdmBiSubpackagerelation entity) { + // PdmBiSubpackagerelation dto = pdmBiSubpackagerelationMapper.selectById(entity.getId); + // if (dto == null) { + // throw new BadRequestException("不存在该数据!"); + // } + pdmBiSubpackagerelationMapper.updateById(getBasicInfo(entity, false)); + } + + + /** + * 多选删除 + * + * @param ids 多个Id主键 + */ + @Override + public void deleteAll(Set ids) { + // 物理删除 + pdmBiSubpackagerelationMapper.deleteBatchIds(ids); + } + + + /** + * 获取实体基础信息 + * + * @param entity 对象实体 + * @param isCreate 是否创建 + */ + private PdmBiSubpackagerelation getBasicInfo(PdmBiSubpackagerelation entity, boolean isCreate) { + if (isCreate) { + entity.setCreate_id(Long.valueOf(SecurityUtils.getCurrentUserId())); + entity.setCreate_name(SecurityUtils.getCurrentNickName()); + entity.setCreate_time(DateUtil.now()); + } + return entity; + } + + +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java index af667e04a..be6a16e0d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/SchBasePoint.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/SchBasePoint.java index 0a273bd87..802e3dbd9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/SchBasePoint.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/SchBasePoint.java @@ -1,13 +1,10 @@ package org.nl.b_lms.sch.point.dao; - import java.math.BigDecimal; import java.io.Serializable; import java.math.BigDecimal; - import lombok.*; import lombok.Data; import lombok.Builder; -import lombok.NoArgsConstructor; import lombok.EqualsAndHashCode; import lombok.AllArgsConstructor; import com.baomidou.mybatisplus.annotation.*; @@ -15,286 +12,296 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; -/** + + /** * {@code @Description:} 点位基础表(SchBasePoint)实体类 * {@code @Author:} gbx - * - * @since 2024-01-24 + * @since 2024-01-25 */ @Data @Builder @ToString -@NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") @TableName("sch_base_point") -public class SchBasePoint extends Model { - - private static final long serialVersionUID = -7739291296662381393L; - - - - /** - * 点位标识 - */ - @TableId(value = "point_id", type = IdType.NONE) - private Long point_id; - - - /** - * 点位编码 - */ - private String point_code; - - - /** - * 点位名称 - */ - private String point_name; - - - /** - * 所属区域 - */ - private Long region_id; - - - /** - * 区域编码 - */ - private String region_code; - - - /** - * 区域名称 - */ - private String region_name; - - - /** - * 点位类型 - */ - private String point_type; - - - /** - * 点位状态 - */ - private String point_status; - - - /** - * 锁定类型 - */ - private String lock_type; - - - /** - * 物料标识 - */ - private Long material_id; - - - /** - * 设备编码 - */ - private String device_code; - - - /** - * MES设备编码 - */ - private String mes_device_code; - - - /** - * 允许的载具类型 - */ - private String can_vehicle_type; - - - /** - * 载具允许最大数量 - */ - private BigDecimal vehicle_max_qty; - - - /** - * 载具类型 - */ - private String vehicle_type; - - - /** - * 载具编码 - */ - private String vehicle_code; - - - /** - * 载具数量 - */ - private BigDecimal vehicle_qty; - - - /** - * 块 - */ - private BigDecimal block_num; - - - /** - * 排 - */ - private BigDecimal row_num; - - - /** - * 列 - */ - private BigDecimal col_num; - - - /** - * 层 - */ - private BigDecimal layer_num; - - - /** - * 入库顺序 - */ - private BigDecimal in_order_seq; - - - /** - * 出库顺序 - */ - private BigDecimal out_order_seq; - - - /** - * 入空载具顺序 - */ - private BigDecimal in_empty_seq; - - - /** - * 出空载具顺序 - */ - private BigDecimal out_empty_seq; - - - /** - * 点位组编码 - */ - private String point_group_code; - - - /** - * 是否建工单 - */ - private String is_have_workder; - - - /** - * 在执行的任务标识 - */ - private Long task_id; - - - /** - * 生产区域 - */ - private String product_area; - - - /** - * 备注 - */ - private String remark; - - - /** - * 来源标识 - */ - private Long source_id; - - - /** - * 是否启用 - */ - private String is_used; - - - /** - * 是否删除 - */ - @TableField(fill = FieldFill.INSERT) - private String is_delete; - - - /** - * 创建人 - */ - private Long create_id; - - - /** - * 创建人 - */ - private String create_name; - - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private String create_time; - - - /** - * 修改人 - */ - private Long update_optid; - - - /** - * 修改人 - */ - private String update_optname; - - - /** - * 修改时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private String update_time; - - - /** - * 位置 - */ - private String point_location; - - - /** - * 物料编码 - */ - private String material_code; - - - /** - * 获取主键值 - * - * @return 主键值 - */ - @Override - protected Serializable pkVal() { - return this.point_id; - } - +public class SchBasePoint extends Model +{ + + private static final long serialVersionUID = -7739291296662381393L; + //@TableId(value = "id", type = IdType.NONE) + + + + + /** + * 点位标识 + */ + @TableId(value = "point_id", type = IdType.NONE) + private Long point_id; + + + /** + * 点位编码 + */ + private String point_code; + + + /** + * 点位名称 + */ + private String point_name; + + + /** + * 所属区域 + */ + private Long region_id; + + + /** + * 区域编码 + */ + private String region_code; + + + /** + * 区域名称 + */ + private String region_name; + + + /** + * 点位类型 + */ + private String point_type; + + + /** + * 点位状态 + */ + private String point_status; + + + /** + * 锁定类型 + */ + private String lock_type; + + + /** + * 物料标识 + */ + private Long material_id; + + + /** + * 设备编码 + */ + private String device_code; + + + /** + * MES设备编码 + */ + private String mes_device_code; + + + /** + * 允许的载具类型 + */ + private String can_vehicle_type; + + + /** + * 载具允许最大数量 + */ + private BigDecimal vehicle_max_qty; + + + /** + * 载具类型 + */ + private String vehicle_type; + + + /** + * 载具编码 + */ + private String vehicle_code; + + + /** + * 载具数量 + */ + private BigDecimal vehicle_qty; + + + /** + * 块 + */ + private BigDecimal block_num; + + + /** + * 排 + */ + private BigDecimal row_num; + + + /** + * 列 + */ + private BigDecimal col_num; + + + /** + * 层 + */ + private BigDecimal layer_num; + + + /** + * 入库顺序 + */ + private BigDecimal in_order_seq; + + + /** + * 出库顺序 + */ + private BigDecimal out_order_seq; + + + /** + * 入空载具顺序 + */ + private BigDecimal in_empty_seq; + + + /** + * 出空载具顺序 + */ + private BigDecimal out_empty_seq; + + + /** + * 点位组编码 + */ + private String point_group_code; + + + /** + * 是否建工单 + */ + private String is_have_workder; + + + /** + * 在执行的任务标识 + */ + private Long task_id; + + + /** + * 生产区域 + */ + private String product_area; + + + /** + * 备注 + */ + private String remark; + + + /** + * 来源标识 + */ + private Long source_id; + + + /** + * 是否启用 + */ + private String is_used; + + + /** + * 是否删除 + */ + @TableField(fill = FieldFill.INSERT) + private String is_delete; + + + + + /** + * 创建人 + */ + private Long create_id; + + + /** + * 创建人 + */ + private String create_name; + + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private String create_time; + + + + + /** + * 修改人 + */ + private Long update_optid; + + + /** + * 修改人 + */ + private String update_optname; + + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String update_time; + + + + /** + * 位置 + */ + private String point_location; + + + /** + * 物料编码 + */ + private String material_code; + + + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() + { + return this.point_id; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCoolregionio.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCoolregionio.java index 6e673aaa4..93ba547e0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCoolregionio.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCoolregionio.java @@ -24,13 +24,14 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") @TableName("st_ivt_coolregionio") public class StIvtCoolregionio extends Model { + private static final long serialVersionUID = -7739291296662381393L; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCutpointivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCutpointivt.java index b8ac52c5f..b341cb5b6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCutpointivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtCutpointivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtDeliverypointivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtDeliverypointivt.java index 9f3262084..5297e7ba0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtDeliverypointivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtDeliverypointivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptytubeivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptytubeivt.java index 6f9971236..5cd0b9266 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptytubeivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptytubeivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptyvehiclerecord.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptyvehiclerecord.java index 20c3aac36..44583df84 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptyvehiclerecord.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtEmptyvehiclerecord.java @@ -24,7 +24,6 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtHotpointivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtHotpointivt.java index 50217f9a7..1ef267d21 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtHotpointivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtHotpointivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtSbpointivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtSbpointivt.java index 60b960836..c8a1651bb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtSbpointivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtSbpointivt.java @@ -23,7 +23,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @TableName("st_ivt_sbpointivt") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtShaftivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtShaftivt.java index f2a0e4ca4..5e9d4f5fd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtShaftivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/StIvtShaftivt.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.java index 61200a5a2..003542408 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.java @@ -1,7 +1,10 @@ package org.nl.b_lms.sch.point.dao.mapper; -import org.nl.b_lms.sch.point.dao.SchBasePoint; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.b_lms.sch.point.dao.SchBasePoint; + +import java.util.List; /** * {@code @Description:} 点位基础表(SchBasePoint)数据持久层 @@ -11,5 +14,40 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SchBasePointMapper extends BaseMapper { + /** + * 获取捆扎区域的点位木箱信息 + * @return 点位木箱信息集合 + */ + List queryKZPoint(); + + /** + * 申请发货任务:获取相同订单的所有排 + * @param whereJson : { + * region_id: 区域id + * sale_order_name:订单号 + * } + * @return JSONObject + */ + List queryLikeOrderRow(JSONObject whereJson); + + /** + * 申请发货任务: 查询新的一排 + * @param whereJson:{ + * region_id: 区域id + * } + * @return JSONObject + */ + List queryNewRow(JSONObject whereJson); + + /** + * 申请发货任务: 判断是否阻挡 + * @param whereJson:{ + * point_code: 点位编码 + * region_id: 区域id + * } + * @return JSONObject + */ + List isBlock(JSONObject whereJson); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.xml new file mode 100644 index 000000000..28a2463bd --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/SchBasePointMapper.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dto/SchBasePointQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dto/SchBasePointQuery.java index 3b069a9d5..8e0e60fb1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dto/SchBasePointQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dto/SchBasePointQuery.java @@ -1,13 +1,9 @@ package org.nl.b_lms.sch.point.dto; -import java.math.BigDecimal; - - import lombok.Data; import lombok.Builder; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; import org.nl.b_lms.sch.point.dao.SchBasePoint; import org.nl.common.domain.query.BaseQuery; @@ -20,7 +16,7 @@ import org.nl.common.domain.query.BaseQuery; @EqualsAndHashCode(callSuper = true) @Data @Builder -@NoArgsConstructor + public class SchBasePointQuery extends BaseQuery { } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IschBasePointService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IschBasePointService.java index 510358e62..c24ac89aa 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IschBasePointService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IschBasePointService.java @@ -1,21 +1,12 @@ package org.nl.b_lms.sch.point.service; - -import org.nl.b_lms.sch.point.dao.SchBasePoint; import com.baomidou.mybatisplus.extension.service.IService; - import java.util.Map; import java.util.Set; - import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.b_lms.sch.point.dao.SchBasePoint; import org.nl.common.domain.query.PageQuery; -/** - * {@code @Description:} 点位基础表(SchBasePoint)服务接口层 - * {@code @Author:} gbx - * - * @since 2024-01-24 - */ public interface IschBasePointService extends IService { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/SchBasePointServiceImpl.java index b3459a2a4..370cabf65 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/SchBasePointServiceImpl.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.nl.b_lms.sch.point.dao.SchBasePoint; import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; import org.nl.b_lms.sch.point.service.IschBasePointService; -import cn.hutool.core.date.DateUtil; -import org.nl.common.utils.SecurityUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dao/SchBaseRegion.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dao/SchBaseRegion.java index f77ebd1e3..db14adc03 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dao/SchBaseRegion.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dao/SchBaseRegion.java @@ -17,7 +17,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor + @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") @@ -30,6 +30,7 @@ public class SchBaseRegion extends Model { /** * 区域标识 */ + @TableId(value = "region_id", type = IdType.NONE) private Long region_id; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dto/SchBaseRegionQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dto/SchBaseRegionQuery.java index d556e0916..20e6d5c23 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dto/SchBaseRegionQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/region/dto/SchBaseRegionQuery.java @@ -13,7 +13,7 @@ import org.nl.common.domain.query.BaseQuery; */ @Data @Builder -@NoArgsConstructor + public class SchBaseRegionQuery extends BaseQuery { } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/SchBaseTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/SchBaseTask.java index ae553b3ea..08cf1bbb2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/SchBaseTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/SchBaseTask.java @@ -18,7 +18,6 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @Builder @ToString -@NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @SuppressWarnings("serial") @@ -31,6 +30,7 @@ public class SchBaseTask extends Model { /** * 任务标识 */ + @TableId(value = "task_id", type = IdType.NONE) private Long task_id; @@ -277,6 +277,11 @@ public class SchBaseTask extends Model { private String vehicle_code2; + /** + * 是否立即下发 + */ + private String is_send; + /** * 获取主键值 * diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dto/SchBaseTaskQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dto/SchBaseTaskQuery.java index a13c7984e..1cee22133 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dto/SchBaseTaskQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dto/SchBaseTaskQuery.java @@ -16,7 +16,7 @@ import org.nl.common.domain.query.BaseQuery; */ @Data @Builder -@NoArgsConstructor + public class SchBaseTaskQuery extends BaseQuery { } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java index d5332cc84..75d85524d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -97,14 +97,14 @@ public class SchBaseTaskServiceImpl extends ServiceImpl addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("托盘号不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_type"))) { + throw new BadRequestException("托盘类型不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("vehicle_type", form.getString("vehicle_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + // 下发任务 + this.immediateNotifyAcs(null); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInBoxTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInBoxTask.java new file mode 100644 index 000000000..34135ed52 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInBoxTask.java @@ -0,0 +1,181 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二期空木箱入库任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoInBoxTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoInBoxTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 载具扩展属性表 + WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + // 更新仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttr.put("storagevehicle_code",taskObj.getString("vehicle_code")); + attrTab.update(jsonAttr); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + // 解锁仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttr); + + // 删除载具对应木箱记录 + veExtTab.delete("pcsn = '"+taskObj.getString("vehicle_code")+"'"); + + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("木箱号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoLashTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoLashTask.java new file mode 100644 index 000000000..5335da5c6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoLashTask.java @@ -0,0 +1,196 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.b_lms.sch.point.dao.SchBasePoint; +import org.nl.b_lms.sch.point.service.IschBasePointService; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxlashboundService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * 二期捆扎任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoLashTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoLashTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + // 木箱绑定表 + WQLObject boxTab = WQLObject.getWQLObject("bst_ivt_boxlashbound"); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + // 减去终点点位载具数量 + JSONObject pointDao = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + + pointDao.put("vehicle_qty", NumberUtil.sub(pointDao.getIntValue("vehicle_qty"),1)); + + if (pointDao.getIntValue("vehicle_qty") <= 0) { + // 清空载具号 + pointDao.put("vehicle_code", ""); + pointDao.put("vehicle_qty",0); + } + pointTab.update(pointDao); + + // 删除木箱绑定数据 + boxTab.delete("box_no = '"+taskObj.getString("vehicle_code")+"'"); + + } + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("托盘号不能为空!"); + } + + if (StrUtil.isBlank(form.getString("is_auto_issue"))) { + throw new BadRequestException("是否自动下发不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("is_auto_issue", form.getString("is_auto_issue")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoMoveBoxTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoMoveBoxTask.java new file mode 100644 index 000000000..1f695df2b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoMoveBoxTask.java @@ -0,0 +1,190 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二期空木箱移库任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoMoveBoxTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoMoveBoxTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 载具扩展属性表 + WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + // 更新起点 + JSONObject jsonAttrStar = attrTab.query("struct_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + jsonAttrStar.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttrStar.put("storagevehicle_code",""); + attrTab.update(jsonAttrStar); + + // 更新终点 + JSONObject jsonAttrEnd = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttrEnd.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttrEnd.put("storagevehicle_code",taskObj.getString("vehicle_code")); + attrTab.update(jsonAttrEnd); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + // 解锁起点 + JSONObject jsonAttrStar = attrTab.query("struct_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + jsonAttrStar.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttrStar); + + // 解锁终点 + JSONObject jsonAttrEnd = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttrEnd.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttrEnd); + + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("木箱号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_group_id", form.getLongValue("task_group_id")); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxTask.java new file mode 100644 index 000000000..7361d2f36 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxTask.java @@ -0,0 +1,177 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二期空木箱出库任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoOutBoxTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoOutBoxTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + // 更新仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttr.put("storagevehicle_code",""); + attrTab.update(jsonAttr); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + // 解锁仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttr); + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("木箱号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("vehicle_type", form.getString("vehicle_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_group_id", form.getLongValue("task_group_id")); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutEmpTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutEmpTask.java index 5110019c8..bab8eb583 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutEmpTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutEmpTask.java @@ -82,7 +82,7 @@ public class TwoOutEmpTask extends AbstractAcsTask { map.put("task_status", TaskStatusEnum.FINISHED.getCode()); // 更新仓位 - JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); jsonAttr.put("storagevehicle_code",""); jsonAttr.put("storagevehicle_type",""); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java new file mode 100644 index 000000000..0359d3cdb --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java @@ -0,0 +1,198 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二期出库异常任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoOutExceptionalTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoOutExceptionalTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // 出入库分配明细表 + WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONObject jsonTask = taskTab.query("task_id = '" + taskObj.getString("task_id") + "'").uniqueResult(0); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + // 判断任务是否被标记 + if (jsonTask.getString("is_auto_issue").equals(IOSEnum.IS_SEND.code("否"))) { + // 创建出库任务 + JSONObject jsonDis = disTab.query("iostorinv_id = '" + jsonTask.getString("table_fk") + "' and struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + + JSONObject jsonPoint = pointTab.query("region_id = '" + RegionTypeEnum.TWO_OUT01.getId() + "' and is_delete = '0' and is_used = '1'").uniqueResult(0); + + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("point_code1", jsonTask.getString("point_code2")); + jsonTaskParam.put("point_code2", jsonPoint.getString("point_code")); + jsonTaskParam.put("vehicle_code", jsonTask.getString("vehicle_code")); + jsonTaskParam.put("task_group_id", jsonDis.getString("task_id")); + jsonTaskParam.put("is_auto_issue", IOSEnum.IS_SEND.code("否")); + jsonTaskParam.put("table_fk", jsonTask.getString("table_fk")); + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("浅"))); + + TwoOutTask twoOutTask = new TwoOutTask(); + String task_id = twoOutTask.createTask(jsonTaskParam); + + // 更新分配明细 + JSONObject param = new JSONObject(); + param.put("task_id",task_id); + param.put("point_id",jsonPoint.getString("point_id")); + disTab.update(param,"iostorinv_id = '"+jsonTask.getString("table_fk")+"' and struct_code = '"+jsonTask.getString("point_code1")+"'"); + } + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + } + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("托盘号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("table_fk", form.getString("table_fk")); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java index 3034cdb94..6e4601134 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -2,12 +2,12 @@ package org.nl.b_lms.sch.tasks; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; @@ -15,18 +15,16 @@ import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * Created by Lxy on 2021/12/22. */ -@Component -@RequiredArgsConstructor public class TwoOutTask extends AbstractAcsTask { private final String THIS_CLASS = TwoOutTask.class.getName(); @@ -41,10 +39,24 @@ public class TwoOutTask extends AbstractAcsTask { JSONObject map = new JSONObject(); map.put("flag", "1"); map.put("handle_class", THIS_CLASS); - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + List arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' order by sort_seq") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 根据任务组分组 + Map> groupMap = arr.stream() + .collect(Collectors.groupingBy(row -> row.getString("task_group_id"))); + + List taskArr = new ArrayList<>(); + + for(String task_group_id : groupMap.keySet()) { + taskArr = groupMap.get(task_group_id); + continue; + } + ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject json = taskArr.get(i); char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); AcsTaskDto dto = AcsTaskDto.builder() @@ -79,7 +91,7 @@ public class TwoOutTask extends AbstractAcsTask { JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonTask)) { - if (StrUtil.equals(status, "0")) { + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { // 任务为执行之后就不允许取消 if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消"); @@ -92,11 +104,11 @@ public class TwoOutTask extends AbstractAcsTask { // 更新分配明细为:未生成 JSONObject map = new JSONObject(); - map.put("work_status", "00"); + map.put("work_status", IOSEnum.WORK_STATUS.code("未生成")); map.put("point_id", ""); + map.put("task_id", ""); disTab.update(map, "task_id = '" + task_id + "'"); - } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { @@ -108,26 +120,16 @@ public class TwoOutTask extends AbstractAcsTask { } if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String currentUsername = SecurityUtils.getCurrentUsername(); - - // 判断此任务是否有任务组 - String task_group_id = jsonTask.getString("task_group_id"); - if (ObjectUtil.isNotEmpty(task_group_id)) { - // 上一个任务组顺序号 - String sort_seq_last = NumberUtil.sub(jsonTask.getString("sort_seq"), "1").toString(); - } - // 调用标识完成 - CheckOutBillService checkOutBillService = SpringContextHolder.getBean(CheckOutBillService.class); - checkOutBillService.finishTask(jsonTask); + StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class); + bean.finishTask(jsonTask); + // 判断此任务组是否全部完成 + JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'") + .getResultJSONArray(0); - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", currentUserId); - jsonTask.put("update_optname", currentUsername); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); + if (ObjectUtil.isEmpty(resultJSONArray)) { + this.immediateNotifyAcs(null); + } } } @@ -159,7 +161,9 @@ public class TwoOutTask extends AbstractAcsTask { json.put("point_code2", form.getString("point_code2")); json.put("material_id", form.getString("material_id")); json.put("task_group_id", form.getString("task_group_id")); - json.put("sort_seq", form.getString("sort_seq")); + json.put("is_auto_issue", form.getString("is_auto_issue")); + json.put("table_fk", form.getString("table_fk")); + json.put("sort_seq", form.getIntValue("sort_seq")); json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); json.put("handle_class", THIS_CLASS); @@ -182,6 +186,6 @@ public class TwoOutTask extends AbstractAcsTask { @Override public void cancel(String task_id) { JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, "0"); + this.updateTaskStatus(taskObj, IOSEnum.IS_NOTANDYES.code("否")); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java new file mode 100644 index 000000000..e25acb39e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java @@ -0,0 +1,164 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.CutConveyorTask; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class TwoSendOutTask extends AbstractAcsTask { + private final String THIS_CLASS = TwoSendOutTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + // 更新删除字段 + jsonTask.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonPoint2.put("vehicle_code", ""); + pointTab.update(jsonPoint2); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + // 更新暂存区点位状态 + JSONObject jsonPoint2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonPoint2.put("vehicle_code", jsonTask.getString("vehicle_code")); + pointTab.update(jsonPoint2); + } + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); + CutConveyorTask cutConveyorTask = new CutConveyorTask(); + + String point_code2 = form.getString("point_code2"); + if (cutConveyorTask.isSingleTask(point_code2)) { + throw new BadRequestException("点位:" + point_code2 + "存在未完成的任务!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("point_code1")); + json.put("point_code2", form.getString("point_code2")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("handle_class", THIS_CLASS); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + tab.insert(json); + + // 下发 + immediateNotifyAcs(json.getString("task_id")); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqTask.java new file mode 100644 index 000000000..6c5f15ee7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqTask.java @@ -0,0 +1,228 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 4 目标待检区, 满轴缓存位 -> 待检区,agv任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class DjqTask extends AbstractAcsTask { + @Resource + private IschBaseTaskService taskService; + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + @Resource + private MzhcwTask mzhcwTask; + @Resource + private ZxqTask zxqTask; + + private final String THIS_CLASS = DjqTask.class.getName(); + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 待检区更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //todo 3.手持确认包装关系,生产包装关系表数据 + //todo 4.根据子卷包装关系查询木箱号,调刘先源的空木箱出库服务创建出库任务 + //5.查询是否有未下发的输送线->满轴位任务,有就下发 + List notIssueTaskList = taskService.list(new LambdaUpdateWrapper() + //确定起点 + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode())); + if (CollectionUtils.isNotEmpty(notIssueTaskList)) { + JSONObject jo = (JSONObject) JSONObject.toJSON(notIssueTaskList.get(0)); + jo.put("point_code2", schBaseTask.getPoint_code1()); + jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + jo.put("is_send", true); + mzhcwTask.createTask(jo); + } + //6.创建子卷搬运到装箱区任务 + List zxqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("装箱区")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + //装箱区有点位,就下发 + if (CollectionUtils.isNotEmpty(zxqPointList)) { + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); + jo.put("point_code1", schBaseTask.getPoint_code2()); + jo.put("point_code2", zxqPointList.get(0).getPoint_code()); + jo.put("vehicle_code", schBaseTask.getVehicle_code()); + zxqTask.createTask(jo); + } + //todo 装箱区没有点位 + + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 待检区强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 待检区取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java new file mode 100644 index 000000000..5ab6aa1a6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java @@ -0,0 +1,205 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 4 目标管制区, 满轴缓存位 -> 管制区,agv任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class GzqTask extends AbstractAcsTask { + + private final String THIS_CLASS = GzqTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + @Resource + private MzhcwTask mzhcwTask; + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 管制区更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //3.查询是否有未下发的输送线->满轴位任务,有就下发 + List notIssueTaskList = taskService.list(new LambdaUpdateWrapper() + //确定起点 + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode())); + if (CollectionUtils.isNotEmpty(notIssueTaskList)) { + JSONObject jo = (JSONObject) JSONObject.toJSON(notIssueTaskList.get(0)); + jo.put("point_code2", schBaseTask.getPoint_code1()); + jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + jo.put("is_send", true); + mzhcwTask.createTask(jo); + } + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 管制区强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 管制区取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java new file mode 100644 index 000000000..ec58d79c4 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java @@ -0,0 +1,219 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 3 目标空载具缓存位, 待检区或管制区 -> 空载具缓存位 , 补空载具, agv任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class KzjhcwTask extends AbstractAcsTask { + + + private final String THIS_CLASS = KzjhcwTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + + @Resource + private KzjhcwTask kzjhcwTask; + + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("待检区或管制区 -> 空载具缓存位更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //3.待检区搬运空载具到空载具缓存位完毕,判断是否有未下发的空载具送输送线任务,有就下发 + List bstIvtPackageinfoivtList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + //待检区和管控区点位 + List djqPointList = bstIvtPackageinfoivtList.stream().filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("待检区").equals(r.getPoint_status()) + || PackageInfoIvtEnum.POINT_STATUS.code("管制区").equals(r.getPoint_status())).collect(Collectors.toList()); + List taskList = taskService.list(new LambdaQueryWrapper() + //确定起点未下发 + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode()) + .and(r -> + r.in(SchBaseTask::getPoint_code1, djqPointList) + ) + ); + taskList.forEach(r -> { + //任务下发 + kzjhcwTask.immediateNotifyAcs(r.getTask_id().toString()); + } + ); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区或管制区 -> 空载具缓存位强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区或管制区 -> 空载具缓存位取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java new file mode 100644 index 000000000..42a19299c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java @@ -0,0 +1,327 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.pdm.productionplan.service.IpdmBiSlittingproductionplanService; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvdisServiceImpl; +import org.nl.common.enums.ContainerLevelEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + + +/** + * 1 目标满轴缓存位, 输送线点位 -> 满轴缓存位,桁架任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class MzhcwTask extends AbstractAcsTask { + + private final String THIS_CLASS = MzhcwTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + @Resource + private IpdmBiSlittingproductionplanService productionPlanService; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + @Resource + private DjqTask djqTask; + @Resource + private GzqTask gzqTask; + + + @Resource + private KzjhcwTask kzjhcwTask; + + @Resource + private SsxDjwTask ssxDjwTask; + + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + //.agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("输送线点位 -> 满轴缓存位更新接口任务号为空!"); + } + // 执行中 + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + // 完成 + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //3.查询子卷信息,去分切计划表查找定级数据,桁架任务完成根据子卷定级创建AGV任务将满轴搬运至质检区或管制区 + if (StringUtils.isBlank(schBaseTask.getVehicle_code())) { + throw new BadRequestException("子卷号不能为空!"); + } + PdmBiSlittingproductionplan containerInfo = productionPlanService.getOne(new LambdaUpdateWrapper() + .eq(PdmBiSlittingproductionplan::getContainer_name, schBaseTask.getVehicle_code())); + if (containerInfo == null) { + throw new BadRequestException("找不到子卷信息!"); + } + //子卷等级 + String level = containerInfo.getLevel(); + if (Arrays.stream(ContainerLevelEnum.values()).noneMatch(enumItem -> enumItem.getCode().equals(level))) { + throw new BadRequestException("非法的子卷等级!"); + } + //查询待检区和管制区库位情况 + List bstIvtPackageinfoivtList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + JSONObject toDjqTask = new JSONObject(); + //获取子卷号 + toDjqTask.put("vehicle_code", containerInfo.getContainer_name()); + // 判断子卷等级属于待检区还是管制区,创建满轴缓存位到待检区或管制区的agv任务 + if (Stream.of(ContainerLevelEnum.BEST, ContainerLevelEnum.WELL, ContainerLevelEnum.COMMON).anyMatch(enumItem -> enumItem.getCode().equals(level))) { + List djqPointList = bstIvtPackageinfoivtList.stream() + .filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("待检区").equals(r.getPoint_status()) + && PackageInfoIvtEnum.IVT_STATUS.code("空").equals(r.getIvt_status())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(djqPointList)) { + throw new BadRequestException("待检区暂无空余库位!"); + } + toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); + toDjqTask.put("point_code1", schBaseTask.getPoint_code2()); + toDjqTask.put("point_code2", djqPointList.get(0).getPoint_code()); + djqTask.createTask(toDjqTask); + } else if (Stream.of(ContainerLevelEnum.REWORK, ContainerLevelEnum.CONTROL).anyMatch(enumItem -> enumItem.getCode().equals(level))) { + List gkqPointList = bstIvtPackageinfoivtList.stream() + .filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("管制区").equals(r.getPoint_status()) + && PackageInfoIvtEnum.IVT_STATUS.code("空").equals(r.getIvt_status())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(gkqPointList)) { + throw new BadRequestException("管控区暂无空余库位!"); + } + toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->管制区")); + toDjqTask.put("point_code1", schBaseTask.getPoint_code2()); + toDjqTask.put("point_code2", gkqPointList.get(0).getPoint_code()); + gzqTask.createTask(toDjqTask); + } + //4.创建空载具到输送线任务 + List kzjPointList = bstIvtPackageinfoivtList.stream() + .filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位").equals(r.getPoint_status()) + && PackageInfoIvtEnum.IVT_STATUS.code("空载具").equals(r.getIvt_status())).collect(Collectors.toList()); + JSONObject toSsxTask = new JSONObject(); + toSsxTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")); + toSsxTask.put("vehicle_code", containerInfo.getContainer_name()); + //判断空载具缓存位是否有空载具库存,有就叫agv去任一一个位置搬空载具 + if (CollectionUtils.isNotEmpty(kzjPointList)) { + //直接创建搬运空载具任务 + toSsxTask.put("point_code1", kzjPointList.get(0).getPoint_code()); + //终点为输送线点位 + toSsxTask.put("point_code2", schBaseTask.getPoint_code1()); + ssxDjwTask.createTask(toSsxTask); + } else { + //空载具缓存位没有可用的库存:判断是否有正在搬运空载具过来的任务,有的话不创建 + //没有的话创建搬运空载具任务, 当任务完成的时候,补发桁架任务。 + List packageinfoivtList = packageinfoivtService.list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用"))); + //todo 查找正在搬运到待检区的任务,假设只有一个 + List taskList = taskService.list(new LambdaUpdateWrapper() + //执行中 + .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()) + .and( + r -> r.in(SchBaseTask::getPoint_code2, packageinfoivtList) + )); + //没有正在搬运空载具过来的任务,创建搬运空载具任务 + if (CollectionUtils.isEmpty(taskList)) { + //查询待检区库位有空载具的 + List djqOrGzqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .in(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.POINT_STATUS.code("管制区")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具")).orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + List djqPointList = djqOrGzqPointList.stream().filter(r -> r.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区"))).collect(Collectors.toList()); + //待检区库位有空载具 + if (CollectionUtils.isNotEmpty(djqPointList)) { + List kzjPoint = packageinfoivtList.stream() + .filter(r -> PackageInfoIvtEnum.IVT_STATUS.code("空载具").equals(r.getIvt_status())) + .sorted(Comparator.comparing(BstIvtPackageinfoivt::getSort_seq)) + .collect(Collectors.toList()); + //创建搬运空载具任务 + JSONObject toKzjhcwTask = new JSONObject(); + if (CollectionUtils.isNotEmpty(djqPointList)) { + //优先去待检区取空载具 + toKzjhcwTask.put("point_code1", djqPointList.get(0).getPoint_code()); + } else { + + toKzjhcwTask.put("point_code1", djqOrGzqPointList.get(0).getPoint_code()); + } + toKzjhcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区->空载具缓存位)")); + //送到到任意空载具缓存位 + toKzjhcwTask.put("point_code2", kzjPoint.get(0).getPoint_code()); + toKzjhcwTask.put("vehicle_code", containerInfo.getContainer_name()); + kzjhcwTask.createTask(toKzjhcwTask); + } + //todo 待检区和管制区都无空载具情况 + } + } + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + // 更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("输送线点位 -> 满轴缓存位强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("输送线点位 -> 满轴缓存位取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java new file mode 100644 index 000000000..1476a8f99 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java @@ -0,0 +1,212 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 2 目标输送线点位, 空载具缓存位 -> 输送线,桁架任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class SsxDjwTask extends AbstractAcsTask { + + private final String THIS_CLASS = SsxDjwTask.class.getName(); + + @Resource + private IschBaseTaskService taskService; + + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + + @Resource + private KzjhcwTask kzjhcwTask; + + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + //.agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(StringUtils.isNotBlank(taskObj.getString("task_code1")), SchBaseTask::getTask_code, taskObj.getString("task_code1")), false); + if (schBaseTask == null) { + throw new BadRequestException("空载具缓存位 -> 输送线更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //3.空载具缓存位到输送线送空任务完成,去待检区或管制区补空载具 + List djqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .in(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.POINT_STATUS.code("管制区")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + //有空载具 + if (CollectionUtils.isNotEmpty(djqPointList)) { + //创建搬运空载具任务 + JSONObject toKzjhcwTask = new JSONObject(); + toKzjhcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区->空载具缓存位)")); + toKzjhcwTask.put("point_code1", djqPointList.get(0).getPoint_code()); + //任务起点为补空载具终点 + toKzjhcwTask.put("point_code2", schBaseTask.getPoint_code1()); + kzjhcwTask.createTask(toKzjhcwTask); + } + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false) ; + if (schBaseTask == null) { + throw new BadRequestException("空载具缓存位 -> 输送线强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false) ; + if (schBaseTask == null) { + throw new BadRequestException("空载具缓存位 -> 输送线取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java new file mode 100644 index 000000000..f12e0792a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java @@ -0,0 +1,197 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 6 目标装箱对接位, 装箱区 -> 装箱对接位,桁架任务 + * + * @author gbx + * @since 2024-02-01 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class ZxDjwTask extends AbstractAcsTask { + @Resource + private IschBaseTaskService taskService; + @Resource + private OutBoxManageService outBoxManageService; + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + private final String THIS_CLASS = ZxDjwTask.class.getName(); + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + //.agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("满轴缓存位 -> 管制区更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //3.创建空木箱出库任务 + //device_code:终点,box_length: 长,box_width: 宽,box_high: 高,num: 子卷数 + JSONObject boxInfo = new JSONObject(); + boxInfo.put("device_code", schBaseTask.getPoint_code2()); + outBoxManageService.outBox(boxInfo); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("装箱区 -> 装箱对接位强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("装箱区 -> 装箱对接位取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java new file mode 100644 index 000000000..54f5ecca3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java @@ -0,0 +1,221 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; +import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + + +/** + * 5 目标装箱区,待检区 -> 装箱区 ,agv任务 + * + * @author gbx + * @since 2024-02-01 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class ZxqTask extends AbstractAcsTask { + @Resource + private IschBaseTaskService taskService; + @Resource + private ZxDjwTask zxDjwTask; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + @Resource + private IpdmBiSubpackagerelationService subpackageRelationService; + + + private final String THIS_CLASS = ZxqTask.class.getName(); + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统")) + //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) + //.dtl_type(r.getDtl_type()) + //.params(r.getParams()) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(taskObj.getString("task_code")), SchBaseTask::getTask_code, taskObj.getString("task_code")), false); + ; + if (schBaseTask == null) { + throw new BadRequestException("待检区 -> 装箱区更新接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //todo 3.刘先源的空木箱出库任务完成状态更新时,判断装箱区是否存在木箱号对应的子卷,如果存在,就创建搬运任务 + //4.查询子卷对应的包装关系表,判断装箱位的木箱号是否为子卷对应的木箱号,是,创建搬运任务到装箱对接位位,否,什么都不做 + PdmBiSubpackagerelation pdmBiSubpackagerelation = subpackageRelationService + .getOne(new LambdaUpdateWrapper().eq(PdmBiSubpackagerelation::getContainer_name, schBaseTask.getVehicle_code()), false); + if (pdmBiSubpackagerelation != null) { + //查询目标点位信息 + BstIvtPackageinfoivt zxqPoint = packageinfoivtService.getOne(new LambdaUpdateWrapper().eq(BstIvtPackageinfoivt::getPoint_code, schBaseTask.getPoint_code2())); + //查询装箱对接位的木箱号和区域与子卷对应的木箱号与区域是否匹配 + BstIvtPackageinfoivt zxdjwPoint = packageinfoivtService.getOne(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getContainer_name, pdmBiSubpackagerelation.getPackage_box_sn()).eq(BstIvtPackageinfoivt::getBlock, zxqPoint.getBlock())); + if (zxdjwPoint != null) { + //创建搬运任务到装箱位 + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("装箱区->装箱对接位")); + jo.put("point_code1", schBaseTask.getPoint_code2()); + jo.put("point_code2", zxdjwPoint.getPoint_code()); + jo.put("vehicle_code", schBaseTask.getVehicle_code()); + zxDjwTask.createTask(jo); + } + } + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //更新任务表删除字段 + schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code("是")); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String task_type = form.getString("task_type"); + if (StrUtil.isBlank(task_type)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicle_code = form.getString("vehicle_code"); + if (StrUtil.isBlank(vehicle_code)) { + throw new BadRequestException("载具号不能为空"); + } + String point_code1 = form.getString("point_code1"); + if (StrUtil.isBlank(point_code1)) { + throw new BadRequestException("起点不能为空"); + } + String point_code2 = form.getString("point_code2"); + if (StrUtil.isBlank(point_code2)) { + throw new BadRequestException("下一点不能为空"); + } + JSONObject json = new JSONObject(); + String point_code3 = form.getString("point_code3"); + String point_code4 = form.getString("point_code4"); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("priority", "1"); + json.put("point_code1", point_code1); + json.put("point_code2", point_code2); + json.put("point_code3", point_code3); + json.put("point_code4", point_code4); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("task_status", StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")); + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + json.put("is_send", isSend); + json.put("product_area", form.getString("product_area")); + taskService.save(json.toJavaObject(SchBaseTask.class)); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(json.getString("task_id")); + } + return json.getString("task_id"); + } + + + @Override + public void forceFinish(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区 -> 装箱区强制完成接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public void cancel(String task_id) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(StringUtils.isNotBlank(task_id), SchBaseTask::getTask_id, task_id), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区 -> 装箱区取消接口任务号为空!"); + } + schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消")); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(Long.valueOf(SecurityUtils.getCurrentUserId())); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java new file mode 100644 index 000000000..3df8a5633 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java @@ -0,0 +1,19 @@ +package org.nl.b_lms.storage_manage.database.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author author + * @since 2024-01-30 + */ +@RestController +@RequestMapping("/api/boxinfo") +public class BstIvtBoxinfoController { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxlashboundController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxlashboundController.java new file mode 100644 index 000000000..c1863126a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxlashboundController.java @@ -0,0 +1,19 @@ +package org.nl.b_lms.storage_manage.database.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author author + * @since 2024-02-06 + */ +@RestController +@RequestMapping("/bst-ivt-boxlashbound") +public class BstIvtBoxlashboundController { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java new file mode 100644 index 000000000..cca13e463 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java @@ -0,0 +1,31 @@ +package org.nl.b_lms.storage_manage.database.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; + +/** + *

+ * 服务类 + *

+ * + * @author author + * @since 2024-01-30 + */ +public interface IBstIvtBoxinfoService extends IService { + + /** + * 根据mes信息插入木箱信息 + * @param whereJson:{ + * Length:长 + * Width:宽 + * Height:高 + * ProductName:物料编码 + * Description:物料名称(根据"|"截取第三个和第四个之间的数值 = 子卷数) + * ContainerName:木箱号 + * } + * @return BstIvtBoxinfo: 木箱信息实体类 + */ + BstIvtBoxinfo mesInsert(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxlashboundService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxlashboundService.java new file mode 100644 index 000000000..ecb201146 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxlashboundService.java @@ -0,0 +1,16 @@ +package org.nl.b_lms.storage_manage.database.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; + +/** + *

+ * 服务类 + *

+ * + * @author author + * @since 2024-02-06 + */ +public interface IBstIvtBoxlashboundService extends IService { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxinfo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxinfo.java new file mode 100644 index 000000000..4a0d58f36 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxinfo.java @@ -0,0 +1,81 @@ +package org.nl.b_lms.storage_manage.database.service.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author author + * @since 2024-01-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("bst_ivt_boxinfo") +@Builder +public class BstIvtBoxinfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /* + * 木箱标识 + */ + @TableId(value = "box_id") + private Long box_id; + + /* + * 木箱号 + */ + private String box_no; + + /* + * 木箱物料号 + */ + private String material_code; + + /* + * 木箱物料名称 + */ + private String material_name; + + /* + * 子卷数 + */ + private String num; + + /* + * 木箱长度 + */ + private String box_length; + + /* + * 木箱宽度 + */ + private String box_width; + + /* + * 木箱高度 + */ + private String box_high; + + /* + * 捆绑数量 + */ + private String lash_num; + + /* + * 插入时间 + */ + private String insert_time; + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxlashbound.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxlashbound.java new file mode 100644 index 000000000..ddf4e4f1d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/BstIvtBoxlashbound.java @@ -0,0 +1,38 @@ +package org.nl.b_lms.storage_manage.database.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author author + * @since 2024-02-06 + */ +@Data +@Builder +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("bst_ivt_boxlashbound") +public class BstIvtBoxlashbound implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + private Long lash_id; + + private Long bound_id; + + private String box_no; + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.java new file mode 100644 index 000000000..af0c80b12 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.java @@ -0,0 +1,16 @@ +package org.nl.b_lms.storage_manage.database.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; + +/** + *

+ * Mapper 接口 + *

+ * + * @author author + * @since 2024-01-30 + */ +public interface BstIvtBoxinfoMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/xml/SchBasePointMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml similarity index 61% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/xml/SchBasePointMapper.xml rename to lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml index 1f63febf6..b5f9bd6a9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/xml/SchBasePointMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml @@ -1,6 +1,5 @@ - - + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.java new file mode 100644 index 000000000..68e092ce2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.java @@ -0,0 +1,16 @@ +package org.nl.b_lms.storage_manage.database.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; + +/** + *

+ * Mapper 接口 + *

+ * + * @author author + * @since 2024-02-06 + */ +public interface BstIvtBoxlashboundMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.xml new file mode 100644 index 000000000..c9599a51a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxlashboundMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxinfoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxinfoServiceImpl.java new file mode 100644 index 000000000..c8d1e65a5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxinfoServiceImpl.java @@ -0,0 +1,55 @@ +package org.nl.b_lms.storage_manage.database.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; +import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; +import org.nl.common.utils.IdUtil; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author author + * @since 2024-01-30 + */ +@Service +public class BstIvtBoxinfoServiceImpl extends ServiceImpl implements IBstIvtBoxinfoService { + + @Override + public BstIvtBoxinfo mesInsert(JSONObject whereJson) { + + BstIvtBoxinfo boxDao = BstIvtBoxinfo.builder() + .box_id(IdUtil.getLongId()) + .box_high(whereJson.getString("Height")) + .box_length(whereJson.getString("Length")) + .box_width(whereJson.getString("Width")) + .material_code(whereJson.getString("ProductName")) + .material_name(whereJson.getString("Description")) + .box_no(whereJson.getString("ContainerName")) + .insert_time(DateUtil.now()) + .build(); + + //TODO 根据木箱规格判断木箱的捆扎次数(定义规则) + + // 截取子卷号 + String description = whereJson.getString("Description"); + + try { + String one = description.substring(description.indexOf("|") + 1); + String two = one.substring(one.indexOf("|") + 1); + String num = two.substring(two.indexOf("|") + 1,two.indexOf("|") + 2); + boxDao.setNum(num); + }catch (Exception e) { + boxDao.setNum("截取失败,请检查mes数据!"); + } + + this.save(boxDao); + + return boxDao; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxlashboundServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxlashboundServiceImpl.java new file mode 100644 index 000000000..b5727725f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/impl/BstIvtBoxlashboundServiceImpl.java @@ -0,0 +1,20 @@ +package org.nl.b_lms.storage_manage.database.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxlashboundService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; +import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxlashboundMapper; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author author + * @since 2024-02-06 + */ +@Service +public class BstIvtBoxlashboundServiceImpl extends ServiceImpl implements IBstIvtBoxlashboundService { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index 87abb2156..87935df8e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java @@ -60,7 +60,8 @@ public enum IOSEnum { //仓位锁定类型 LOCK_TYPE(MapOf.of("未锁定", "1", "入库锁", "2", "出库锁", "3", "空托盘出库锁", "4", - "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7", "其它", "99" + "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7","木箱入库锁","8","木箱出库锁","9", + "出库异常锁","10","其它", "99" )), //仓库id @@ -75,14 +76,23 @@ public enum IOSEnum { //库区类型 SECT_TYPE(MapOf.of("主存区", "00","暂存区","01","虚拟区","09")), + //库区 + SECT_ID(MapOf.of("二期主存区", "1748219897940414464")), + //库存变动类型 IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32","加冻结","11","减冻结","12","减库存","21")), //仓位伸位 ZDEPTH_STRUCT(MapOf.of("浅", "1","深","2","无","3")), + //是否自动下发 + IS_SEND(MapOf.of("是", "1","否","2")), + //外部系统 EXT_SYSTEM(MapOf.of("mes", "mes","sap","sap","crm","crm")), + + //acs申请任务 + ACSTOLMS_TYPE(MapOf.of("成品入库任务", "1","空盘入库","2","空盘出库","3","异常处理位","4","贴标","1","捆扎","2")), ; private Map code; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java index 7e75b7624..4367d8d46 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java @@ -119,4 +119,11 @@ public interface IStIvtIostorinvOutService extends IService { * } */ void confirm(JSONObject whereJson); + + + /** + * 标识完成 + * @param whereJson: 任务对象 + */ + void finishTask(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java index c38deadeb..29b418ee6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java @@ -107,7 +107,7 @@ public interface IStIvtIostorinvService extends IService { * checked:是否自动分类(true、false) -- 用不到 * } */ - void setPoint(Map whereJson); + String setPoint(Map whereJson); /** * 下发任务 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java index bbb647e24..8bedc8387 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java @@ -2,6 +2,7 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,6 +22,7 @@ import java.math.BigDecimal; @EqualsAndHashCode(callSuper = false) @TableName("st_ivt_iostorinvdis") @Builder +@AllArgsConstructor public class StIvtIostorinvdis implements Serializable { private static final long serialVersionUID = 1L; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml index acfd2a780..472573f75 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml @@ -113,7 +113,7 @@ ST_IVT_IOStorInvDis dis LEFT JOIN pdm_bi_subpackagerelation sub ON sub.container_name = dis.pcsn WHERE - 1 = 1 + dis.work_status = '00' AND dis.iostorinvdtl_id= #{iostorinvdtl_id} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java index 61901cf57..5f2540ab9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java @@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.nl.b_lms.pdm_manage.enums.SUBEnum; +import org.nl.b_lms.sch.tasks.TwoOutExceptionalTask; +import org.nl.b_lms.sch.tasks.TwoOutTask; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; @@ -21,6 +23,7 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvOutMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBussManageService; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; @@ -30,6 +33,7 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.basedata.st.service.StorattrService; import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -87,6 +91,12 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl arr = taskTab.query("handle_class = '" + TwoOutTask.class.getName() + "' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "' and is_delete ='0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isNotEmpty(arr)) { + throw new BadRequestException("当前有出库任务正在执行,请稍后在试!"); + } + // 查询此明细所有未生成的分配明细 List disDaoList = stIvtIostorinvdisMapper.getNotCreateDis(whereJson); @@ -548,6 +568,18 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disLikeList : groupingDisMap.values()) { // 调用任务生成处理 List taskMangeList = createTaskMange(disLikeList,mstDao.getIostorinv_id().toString()); + + // 创建任务并下发一组任务 + createTask(taskMangeList,disLikeList,whereJson.getString("point_code")); + } + + // 下发任务:判断当前单据是否有正在执行的的任务 + JSONArray disArr = taskTab.query("table_fk = '" + mstDao.getIostorinv_id().toString() + "' and is_delete = '0' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "'") + .getResultJSONArray(0); + + if (ObjectUtil.isEmpty(disArr)) { + TwoOutTask twoOutTask = new TwoOutTask(); + twoOutTask.immediateNotifyAcs(null); } } @@ -625,11 +657,13 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl '" + TaskStatusEnum.FINISHED.getCode() + "' and task_id = '" + whereJson.getString("task_id") + "'") + .uniqueResult(0); + + if (jsonTask == null) { + throw new BadRequestException("查询不到操作的任务记录!"+whereJson.getString("task_id")); + } + + // 查询分配明细 + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getTask_id, whereJson.getString("task_id")) + ); + + StIvtIostorinvdis disDao = disDaoList.get(0); + + // 查询主表 + StIvtIostorinv mstDao = this.getById(disDao.getIostorinv_id()); + + if (ObjectUtil.isEmpty(mstDao)) { + throw new BadRequestException("未查询到对应的出库单据!"); + } + + if (IOSEnum.OUT_TYPE.code("改切出库").equals(mstDao.getBill_type()) || IOSEnum.OUT_TYPE.code("返检出库").equals(mstDao.getBill_type())) { + HashMap map = new HashMap<>(); + map.put("need_delete", IOSEnum.IS_NOTANDYES.code("是")); + + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + jsonTask.getString("vehicle_code") + "'"); + + JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + jsonTask.getString("vehicle_code") + "'").getResultJSONArray(0); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + //插入包装关系出入库记录表 + row.put("bill_code", mstDao.getBill_code()); + row.put("bill_id", mstDao.getIostorinv_id()); + row.put("bill_type", mstDao.getBill_type()); + row.put("io_type", IOSEnum.IO_TYPE.code("出库")); + row.put("insert_time", DateUtil.now()); + row.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId()); + WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord").insert(row); + } + } + + //更新任务为完成 + HashMap map = new HashMap<>(); + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'"); + + // 查询此任务下所有的分配明细 + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("完成")); + }); + + iStIvtIostorinvdisService.updateBatchById(disDaoList); + + // 更新明细状态 + iStIvtIostorinvdtlService.updateStatus(disDao.getIostorinvdtl_id()); + + //判断是否还有未完成的明细 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + .ne(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("完成")) + ); + + if (ObjectUtil.isEmpty(dtlDaoList)) { + this.confirm(JSONObject.parseObject(JSON.toJSONString(mstDao))); + } + } + /** * 创建调拨入库单 * @param disDaoList:出库分配明细集合 @@ -882,10 +996,10 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl attrRowList = attrTab.query("stor_id = '" + IOSEnum.STOR_ID.code("二期") + "' AND row_num IN ('" + rowIn + "')") .getResultJSONArray(0).toJavaList(JSONObject.class); - // 需生成出库任务的仓位集合 + // 需移库仓位集合 List needMoveAttrList = new ArrayList<>(); - // 需移库仓位集合 + // 需生成出库任务的仓位集合 List needCreateAttrList = new ArrayList<>(); // 循环准备任务参数 @@ -894,19 +1008,22 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl attrRowList, String iostorinv_id) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONObject result = new JSONObject(); @@ -941,15 +1064,225 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, iostorinv_id) + .eq(StIvtIostorinvdis::getBox_no, jsonLow.getString("storagevehicle_code")) + ); + + if (ObjectUtil.isNotEmpty(disDaoList)) { + // 相同 + JSONObject jsonSub1 = subTab.query("package_box_sn = '" + jsonAttr.getString("storagevehicle_code") + "'").uniqueResult(0); + JSONObject jsonSub2 = subTab.query("package_box_sn = '" + jsonLow.getString("storagevehicle_code") + "'").uniqueResult(0); + + if (jsonSub1.getString("sale_order_name").equals(jsonSub2.getString("sale_order_name")) && + jsonSub1.getString("box_length").equals(jsonSub2.getString("box_length")) && + jsonSub1.getString("box_width").equals(jsonSub2.getString("box_width")) && + jsonSub1.getString("box_high").equals(jsonSub2.getString("box_high")) && + jsonSub1.getString("product_name").equals(jsonSub2.getString("product_name"))) { + + flag = false; + } else { + // 不相同:判断是否有此木箱的任务 + JSONObject jsonTask = taskTab.query("table_fk = '" + iostorinv_id + "' and vehicle_code = '" + jsonLow.getString("storagevehicle_code") + "' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(jsonTask)) { + flag = false; + } + + } + } + + if (flag) { + // 查询移入货位 + JSONObject moveParam = new JSONObject(); + moveParam.put("stor_id", IOSEnum.STOR_ID.code("二期")); + moveParam.put("sect_id", RegionTypeEnum.TWO_ZZ01.getId()); + moveParam.put("box_no", jsonLow.getString("storagevehicle_code")); + // moveParam.put("material_id", jsonMater.getString("material_id")); + JSONObject jsonMove = inBussManageService.getOneStruct(moveParam); + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("start_device_code", jsonLow.getString("struct_code")); + jsonTaskParam.put("next_device_code", jsonMove.getString("struct_code")); + jsonTaskParam.put("vehicle_code", jsonLow.getString("storagevehicle_code")); + jsonTaskParam.put("table_fk", iostorinv_id); + + TwoOutExceptionalTask taskBean = new TwoOutExceptionalTask(); + String task_id = taskBean.createTask(jsonTaskParam); + taskBean.immediateNotifyAcs(task_id); + + // 锁定:标记货位为异常并生成异常移库任务 + jsonLow.put("lock_type", IOSEnum.LOCK_TYPE.code("出库异常锁")); + jsonLow.put("task_code", task_id); + attrTab.update(jsonLow); + + // 更新移入货位为出库异常货位 + jsonMove.put("lock_type",IOSEnum.LOCK_TYPE.code("出库异常锁")); + jsonLow.put("task_code", task_id); + attrTab.update(jsonMove); + } } } return result; } + /** + * 创建任务 + * @param taskMangeList:仓位集合 + * @param disLikeList:分配明细集合 + * @param point_code : 终点 + */ + private void createTask(List taskMangeList,List disLikeList, String point_code) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + // 查询异常货位任务集合 + String TaskCodeIn = taskMangeList.stream() + .filter(row -> row.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁"))) + .map(row -> row.getString("task_code")) + .distinct().collect(Collectors.joining("','")); + + List taskList = taskTab.query("task_id IN ('" + TaskCodeIn + "') and is_delete = '0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 任务组标识 + String task_group_id = IdUtil.getStringId(); + + // 起点 + String start_device_code = ""; + // 是否自动下发 + String is_auto_issue = IOSEnum.IS_SEND.code("是"); + + for (int i = 0; i < taskMangeList.size(); i++) { + JSONObject json = taskMangeList.get(i); + start_device_code = json.getString("struct_code"); + + // 过滤此仓位的分配明细 + List disDaoList = disLikeList.stream() + .filter(row -> row.getString("struct_code").equals(json.getString("struct_code"))) + .map(row -> JSONObject.parseObject(JSONObject.toJSONString(row), StIvtIostorinvdis.class)) + .collect(Collectors.toList()); + + // 判断是否是异常货位 + if (json.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁"))) { + /* + * 判断异常货位上的任务是否完成 + * 完成:生成完成任务的point_code2 当做起点的任务 + * 未完成:只更新分配明细状态为生成 + */ + JSONObject jsonTask = taskList.stream() + .filter(row -> row.getString("task_id").equals(json.getString("task_code"))) + .collect(Collectors.toList()).get(0); + + // 完成 + if (jsonTask.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) { + start_device_code = jsonTask.getString("point_code2"); + is_auto_issue = IOSEnum.IS_SEND.code("否"); + } else { + // 未完成:只更新分配明细状态不更新任务id + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + row.setTask_id(Long.parseLong(task_group_id)); + }); + iStIvtIostorinvdisService.updateBatchById(disDaoList); + + // 标记任务 + jsonTask.put("is_auto_issue",IOSEnum.IS_SEND.code("否")); + taskTab.update(jsonTask); + continue; + } + } + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("point_code1", start_device_code); + jsonTaskParam.put("point_code2", point_code); + jsonTaskParam.put("vehicle_code", json.getString("storagevehicle_code")); + jsonTaskParam.put("task_group_id", task_group_id); + jsonTaskParam.put("is_auto_issue", is_auto_issue); + jsonTaskParam.put("table_fk", disDaoList.get(0).getIostorinv_id().toString()); + + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")) || + json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) + { + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("浅"))); + } else { + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("深"))); + } + + TwoOutTask twoOutTask = new TwoOutTask(); + String task_id = twoOutTask.createTask(jsonTaskParam); + + // 更新分配明细 + JSONObject jsonPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); + + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + row.setTask_id(Long.parseLong(task_id)); + row.setPoint_id(jsonPoint.getLongValue("point_id")); + }); + iStIvtIostorinvdisService.updateBatchById(disDaoList); + } + } + + /** + * 更新异常货位 + * @param disDaoList:所有分配明细集合 + */ + private void UpdateExceptional(List disDaoList) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + // 获取仓位集合 + String structCodeIn = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct().collect(Collectors.joining("','")); + + List attrList = attrTab.query("struct_code IN ('" + structCodeIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 过滤异常货位 + List attrExcepList = attrList.stream() + .filter(row -> ObjectUtil.isNotEmpty(row.getString("task_code"))) + .collect(Collectors.toList()); + + // 找所有异常任务 + String taskCodeIn = attrExcepList.stream() + .map(row -> row.getString("task_code")) + .distinct().collect(Collectors.joining("','")); + + List taskList = taskTab.query("task_id IN ('" + taskCodeIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 更新异常货位 + List structCodeInList = new ArrayList<>(); + + for (int i = 0; i < taskList.size(); i++) { + JSONObject json = taskList.get(0); + + structCodeInList.add(json.getString("point_code1")); + structCodeInList.add(json.getString("point_code2")); + } + + JSONObject jsonUpdate = new JSONObject(); + jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonUpdate.put("task_code", ""); + + attrTab.update(jsonUpdate,"struct_code IN ('"+String.join("','",structCodeInList)+"')"); + } /** * 更新主表状态 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java index 0b74a4d30..6a68b1b83 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java @@ -351,6 +351,34 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mst.getIostorinv_id()) + ).get(0); + + List disList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, mst.getIostorinv_id()) + ).stream().map(row -> JSONObject.parseObject(JSON.toJSONString(row), LinkedHashMap.class)) + .collect(Collectors.toList()); + + jsonSend.put("dtl_row",JSONObject.parseObject(JSON.toJSONString(dtlDao))); + jsonSend.put("tableMater", disList); + jsonSend.put("point_code", jsonObject.getString("point_code")); + jsonSend.put("stor_id", mst.getStor_id()); + + String task_id1 = this.setPoint(jsonSend); + + // 下发任务 + JSONObject sendJson = new JSONObject(); + sendJson.put("task_id",task_id1); + this.reIssueTask(sendJson); + } } @Override @@ -423,7 +451,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl list = (ArrayList) whereJson.get("tableMater"); @@ -445,7 +473,6 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl + * 木箱入库业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +public class InBoxManageServiceImpl implements InBoxManageService { + + /** + * 入库不需要查询的排集合 + */ + private List notInRowList = new ArrayList<>(); + + /** + * 入库不需要查询的巷道集合 + */ + private List notInBlockList = new ArrayList<>(); + + /** + * 木箱信息服务 + */ + @Autowired + private IBstIvtBoxinfoService iBstIvtBoxinfoService; + + @Override + @Transactional + public void inBox(JSONObject whereJson) { + /* + * 1.查询mes木箱信息,插入木箱信息表 + * 2.找木箱区的一个仓位 + * 3.插入木箱对象载具表 + */ + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 载具表 + WQLObject vehicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + // 载具扩展属性表 + WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + + /* + * 查询mes木箱信息,插入木箱信息表 + */ + + // 调用mes接口 + JSONObject mesBoxInfo = new JSONObject(); + + // 插入木箱信息表 +// BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.mesInsert(mesBoxInfo); + BstIvtBoxinfo boxDao = BstIvtBoxinfo.builder().build(); + + /* + * 找一个木箱区的一个仓位,生辰任务并下发 + */ + // 判断起点点位是否存在 + JSONObject jsonPoint = pointTab.query("point_code = '" + whereJson.getString("device_code") + "' AND is_delete = '" + + IOSEnum.IS_NOTANDYES.code("否") + "' AND is_used = '" + + IOSEnum.IS_NOTANDYES.code("是") + "'") + .uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPoint)) { + throw new BadRequestException("起始点位不存在或未启用!"); + } + + // 找一个木箱区空位 + JSONObject jsonParam = new JSONObject(); + jsonParam.put("stor_id", IOSEnum.STOR_ID.code("二期")); + jsonParam.put("sect_id", RegionTypeEnum.TWO_MX01.getId()); + jsonParam.put("box_length", boxDao.getBox_length()); + jsonParam.put("box_width", boxDao.getBox_width()); + jsonParam.put("box_high", boxDao.getBox_high()); + + JSONObject jsonAttr = getStruct(jsonParam); + + if (ObjectUtil.isEmpty(jsonAttr)) { + notInRowList.clear(); + notInBlockList.clear(); + throw new BadRequestException("仓位不足!"); + } + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010502"); + jsonTaskParam.put("start_device_code", whereJson.getString("device_code")); + jsonTaskParam.put("next_device_code", jsonAttr.getString("struct_code")); + jsonTaskParam.put("vehicle_code", whereJson.getString("box_no")); + + TwoInBoxTask taskBean = new TwoInBoxTask(); + taskBean.createTask(jsonTaskParam); + + taskBean.immediateNotifyAcs(null); + + // 锁定终点 + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱入库锁")); + attrTab.update(jsonAttr); + + // 清空缓存 + notInRowList.clear(); + notInBlockList.clear(); + + /* + * 插入木箱对应载具表 + */ + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + whereJson.getString("vehicle_code") + "'") + .uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonVehicle)) { + throw new BadRequestException("载具不存在!"); + } + + JSONObject jsonVeExt = new JSONObject(); + jsonVeExt.put("storagevehicleext_id", IdUtil.getLongId()); + jsonVeExt.put("storagevehicle_id", jsonVehicle.getLongValue("storagevehicle_id")); + jsonVeExt.put("storagevehicle_code", jsonVehicle.getString("storagevehicle_code")); + jsonVeExt.put("storagevehicle_type", jsonVehicle.getString("storagevehicle_type")); + jsonVeExt.put("pcsn", whereJson.getString("box_no")); + jsonVeExt.put("device_uuid", IdUtil.getLongId()); + veExtTab.insert(jsonVeExt); + } + + /** + * 找一个空仓位(木箱区) + * @param jsonParam { + * stor_id:仓库标识 + * sect_id:库区标识 + * box_length:木箱长度 + * box_width:木箱宽度 + * box_high:木箱高度 + * } + * @return JSONObject : 仓位对象 + */ + public JSONObject getStruct(JSONObject jsonParam) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + /* + * 判断是否有仓位 + * 判断条件:库区、仓库、是否启用、是否删除、未锁定、没有载具 + */ + JSONArray structArray = attrTab.query("IFNULL(storagevehicle_code,'') = '' " + + "AND is_used = '" + IOSEnum.IS_NOTANDYES.code("是") + "' AND is_delete = '" + IOSEnum.IS_NOTANDYES.code("否") + "' " + + "AND lock_type = '" + IOSEnum.LOCK_TYPE.code("未锁定") + "' AND stor_id = '"+jsonParam.getString("stor_id")+"' " + + "AND sect_id = '"+jsonParam.getString("sect_id")+"'").getResultJSONArray(0); + + if (ObjectUtil.isEmpty(structArray)) { + notInRowList.clear(); + notInBlockList.clear(); + throw new BadRequestException("仓位不足!"); + } + + // 确定巷道:查看每个巷道最小木箱数的巷道,获取最小木箱数的巷道 + String block_num = getMinBlock(jsonParam); + + // 确定排:查看每排的木箱数量,找到数量最小的那排 + jsonParam.put("block_num",block_num); + String row_num = getMinRow(jsonParam); + + // 确定仓位: 找到仓位 + jsonParam.put("row_num",row_num); + JSONObject jsonAttr = queryStruct(jsonParam); + + // 为空则新找巷道 + if (ObjectUtil.isEmpty(jsonAttr)) { + + jsonParam.put("flag", "1"); + notInBlockList.add(jsonParam.getString("block_num")); + + String join = "('" + String.join("','", notInBlockList) + "')"; + jsonParam.put("not_block", join); + + List blockList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject json = blockList.get(i); + json.put("stor_id", jsonParam.getString("stor_id")); + json.put("sect_id", jsonParam.getString("sect_id")); + json.put("box_length", jsonParam.getString("box_length")); + json.put("box_width", jsonParam.getString("box_width")); + json.put("box_high", jsonParam.getString("box_high")); + + String row_num_2 = getMinRow(json); + json.put("row_num",row_num_2); + JSONObject jsonAttr_2 = queryStruct(json); + + if (ObjectUtil.isNotEmpty(jsonAttr_2)) { + jsonAttr = jsonAttr_2; + break; + } else { + continue; + } + } + } + notInRowList.clear(); + notInBlockList.clear(); + return jsonAttr; + } + + /** + * 确定巷道 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * box_length:木箱长度 + * box_width:木箱宽度 + * box_high:木箱高度 + * } + * @return String 巷道 + */ + private String getMinBlock(JSONObject jsonParam) { + jsonParam.put("flag", "1"); + + // 获取仓库、库区有空位的巷道 + List blockList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属巷道所有木箱 + */ + String block_in = blockList.stream() + .map(row -> row.getString("block_num")) + .collect(Collectors.joining("','")); + + jsonParam.put("flag", "2"); + jsonParam.put("block_in", "('"+block_in+"')"); + + List boxAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有木箱,返回最小巷道 + if (ObjectUtil.isEmpty(boxAllList)) { + return blockList.get(0).getString("block_num"); + } + + // 计算每个巷道的木箱数 + ArrayList blockBoxList = new ArrayList<>(); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject jsonBlock = blockList.get(i); + + List box_num = boxAllList.stream() + .filter(row -> row.getString("block_num").equals(jsonBlock.getString("block_num"))) + .collect(Collectors.toList()); + + jsonBlock.put("box_num", String.valueOf(box_num.size())); + blockBoxList.add(jsonBlock); + } + + // 最小木箱数的巷道 + List boxNumList = blockBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + return boxNumList.get(0).getString("block_num"); + } + + /** + * 确定排 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * block_num: 巷道 + * box_length:木箱长度 + * box_width:木箱宽度 + * box_high:木箱高度 + * } + * @return String 排 + */ + private String getMinRow(JSONObject jsonParam) { + + jsonParam.put("flag", "3"); + + // 获取此仓库、库区、巷道 有空位的排 + List rowList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属排的所有木箱 + */ + String row_in = rowList.stream() + .map(row -> row.getString("row_num")) + .collect(Collectors.joining("','")); + + jsonParam.put("flag", "2"); + jsonParam.put("row_in", "('"+row_in+"')"); + + List boxAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有木箱,返回最小排 + if (ObjectUtil.isEmpty(boxAllList)) { + if (ObjectUtil.isNotEmpty(rowList)) { + return rowList.get(0).getString("row_num"); + } + } + + // 计算最小排的托盘 + ArrayList rowkBoxList = new ArrayList<>(); + + for (int i = 0; i < rowList.size(); i++) { + JSONObject jsonRow = rowList.get(i); + + List box_num = boxAllList.stream() + .filter(row -> row.getString("row_num").equals(jsonRow.getString("row_num"))) + .collect(Collectors.toList()); + + jsonRow.put("box_num", String.valueOf(box_num.size())); + rowkBoxList.add(jsonRow); + } + + // 最小木箱数的排 + List boxNumList = rowkBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + String row_num = ""; + + if (ObjectUtil.isNotEmpty(boxNumList)) { + row_num = boxNumList.get(0).getString("row_num"); + } + return row_num; + } + + /** + * 确定仓位 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * block_num: 巷道 + * row_num: 排 + * box_length:木箱长度 + * box_width:木箱宽度 + * box_high:木箱高度 + * } + * @return JSONObject 仓位对象 + */ + private JSONObject queryStruct(JSONObject jsonParam) { + JSONObject jsonAttr = getStructOne(jsonParam); + + // 为空找此巷道新的一排 + if (ObjectUtil.isEmpty(jsonAttr)) { + notInRowList.add(jsonParam.getString("row_num")); + + if (ObjectUtil.isEmpty(jsonParam.getString("row_num"))) { + return null; + } + + String join = "('" + String.join("','", notInRowList) + "')"; + jsonParam.put("not_row_in", join); + + // 新的一排 + String row_num_new = this.getMinRow(jsonParam); + jsonParam.put("row_num",row_num_new); + + jsonAttr = this.getStructOne(jsonParam); + } + return jsonAttr; + } + + /** + * 获取一个货位公共方法 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * block_num: 巷道 + * row_num: 排 + * box_length:木箱长度 + * box_width:木箱宽度 + * box_high:木箱高度 + * } + * @return JSONObject 仓位对象 + */ + private JSONObject getStructOne(JSONObject jsonParam) { + // 获取此仓库、库区、巷道、排的所有空位 根据列、层、深度排序 + jsonParam.put("flag", "4"); + + List rowStructList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 获取此仓库、库区、巷道、排的所有仓位 + jsonParam.put("flag", "5"); + + List structAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 需要返回的仓位 + JSONObject jsonAttr = new JSONObject(); + + for (int i = 0; i < rowStructList.size(); i++) { + JSONObject json = rowStructList.get(i); + + // 判断伸位 + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) { + // 无需深度 + jsonAttr = json; + break; + + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { + /* + * 深货位:判断浅货位是否被锁定 + */ + + // 获取此货位对应的浅货位 + List lowAttr = structAllList.stream() + .filter(row -> row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) { + notInRowList.clear(); + notInBlockList.clear(); + throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的浅货位错误!"); + } + + // 判断是否被锁定 + JSONObject jsonAttrLow = lowAttr.get(0); + + if (ObjectUtil.isEmpty(jsonAttrLow.getString("storagevehicle_code")) && jsonAttrLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 没有载具和被锁定 + jsonAttr = json; + break; + } else { + continue; + } + + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) { + /* + * 浅货位:判断深货位是否空洞,是否是相同类型的托盘 + */ + // 获取此货位对应的深货位 + List darkAttr = structAllList.stream() + .filter(row -> row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(darkAttr) || darkAttr.size() != 1) { + notInRowList.clear(); + notInBlockList.clear(); + throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的深货位错误!"); + } + + // 判断是否有托盘 + JSONObject jsonAttrDark = darkAttr.get(0); + + if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code"))) { + + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = json; + break; + } else { + continue; + } + } else { + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = jsonAttrDark; + break; + } else { + continue; + } + } + + } + } + return jsonAttr; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java index 908cfe1ed..68080df4a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java @@ -1,14 +1,24 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; import org.nl.common.utils.MapOf; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,6 +37,15 @@ import java.util.stream.Collectors; @Service public class InBussManageServiceImpl implements InBussManageService { + @Autowired + private IStIvtIostorinvService iStIvtIostorinvService; + + @Autowired + private IStIvtIostorinvdtlService iStIvtIostorinvdtlService; + + @Autowired + private IStIvtIostorinvdisService iStIvtIostorinvdisService; + /** * 不需要查询的排集合 */ @@ -144,6 +163,7 @@ public class InBussManageServiceImpl implements InBussManageService { if (ObjectUtil.isNotEmpty(jsonAttr_2)) { jsonAttr = jsonAttr_2; + break; } else { continue; } @@ -156,6 +176,97 @@ public class InBussManageServiceImpl implements InBussManageService { return jsonAttr; } + @Override + @Transactional + public void inTask(JSONObject jsonObject) { + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + + // 处理子卷号 + String material_barcode = jsonObject.getString("material_barcode"); + + if (ObjectUtil.isEmpty(material_barcode)) { + throw new BadRequestException("子卷号不能为空!"); + } + + if (ObjectUtil.isEmpty(jsonObject.getString("device_code"))) { + throw new BadRequestException("设备号不能为空!"); + } + + List pcsnList = Arrays.asList(material_barcode.split(",")); + + // 查询子卷包装关系 + List subList = subTab.query("container_name in ('"+String.join("','", pcsnList)+"') and status = '0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isEmpty(subList)) { + throw new BadRequestException("未查询到子卷包装信息!"); + } + + // 主表 + JSONObject mst = new JSONObject(); + mst.put("stor_id", IOSEnum.STOR_ID.code("二期")); + mst.put("bill_status", IOSEnum.BILL_STATUS.code("生成")); + mst.put("total_qty", subList.stream().map(row -> row.getDoubleValue("net_weight")).reduce(Double::sum).orElse(0.00)); + mst.put("detail_count", subList.size()); + mst.put("bill_type", IOSEnum.IN_TYPE.code("生产入库")); + mst.put("biz_date", DateUtil.today()); + mst.put("remark", ""); + + // 明细 + ArrayList tableData = new ArrayList<>(); + for (int i = 0; i < subList.size(); i++) { + JSONObject json = subList.get(i); + + LinkedHashMap jsonDtl = new LinkedHashMap<>(); + + jsonDtl.put("package_box_sn", json.getString("package_box_sn")); + jsonDtl.put("thickness", json.getString("thickness")); + jsonDtl.put("plan_qty", json.getString("net_weight")); + jsonDtl.put("customer_description", json.getString("customer_description")); + jsonDtl.put("quanlity_in_box", json.getString("quanlity_in_box")); + jsonDtl.put("product_name", json.getString("product_name")); + jsonDtl.put("net_weight", json.getString("net_weight")); + jsonDtl.put("container_name", json.getString("container_name")); + jsonDtl.put("width", json.getString("width")); + jsonDtl.put("sap_pcsn", json.getString("sap_pcsn")); + jsonDtl.put("customer_name", json.getString("customer_name")); + jsonDtl.put("sale_order_name", json.getString("sale_order_name")); + jsonDtl.put("product_description", json.getString("product_description")); + jsonDtl.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品")); + jsonDtl.put("is_active", IOSEnum.IS_SEND.code("是")); + tableData.add(jsonDtl); + } + mst.put("tableData",tableData); + + // 调用服务创建 + String iostorinv_id = iStIvtIostorinvService.insertMst(mst); + + // 调用分配货位并下发 + JSONObject jsonDiv = new JSONObject(); + + StIvtIostorinvdtl dtlDao = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, iostorinv_id) + ).get(0); + + List disList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, iostorinv_id) + ).stream().map(row -> JSONObject.parseObject(JSON.toJSONString(row), LinkedHashMap.class)) + .collect(Collectors.toList()); + + jsonDiv.put("dtl_row",JSONObject.parseObject(JSON.toJSONString(dtlDao))); + jsonDiv.put("tableMater", disList); + jsonDiv.put("checked", true); + jsonDiv.put("is_send", IOSEnum.IS_SEND.code("是")); + jsonDiv.put("point_code", jsonObject.getString("device_code")); + jsonDiv.put("sect_id", IOSEnum.SECT_ID.code("二期主存区")); + jsonDiv.put("stor_id", IOSEnum.STOR_ID.code("二期")); + + iStIvtIostorinvService.divStruct(jsonDiv); + } + /** * 获取最小巷道 * @param jsonSub { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java index 8051f477b..590dc2071 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java @@ -157,6 +157,7 @@ public class InVehicleManageServiceImpl implements InVehicleManageService { if (ObjectUtil.isNotEmpty(jsonAttr_2)) { jsonAttr = jsonAttr_2; + break; } else { continue; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java new file mode 100644 index 000000000..c0282c632 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java @@ -0,0 +1,194 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.nl.b_lms.sch.point.dao.SchBasePoint; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; +import org.nl.b_lms.sch.point.service.IschBasePointService; +import org.nl.b_lms.sch.tasks.TwoLashTask; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxlashboundService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService; +import org.nl.common.utils.IdUtil; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 捆扎业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +@RequiredArgsConstructor +public class LashManageServiceImpl implements LashManageService { + + /** + * 木箱信息服务 + */ + @Autowired + private IBstIvtBoxinfoService iBstIvtBoxinfoService; + + /** + * 点位服务 + */ + @Autowired + private IschBasePointService ischBasePointService; + + /** + * 点位mapper服务 + */ + @Autowired + private SchBasePointMapper schBasePointMapper; + + /** + * 木箱捆扎绑定服务 + */ + @Autowired + private IBstIvtBoxlashboundService iBstIvtBoxlashboundService; + + @Override + @Transactional + public void createLashTask(JSONObject whereJson) { + /* + * 1.判断此木箱是否需要堆叠 + * 2.插入木箱捆扎绑定表 + * 3.生成任务 + */ + // 查询木箱信息 + BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( + new QueryWrapper().lambda() + .eq(BstIvtBoxinfo::getBox_no, whereJson.getString("box_no")) + ); + + if (ObjectUtil.isEmpty(boxDao)) { + throw new BadRequestException("没有此木箱信息:"+whereJson.getString("box_no")); + } + + JSONObject jsonSub = WQLObject.getWQLObject("pdm_bi_subpackagerelation") + .query("package_box_sn = '" + boxDao.getBox_no() + "'") + .uniqueResult(0); + + /* + * 查看点位是否为空: + * 为空记当前载具号,载具数量为1, + * 不为空,加载具数量,当点位载具数量与木箱信息捆扎数量相同时下发捆绑 + */ + // 查询捆扎的两个点位及木箱信息 + List pointDaoList = schBasePointMapper.queryKZPoint(); + + if (ObjectUtil.isEmpty(pointDaoList)) { + throw new BadRequestException("点位不存在,或未启用!"); + } + + // 是否要移动至捆扎位 + String is_move = IOSEnum.IS_NOTANDYES.code("否"); + // 桁架任务终点 + String end_point; + + // 判断是否有相同订单号、木箱规格的木箱 + List likeBoxList = pointDaoList.stream() + .filter(row -> ObjectUtil.isNotEmpty(row.getString("box_length")) && + ObjectUtil.isNotEmpty(row.getString("box_width")) && + ObjectUtil.isNotEmpty(row.getString("box_high")) && + ObjectUtil.isNotEmpty(row.getString("sale_order_name")) + + ) + .filter(row -> row.getString("box_length").equals(boxDao.getBox_length()) && + row.getString("box_width").equals(boxDao.getBox_width()) && + row.getString("box_high").equals(boxDao.getBox_high()) && + row.getString("sale_order_name").equals(jsonSub.getString("sale_order_name")) + ) + .collect(Collectors.toList()); + + if (ObjectUtil.isNotEmpty(likeBoxList)) { + // 加载具数量 + JSONObject jsonPoint = likeBoxList.get(0); + + jsonPoint.put("vehicle_qty", NumberUtil.add(jsonPoint.getBigDecimal("vehicle_qty"),1)); + + if (jsonPoint.getIntValue("vehicle_qty") == Integer.parseInt(boxDao.getLash_num())) { + // 相同清空载具以及数量 + jsonPoint.put("vehicle_qty",0); + jsonPoint.put("vehicle_code",""); + is_move = IOSEnum.IS_NOTANDYES.code("是"); + } + + end_point = jsonPoint.getString("point_code"); + ischBasePointService.updateById(JSON.parseObject(jsonPoint.toString(), SchBasePoint.class)); + + // 查询此点位绑定木箱表 + BstIvtBoxlashbound boundDao = iBstIvtBoxlashboundService.getOne( + new QueryWrapper().lambda() + .eq(BstIvtBoxlashbound::getBox_no, jsonPoint.getString("box_no")) + ); + /* + * 插入绑定木箱表 + */ + BstIvtBoxlashbound insertBound = BstIvtBoxlashbound.builder() + .lash_id(IdUtil.getLongId()) + .bound_id(boundDao.getBound_id()) + .box_no(boxDao.getBox_no()) + .build(); + iBstIvtBoxlashboundService.save(insertBound); + + } else { + // 判断是否有载具 + List empPointList = pointDaoList.stream() + .filter(row -> ObjectUtil.isEmpty(row.getString("vehicle_code"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isNotEmpty(empPointList)) { + // 有空位 + JSONObject jsonPoint = empPointList.get(0); + + // 加载具数量、更新载具号 + jsonPoint.put("vehicle_qty", NumberUtil.add(jsonPoint.getBigDecimal("vehicle_qty"),1)); + jsonPoint.put("vehicle_code",boxDao.getBox_no()); + + end_point = jsonPoint.getString("point_code"); + ischBasePointService.updateById(JSON.parseObject(jsonPoint.toString(), SchBasePoint.class)); + /* + * 插入绑定木箱表 + */ + BstIvtBoxlashbound insertBound = BstIvtBoxlashbound.builder() + .lash_id(IdUtil.getLongId()) + .bound_id(IdUtil.getLongId()) + .box_no(boxDao.getBox_no()) + .build(); + iBstIvtBoxlashboundService.save(insertBound); + } else { + // 没有空位 + throw new BadRequestException("没有空位!"); + } + } + /* + * 生成任务并下发 + */ + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("start_device_code", whereJson.getString("device_code")); + jsonTaskParam.put("next_device_code", end_point); + jsonTaskParam.put("vehicle_code", whereJson.getString("box_no")); + jsonTaskParam.put("is_auto_issue", is_move); + + TwoLashTask taskBean = new TwoLashTask(); + taskBean.createTask(jsonTaskParam); + taskBean.immediateNotifyAcs(null); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java new file mode 100644 index 000000000..f826dbaf7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java @@ -0,0 +1,449 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.sch.tasks.TwoMoveBoxTask; +import org.nl.b_lms.sch.tasks.TwoOutBoxTask; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; +import org.nl.common.utils.IdUtil; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 空载具业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +public class OutBoxManageServiceImpl implements OutBoxManageService { + + /** + * 出库不需要查询的排集合 + */ + private List notOutRowList = new ArrayList<>(); + + /** + * 出库不需要查询的巷道集合 + */ + private List notOutBlockList = new ArrayList<>(); + + @Override + @Transactional + public void outBox(JSONObject whereJson) { + /* + * 1.找到符合条件的空木箱 + */ + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + whereJson.put("stor_id", IOSEnum.STOR_ID.code("二期")); + whereJson.put("sect_id", RegionTypeEnum.TWO_MX01.getId()); + + // 判断起点点位是否存在 + JSONObject jsonPoint = pointTab.query("point_code = '" + whereJson.getString("device_code") + "' AND is_delete = '" + + IOSEnum.IS_NOTANDYES.code("否") + "' AND is_used = '" + + IOSEnum.IS_NOTANDYES.code("是") + "'") + .uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPoint)) { + throw new BadRequestException("终点点位不存在或未启用!"); + } + + JSONObject jsonAttr = getStruct(whereJson); + + if (ObjectUtil.isEmpty(jsonAttr)) { + notOutRowList.clear(); + notOutBlockList.clear(); + throw new BadRequestException("没有符合规格的木箱!"); + } + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("start_device_code", jsonAttr.getString("struct_code")); + jsonTaskParam.put("next_device_code", whereJson.getString("device_code")); + jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_code")); + jsonTaskParam.put("task_group_id", jsonAttr.getString("task_group_id")); + + TwoOutBoxTask taskBean = new TwoOutBoxTask(); + taskBean.createTask(jsonTaskParam); + taskBean.immediateNotifyAcs(null); + + // 锁定起点 + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱出库锁")); + attrTab.update(jsonAttr); + + // 清空缓存 + notOutRowList.clear(); + notOutBlockList.clear(); + } + + /** + * 找一个空木箱 + * @param whereJson { + * device_code:终点 + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * } + * @return JSONObject: 仓位对象 + */ + private JSONObject getStruct(JSONObject whereJson) { + /* + * 判断是否有相同规格的木箱 + * 判断条件:库区、仓库、是否启用、是否删除、未锁定、有载具、相同规格的木箱 + */ + whereJson.put("flag", "6"); + JSONArray structArray = WQL.getWO("BST_OUTBOX").addParamMap(whereJson).process().getResultJSONArray(0); + + if (ObjectUtil.isEmpty(structArray)) { + notOutRowList.clear(); + notOutBlockList.clear(); + throw new BadRequestException("没有相同规格的木箱!"); + } + + // 确定巷道:找相同规格木箱的最多的巷道 + String block_num = getMaxBlock(whereJson); + + // 确定排:找某一巷道规格木箱的最多排 + whereJson.put("block_num", block_num); + String row_num = getMaxRow(whereJson); + + // 确定仓位 + whereJson.put("row_num", row_num); + JSONObject jsonAttr = getBox(whereJson); + + // 为空则新找巷道 + if (ObjectUtil.isEmpty(jsonAttr)) { + + whereJson.put("flag", "1"); + notOutBlockList.add(whereJson.getString("block_num")); + + String join = "('" + String.join("','", notOutBlockList) + "')"; + whereJson.put("not_block_id", join); + + List blockList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject json = blockList.get(i); + json.put("stor_id", whereJson.getString("stor_id")); + json.put("sect_id", whereJson.getString("sect_id")); + json.put("box_length", whereJson.getString("box_length")); + json.put("box_width", whereJson.getString("box_width")); + json.put("box_high", whereJson.getString("box_high")); + json.put("num", whereJson.getString("num")); + + String row_num_2 = getMaxRow(json); + json.put("row_num",row_num_2); + JSONObject jsonAttr_2 = getBox(json); + + if (ObjectUtil.isNotEmpty(jsonAttr_2)) { + jsonAttr = jsonAttr_2; + break; + } else { + continue; + } + } + } + return jsonAttr; + } + + /** + * 找相同规格木箱的最多的巷道 + * @param whereJson { + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * } + * @return block_num: 巷道 + */ + private String getMaxBlock(JSONObject whereJson) { + whereJson.put("flag", "1"); + + // 查询所有相同规格木箱的巷道集合 + List allBlockList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isEmpty(allBlockList)) { + notOutRowList.clear(); + notOutBlockList.clear(); + throw new BadRequestException("没有相同规格的木箱!"); + } + + // 查询所有相同规格木箱巷道的仓位 + String block_num_in = allBlockList.stream() + .map(row -> row.getString("block_num")) + .collect(Collectors.joining("','")); + + whereJson.put("flag", "2"); + whereJson.put("block_num_in", "('"+block_num_in+"')"); + + List likeAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 计算每个巷道的数量 + ArrayList blockBoxList = new ArrayList<>(); + + for (int i = 0; i < allBlockList.size(); i++) { + JSONObject jsonBlock = allBlockList.get(i); + + List blockAttrNum = likeAttrList.stream() + .filter(row -> row.getString("block_num").equals(jsonBlock.getString("block_num"))) + .collect(Collectors.toList()); + + jsonBlock.put("box_num", String.valueOf(blockAttrNum.size())); + blockBoxList.add(jsonBlock); + } + + // 最大木箱数的巷道 + List boxNumList = blockBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + String block_num = ""; + if (ObjectUtil.isNotEmpty(boxNumList)) { + block_num = boxNumList.get(boxNumList.size() - 1).getString("block_num"); + } + + return block_num ; + } + + /** + * 找到某一巷道相同规格木箱的最多的排 + * @param whereJson { + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * block_num: 巷道 + * } + * @return String: 排 + */ + private String getMaxRow(JSONObject whereJson) { + whereJson.put("flag", "3"); + + // 查询所有某一巷道相同规格木箱的排集合 + List allRowList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isEmpty(allRowList)) { + throw new BadRequestException("请当前排列任务执行完后在试!"); + } + + // 查询某一巷道所有相同规格木箱排的仓位 + String row_num_in = allRowList.stream() + .map(row -> row.getString("row_num")) + .collect(Collectors.joining("','")); + + whereJson.put("flag", "2"); + whereJson.put("row_num_in", "('"+row_num_in+"')"); + + List likeAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 计算每个排的数量 + ArrayList blockBoxList = new ArrayList<>(); + + for (int i = 0; i < allRowList.size(); i++) { + JSONObject jsonRow = allRowList.get(i); + + List blockAttrNum = likeAttrList.stream() + .filter(row -> row.getString("row_num").equals(jsonRow.getString("row_num"))) + .collect(Collectors.toList()); + + jsonRow.put("box_num", String.valueOf(blockAttrNum.size())); + blockBoxList.add(jsonRow); + } + + // 最大木箱数的排 + List boxNumList = blockBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + String row_num = ""; + if (ObjectUtil.isNotEmpty(boxNumList)) { + row_num = boxNumList.get(boxNumList.size() - 1).getString("row_num"); + } + + return row_num; + } + + /** + * 找一个空木箱 + * @param whereJson { + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * block_num: 巷道 + * row_num: 排 + * } + * @return JSONObject: 需要出库的空木箱 + */ + private JSONObject getBox(JSONObject whereJson) { + // 确定仓位:找一个未锁定的空木箱 + JSONObject jsonAttr = getBoxOne(whereJson); + + // 为空找此巷道新的一排 + if (ObjectUtil.isEmpty(jsonAttr)) { + notOutRowList.add(whereJson.getString("row_num")); + + String join = "('" + String.join("','", notOutRowList) + "')"; + whereJson.put("not_row_in", join); + + // 新的一排 + String row_num_new = this.getMaxRow(whereJson); + whereJson.put("row_num",row_num_new); + + jsonAttr = this.getBoxOne(whereJson); + } + + return jsonAttr; + } + + /** + * 确定巷道、确定排,找一个空木箱 + * @param whereJson { + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * block_num: 巷道 + * row_num: 排 + * } + * @return JSONObject: 空木箱 + */ + private JSONObject getBoxOne(JSONObject whereJson) { + // 查相同规格木箱某一巷道某一排的所有木箱 + whereJson.put("flag", "4"); + + List allAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 获取此仓库、库区、巷道、排的所有仓位 + whereJson.put("flag", "5"); + + List structAllList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + JSONObject jsonAttr = new JSONObject(); + + for (int i = 0; i < allAttrList.size(); i++){ + JSONObject json = allAttrList.get(i); + + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) { + jsonAttr = json; + break; + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { + /* + * 深货位: 判断浅货位是否被锁定 + */ + // 获取此货位对应的浅货位 + List lowAttr = structAllList.stream() + .filter(row -> row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) { + notOutRowList.clear(); + notOutBlockList.clear(); + throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的浅货位错误!"); + } + + // 判断浅货位是否有木箱 + if (ObjectUtil.isEmpty(lowAttr.get(0).getString("storagevehicle_code"))) { + // 判断是否被锁定 + if (lowAttr.get(0).getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = json; + break; + } else { + continue; + } + } else { + // 判断是否被锁定 + if (lowAttr.get(0).getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 创建木箱移库单 + String task_group_id = createBoxMove(lowAttr.get(0)); + + json.put("task_group_id",task_group_id); + jsonAttr = json; + break; + } else { + jsonAttr = json; + break; + } + } + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) { + /* + * 浅货位: 直接出 + */ + jsonAttr = json; + break; + } + } + return jsonAttr; + } + + /** + * 创建木箱移库任务 + * @param jsonObject : 需要移库的仓位对象 + * @return String: 任务组标识 + */ + private String createBoxMove(JSONObject jsonObject) { + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 找一个空的仓位 + JSONObject paramIn = new JSONObject(); + paramIn.put("stor_id", IOSEnum.STOR_ID.code("二期")); + paramIn.put("sect_id", RegionTypeEnum.TWO_MX01.getId()); + + JSONObject jsonAttr = new InBoxManageServiceImpl().getStruct(paramIn); + + if (ObjectUtil.isEmpty(jsonAttr)) { + throw new BadRequestException("木箱移库任务生成失败,没有空位!"); + } + + // 锁定起点 + jsonObject.put("lock_type", IOSEnum.LOCK_TYPE.code("移出锁")); + attrTab.update(jsonObject); + + // 锁定终点 + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("移入锁")); + attrTab.update(jsonAttr); + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010505"); + jsonTaskParam.put("start_device_code", jsonObject.getString("struct_code")); + jsonTaskParam.put("next_device_code", jsonAttr.getString("struct_code")); + jsonTaskParam.put("vehicle_code", jsonObject.getString("storagevehicle_code")); + jsonTaskParam.put("task_group_id", IdUtil.getLongId()); + + TwoMoveBoxTask taskBan = new TwoMoveBoxTask(); + taskBan.createTask(jsonTaskParam); + taskBan.immediateNotifyAcs(null); + + return jsonTaskParam.getString("task_group_id"); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java index 56ede66d0..5636d93c2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import org.nl.b_lms.sch.tasks.TwoOutTask; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java index 6c545fe6d..342591ecc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java @@ -81,14 +81,14 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService { jsonTaskParam.put("task_type", "010504"); jsonTaskParam.put("start_device_code", jsonAttr.getString("struct_code")); jsonTaskParam.put("next_device_code", whereJson.getString("device_code")); - jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_type")); + jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_code")); jsonTaskParam.put("vehicle_type", whereJson.getString("vehicle_type")); TwoOutEmpTask taskBean = new TwoOutEmpTask(); taskBean.createTask(jsonTaskParam); taskBean.immediateNotifyAcs(null); - // 锁定终点 + // 锁定起点 jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("空托盘出库锁")); attrTab.update(jsonAttr); @@ -160,6 +160,7 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService { if (ObjectUtil.isNotEmpty(jsonAttr_2)) { jsonAttr = jsonAttr_2; + break; } else { continue; } @@ -278,6 +279,10 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService { List allRowList = WQL.getWO("BST_OUTVEHICLE").addParamMap(whereJson) .process().getResultJSONArray(0).toJavaList(JSONObject.class); + if (ObjectUtil.isEmpty(allRowList)) { + throw new BadRequestException("请当前排列任务执行完后在试!"); + } + // 查询某一巷道所有相同托盘类型排的仓位 String row_num_in = allRowList.stream() .map(row -> row.getString("row_num")) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java new file mode 100644 index 000000000..0b0a65afe --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java @@ -0,0 +1,221 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import org.nl.b_lms.sch.point.dao.SchBasePoint; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; +import org.nl.b_lms.sch.point.service.IschBasePointService; +import org.nl.b_lms.sch.tasks.TwoSendOutTask; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.SendOutManageService; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.nl.wms.sch.tasks.CutConveyorTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 发货业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +@RequiredArgsConstructor +public class SendOutManageServiceImpl implements SendOutManageService { + + /** + * 点位服务 + */ + private final IschBasePointService ischBasePointService; + + /** + * 点位mapper服务 + */ + private final SchBasePointMapper schBasePointMapper; + + @Override + @Transactional + public void createSendOutTask(JSONObject whereJson) { + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 载具扩展属性表 + WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + /* + * 1.找相同订单号的木箱 + * 1)有相同订单号有空位的:相同订单号的放在一排 + * 2)没有相同订单号的:新开一排 + * 3)有相同订单号的但是没有空位:新开一排 + * 2.删除载具对应木箱记录 + */ + CutConveyorTask cutConveyorTask = new CutConveyorTask(); + + // 所有发货区点位 + List pointDaoList = ischBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId()) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + ); + + // 根据载具号找到对应的木箱号 + JSONObject jsonExt = extTab.query("storagevehicle_code = '" + whereJson.getString("vehicle_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonExt)) { + throw new BadRequestException("此载具上没有木箱,请检查!"+whereJson.getString("vehicle_code")); + } + + // 1.查询此木箱号的子卷包装关系 + JSONObject jsonSub = subTab.query("package_box_sn = '" + jsonExt.getString("pcsn") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonSub)) { + throw new BadRequestException("未查询到该木箱对应的包装关系!"); + } + + // 2.找相同订单号的所有排 + jsonSub.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List pointLikeOrder = schBasePointMapper.queryLikeOrderRow(jsonSub); + + // 3.找相同订单号的所在排的所有空位 + String point_code = ""; + List joArr = new ArrayList<>(); + + for (int i = 0; i < pointLikeOrder.size(); i++) { + JSONObject json = pointLikeOrder.get(i); + + // 过滤此排的空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq)) + .collect(Collectors.toList()); + + joArr.addAll(rowPointList); + } + + if (ObjectUtil.isEmpty(joArr)) { + //查询新的一排 + List newRowPointList = schBasePointMapper.queryNewRow(jsonSub); + + if (ObjectUtil.isEmpty(newRowPointList)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + + for (int i = 0; i < newRowPointList.size(); i++) { + JSONObject json = newRowPointList.get(i); + + // 找出这一排的所有空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq)) + .collect(Collectors.toList()); + + if (rowPointList.size() == 4) { + JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0))); + + if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { + continue; + } + + point_code = jsonNewRow.getString("point_code"); + break; + } + } + } else { + // 校验此货位是否被堵住:1.如果被堵住则判断下一个是否被堵住 2.如果全部被堵住则新开一排 + for (int i = 0; i < joArr.size(); i++) { + JSONObject json = JSONObject.parseObject(JSON.toJSONString(joArr.get(i))); + + // 判断是否被挡住 + JSONObject paramJson = new JSONObject(); + paramJson.put("point_code", json.getString("point_code")); + paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List isBlock = schBasePointMapper.isBlock(paramJson); + + if (ObjectUtil.isNotEmpty(isBlock)) { + // 堵住则判断下一个 + continue; + } else { + if (cutConveyorTask.isSingleTask(json.getString("point_code"))) { + continue; + } + // 未堵住: 跳出循环 + point_code = json.getString("point_code"); + break; + } + } + } + + if (ObjectUtil.isEmpty(point_code)) { + //查询新的一排 + List newRowPointList = schBasePointMapper.queryNewRow(jsonSub); + + if (ObjectUtil.isEmpty(newRowPointList)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + + for (int i = 0; i < newRowPointList.size(); i++) { + JSONObject json = newRowPointList.get(i); + + // 找出这一排的所有空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq)) + .collect(Collectors.toList()); + + if (rowPointList.size() == 4) { + JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0))); + + if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { + continue; + } + + point_code = jsonNewRow.getString("point_code"); + break; + } + } + } + + if (ObjectUtil.isEmpty(point_code)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + //创建任务 + JSONObject task_jo = new JSONObject(); + task_jo.put("point_code1", whereJson.getString("device_code")); + task_jo.put("point_code2", point_code); + task_jo.put("vehicle_code", whereJson.getString("vehicle_code")); + task_jo.put("task_type", "010506"); + TwoSendOutTask taskBean = new TwoSendOutTask(); + taskBean.createTask(task_jo); + + // 锁住点位 + ischBasePointService.update( + new UpdateWrapper().lambda() + .eq(SchBasePoint::getPoint_code, point_code) + .set(SchBasePoint::getLock_type, IOSEnum.LOCK_TYPE.code("其它")) + .set(SchBasePoint::getVehicle_code, whereJson.getString("vehicle_code")) + ); + + // 删除载具对应木箱记录 + extTab.delete(jsonExt); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java new file mode 100644 index 000000000..e0d53cba1 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java @@ -0,0 +1,25 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 木箱入库业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface InBoxManageService { + + /** + * 木箱入库 + * @param whereJson:{ + * box_no: 木箱号 + * vehicle_code:托盘号 + * device_code:起点点位 + * } + */ + void inBox(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java index e13fe5b0f..6ef3f1d3e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java @@ -43,4 +43,14 @@ public interface InBussManageService { */ JSONObject getOneStruct(JSONObject jsonObject); + /** + * 申请入库任务 + * @param jsonObject { + * device_code: 起点 + * vehicle_code: 载具号 + * material_barcode: 子卷号: a,b,c + * } + */ + void inTask(JSONObject jsonObject); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java new file mode 100644 index 000000000..a6fbc9723 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java @@ -0,0 +1,25 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 捆扎业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface LashManageService { + + /** + * 创建桁架任务 + * @param whereJson { + * device_code:起点 + * box_no: 箱号 + * + * } + */ + void createLashTask(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java new file mode 100644 index 000000000..7ac4a7b35 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java @@ -0,0 +1,27 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 空木箱业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface OutBoxManageService { + + /** + * 出空木箱 + * @param whereJson { + * device_code:终点 + * box_length: 长 + * box_width: 宽 + * box_high: 高 + * num: 子卷数 + * } + */ + void outBox(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java new file mode 100644 index 000000000..deba0362c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 发货业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface SendOutManageService { + + /** + * 创建发货任务 + * @param whereJson { + * device_code:起点 + * vehicle_code: 载具号 + * } + */ + void createSendOutTask(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql new file mode 100644 index 000000000..728aa8ad2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql @@ -0,0 +1,166 @@ +[交易说明] + 交易名: 木箱入库逻辑 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.block_in TYPEAS f_string + 输入.row_in TYPEAS f_string + 输入.not_row_in TYPEAS f_string + 输入.not_block TYPEAS f_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + attr.block_num + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.not_block <> "" + attr.block_num NOT IN 输入.not_block + ENDOPTION + + group by attr.block_num + order by attr.block_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND IFNULL(attr.storagevehicle_code,'') <> '' + + OPTION 输入.block_in <> "" + attr.block_num in 输入.block_in + ENDOPTION + + OPTION 输入.row_in <> "" + attr.row_num in 输入.row_in + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + attr.row_num + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.not_row_in <> "" + attr.row_num NOT IN 输入.not_row_in + ENDOPTION + + group by attr.row_num + order by attr.row_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND attr.block_num = 输入.block_num + AND attr.row_num = 输入.row_num + + order by attr.col_num,attr.layer_num ASC,attr.zdepth DESC + + ENDSELECT + ENDQUERY + ENDIF + + + IF 输入.flag = "5" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND attr.block_num = 输入.block_num + AND attr.row_num = 输入.row_num + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql new file mode 100644 index 000000000..9b30a0e8b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql @@ -0,0 +1,294 @@ +[交易说明] + 交易名: 木箱出库逻辑 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.block_num_in TYPEAS f_string + 输入.row_num_in TYPEAS f_string + 输入.not_row_in TYPEAS f_string + 输入.not_block_id TYPEAS f_string + + 输入.box_length TYPEAS s_string + 输入.box_width TYPEAS s_string + 输入.box_high TYPEAS s_string + 输入.num TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + attr.block_num + FROM + st_ivt_structattr attr + INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') <> '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.not_block_id <> "" + attr.block_num not in = 输入.not_block_id + ENDOPTION + + + OPTION 输入.box_length <> "" + box.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + box.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + box.box_high = 输入.box_high + ENDOPTION + + OPTION 输入.num <> "" + box.num = 输入.num + ENDOPTION + + group by attr.block_num + order by attr.block_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') <> '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.block_num_in <> "" + attr.block_num in 输入.block_num_in + ENDOPTION + + OPTION 输入.row_num_in <> "" + attr.row_num in 输入.row_num_in + ENDOPTION + + + OPTION 输入.box_length <> "" + box.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + box.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + box.box_high = 输入.box_high + ENDOPTION + + OPTION 输入.num <> "" + box.num = 输入.num + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + attr.row_num + FROM + st_ivt_structattr attr + INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') <> '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.not_row_in <> "" + attr.row_num not in 输入.not_row_in + ENDOPTION + + + OPTION 输入.box_length <> "" + box.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + box.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + box.box_high = 输入.box_high + ENDOPTION + + OPTION 输入.num <> "" + box.num = 输入.num + ENDOPTION + + group by attr.row_num + order by attr.row_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') <> '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + + OPTION 输入.row_num <> "" + attr.row_num = 输入.row_num + ENDOPTION + + OPTION 输入.box_length <> "" + box.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + box.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + box.box_high = 输入.box_high + ENDOPTION + + OPTION 输入.num <> "" + box.num = 输入.num + ENDOPTION + + order by attr.col_num, attr.zdepth, attr.layer_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.row_num <> "" + attr.row_num = 输入.row_num + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(storagevehicle_code,'') <> '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.box_length <> "" + box.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + box.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + box.box_high = 输入.box_high + ENDOPTION + + OPTION 输入.num <> "" + box.num = 输入.num + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java new file mode 100644 index 000000000..d6061dc38 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java @@ -0,0 +1,44 @@ +package org.nl.common.enums; +import java.util.Arrays; +import java.util.Optional; + +/** + * 子卷等级 + * @author gbx + * @since 2023-01-27 + */ +public enum ContainerLevelEnum { + // + BEST(1, "A+", "1"), + WELL(2, "A", "2"), + COMMON(3, "A-", "3"), + REWORK(4, "返切", "4"), + SCRAP(5, "报废", "5"), + CONTROL(6, "管制", "6"), + OTHER(7, "其他", "7"); + + private int index; + private String name; + private String code; + + public int getIndex() { return index;} + + public String getName() { + return name; + } + + public String getCode() { + return code; + } + + ContainerLevelEnum(int index, String name, String code) { + this.index = index; + this.name = name; + this.code = code; + } + + public static ContainerLevelEnum getType(String type) { + Optional first = Arrays.stream(ContainerLevelEnum.values()).filter(a -> a.getCode().equals(type)).findFirst(); + return first.orElse(ContainerLevelEnum.OTHER); + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java new file mode 100644 index 000000000..1a0bc88ff --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java @@ -0,0 +1,63 @@ +package org.nl.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.utils.MapOf; +import org.nl.modules.common.exception.BadRequestException; + +import java.util.Map; + +/** + * 装箱区点位库存枚举 + * + * @author gbx + * @since 2024-01-31 + */ +@AllArgsConstructor +@Getter +public enum PackageInfoIvtEnum { + //点位类型 + POINT_STATUS(MapOf.of("满轴缓存位", "1", "空载具缓存位", "2", "待检区", "3", "管制区", "4", "装箱区", "5", "装箱位", "6")), + + //任务类型 + TASK_TYPE(MapOf.of("输送线->满轴缓存位", "010701", "满轴缓存位->待检区", "010702", "满轴缓存位->管制区", "010703", "放空(空载具缓存位->输送线)", + "010704", "取空(待检区->空载具缓存位)", "010705", "待检区->管制区", "010706","管制区->待检区", "010707","待检区->装箱区", "010708", "装箱区->装箱对接位", "010709")), + + //ACS任务类型 + ACS_TASK_TYPE(MapOf.of("agv任务", "1", "桁架任务", "6")), + + //ACS系统类型 + AGV_SYSTEM_TYPE(MapOf.of("1楼叉车系统", "1", "2楼1区域AGV系统", "2", "2楼2区域AGV系统", "3")), + + //桁架任务类型 + TRUSS_TYPE(MapOf.of("点对点任务", "1", "下卷拔轴任务", "6", "换轴任务", "7","放轴任务", "8")), + + //是否 + IS_USED(MapOf.of("启用", "1", "未启用", "0")), + + //位置 + POINT_LOCATION(MapOf.of("上", "0", "下", "1")), + + //库存状态 + IVT_STATUS(MapOf.of("空", "0", "1", "空载具", "2", "有子卷")); + + private Map code; + + public String code(String desc) { + String code = this.getCode().get(desc); + if (StringUtils.isNotEmpty(code)) { + return code; + } + throw new BadRequestException(this.name() + "对应类型" + desc + "未定义"); + } + + public String check(String code) { + for (Map.Entry entry : this.getCode().entrySet()) { + if (entry.getValue().equals("code")) { + return entry.getValue(); + } + } + throw new BadRequestException(this.name() + "对应类型" + code + "未定义"); + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/start/Init.java b/lms/nladmin-system/src/main/java/org/nl/start/Init.java index 00813ad7e..f3290745f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/start/Init.java +++ b/lms/nladmin-system/src/main/java/org/nl/start/Init.java @@ -21,6 +21,7 @@ public class Init implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { // initTwoAttr(4,30,3,2, "2"); +// createAttr(); } /** @@ -152,27 +153,27 @@ public class Init implements ApplicationRunner { String now = DateUtil.now(); - for (int i = 1; i <= 2000; i++) { + for (int i = 1; i <= 3000; i++) { JSONObject json = new JSONObject(); json.put("struct_id", IdUtil.getSnowflake(1,1).nextId()); if (i < 10) { - json.put("struct_code", "B01-"+"000"+i+"-01"); - json.put("struct_name", "B01排"+"000"+i+"列-01层"); + json.put("struct_code", "81-"+"000"+i+"-01"); + json.put("struct_name", "81排"+"000"+i+"列-01层"); }else if (i >= 10 && i < 100) { - json.put("struct_code", "B01-"+"00"+i+"-01"); - json.put("struct_name", "B01排"+"00"+i+"列-01层"); + json.put("struct_code", "81-"+"00"+i+"-01"); + json.put("struct_name", "81排"+"00"+i+"列-01层"); }else if (i >= 100 && i < 1000) { - json.put("struct_code", "B01-"+"0"+i+"-01"); - json.put("struct_name", "B01排"+"0"+i+"列-01层"); + json.put("struct_code", "81-"+"0"+i+"-01"); + json.put("struct_name", "81排"+"0"+i+"列-01层"); } else { - json.put("struct_code", "B01-"+i+"-01"); - json.put("struct_name", "B01排"+i+"列-01层"); + json.put("struct_code", "81-"+i+"-01"); + json.put("struct_name", "81排"+i+"列-01层"); } - JSONObject jsonObject = tab2.query("stor_id = '1582991156504039455'").uniqueResult(0); - JSONObject jsonObjec2 = tab3.query("stor_id = '1582991156504039455' and sect_code = 'BXN01'").uniqueResult(0); + JSONObject jsonObject = tab2.query("stor_id = '1597073830499717137'").uniqueResult(0); + JSONObject jsonObjec2 = tab3.query("stor_id = '1597073830499717137' and sect_code = 'XN81'").uniqueResult(0); // 新增仓位 json.put("simple_name", json.getString("struct_name")); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls index 02df2d11c..9f5da0576 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls differ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index fdbd8f9b9..db694714e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -29,12 +29,16 @@ public class AcsToWmsController { @PostMapping("/status") @Log(value = "ACS给WMS反馈任务状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) - @SaIgnore public ResponseEntity receiveTaskStatusAcs(@RequestBody String string) { return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); } + + + + + @PostMapping("/orderFinish") @Log(value = "ACS给WMS下发工单完成状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) @@ -137,4 +141,34 @@ public class AcsToWmsController { } + + @PostMapping("/sendProductToFirstFloor") + @Log(value = "成品子卷到达一楼输送线", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) + @SaIgnore + public ResponseEntity sendProductToFirstFloor(@RequestBody JSONObject json) { + return new ResponseEntity<>(acsToWmsService.sendProductToFirstFloor(json), HttpStatus.OK); + } + + @PostMapping("/applyTwo") + @Log(value = "二期入库申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) + @SaIgnore + public ResponseEntity applyTwo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.applyTwo(whereJson), HttpStatus.OK); + } + + @PostMapping("/applySendOutTwo") + @Log(value = "二期发货申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) + @SaIgnore + public ResponseEntity applySendOutTwo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.applySendOutTwo(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceApplyTwo") + @Log(value = "二期发货申请捆扎、贴标", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) + @SaIgnore + public ResponseEntity deviceApplyTwo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.deviceApplyTwo(whereJson), HttpStatus.OK); + } + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index f1615091f..5445e4abf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -79,6 +79,9 @@ public interface AcsToWmsService { */ JSONObject shipDeviceUpdate(JSONObject whereJson); + + + /** * ACS客户端--->LMS服务端 * 输送线光电无货上报 @@ -105,4 +108,51 @@ public interface AcsToWmsService { * 点位初始化 */ void initPoint(); + + + + /** + * ACS客户端--->LMS服务端 + * 成品子卷到达一楼输送线 + * + * @param whereJson 条件 + * @return JSONObject + */ + JSONObject sendProductToFirstFloor(JSONObject whereJson); + + + /** + * 二期入库任务申请 + * @param whereJson { + * type:任务类型(1-成品入库任务 2-空盘入库 3-空盘出库 4-异常处理位) + * device_code:设备号 + * vehicle_code:载具号 + * material_barcode:子卷编码(a,b,c) + * container_type:托盘类型(1-小托盘 2-大托盘) + * + * } + * @return JSONObject 反馈状态 + */ + JSONObject applyTwo(JSONObject whereJson); + + /** + * 二期发货申请任务 + * @param whereJson { + * device_code: 设备号 + * vehicle_code: 载具号 + * } + * @return JSONObject: 反馈状态 + */ + JSONObject applySendOutTwo(JSONObject whereJson); + + /** + * 二期申请捆扎、贴标 + * @param whereJson { + * device_code: 设备号 + * vehicle_code: 载具号 + * type: 任务类型(1-贴标 2-捆扎) + * } + * @return + */ + JSONObject deviceApplyTwo(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index d1fc33a85..199f6b759 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -1,5 +1,6 @@ package org.nl.wms.ext.acs.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; @@ -7,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.google.common.collect.Interner; import com.google.common.collect.Interners; import lombok.RequiredArgsConstructor; @@ -38,12 +40,15 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; + @Service @RequiredArgsConstructor @Slf4j @@ -66,6 +71,37 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private final ISysNoticeService noticeService; + /** + * 入库处理类服务 + */ + private final InBussManageService inBussManageService; + + /** + * 空载具入库处理服务 + */ + private final InVehicleManageService inVehicleManageService; + + /** + * 空载具出库处理服务 + */ + private final OutVehicleManageService outVehicleManageService; + + /** + * 发货处理服务 + */ + private final SendOutManageService sendOutManageService; + + @Resource + private IschBaseTaskService taskService; + @Resource + private IschBasePointService pointService; + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + @Resource + private MzhcwTask mzhcwTask; + + /** * task_id:任务标识 * task_code:任务编码 @@ -1655,4 +1691,244 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } } + + /** + * 成品子卷到达一楼输送线 + */ + @Override + public JSONObject sendProductToFirstFloor(JSONObject whereJson) { + // JSONObject whereJson 应该传子卷号,设备号,车间号 + // 先查询满轴缓存位是否有可用库位,有创建搬运任务 + // 任务完成创建空载具补充到输送线桁架任务,子卷搬运至待检区或或管制区agv任务 + // 如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发; + // 这个情况是有agv任务在搬去待检区或管制区的路上,还没有更新任务状态;需要查询是否有这种任务,等这个任务更新完后, + // 再补发之前创建的输送线到满轴缓存位任务; + log.info("sendProductToFirstFloor--------------------------:" + whereJson.toString()); + JSONObject result = new JSONObject(); + if (StringUtils.isBlank(whereJson.getString("device_code")) || StringUtils.isBlank(whereJson.getString("material_barcode"))) { + throw new BadRequestException("接口sendProductToFirstFloor,任务号或子卷号参数为空!"); + + } + //1.查询满轴缓存位是否有空位 + List bstIvtPackageinfoivtList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")).orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); + jo.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); + //todo 获取子卷号,子卷号就是载具号? + jo.put("vehicle_code", whereJson.getString("material_barcode")); + //2.创建输送线->满轴位桁架任务, + String point_code1 = whereJson.getString("device_code"); + jo.put("point_code1", point_code1); + if (CollectionUtils.isNotEmpty(bstIvtPackageinfoivtList)) { + //任意一个满轴缓存位为终点 + jo.put("point_code2", bstIvtPackageinfoivtList.get(0).getPoint_code()); + jo.put("is_send", true); + mzhcwTask.createTask(jo); + result.put("status", HttpStatus.OK.value()); + result.put("message", "反馈成功!"); + return result; + } else { + //3.满轴缓存位点位,查找正在搬运到待检区的任务 + List packageinfoivtList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"))); + //todo 查找正在起点为满轴缓存位点位,且执行中搬运到待检区或管制区的任务,如果有一个或多个,现场其实有多个车正在搬运过去 + List taskList = taskService.list(new LambdaUpdateWrapper() + //执行中 + .nested( + r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")) + .or().eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->管制区"))) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()) + .and( + r -> r.in(SchBaseTask::getPoint_code1, packageinfoivtList) + )); + //4.满轴缓存位无空闲库位,且无执行中搬运到待检区或管制区的任务,则报错! + if (CollectionUtils.isEmpty(taskList)) { + throw new BadRequestException("接口sendProductToFirstFloor,满轴缓存位暂无空闲库位!"); + } + // 5.如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发; + // 创建前先判断是否有已创建相同任务 + List existTaskList = taskService.list(new LambdaUpdateWrapper() + .eq(SchBaseTask::getPoint_code1, point_code1) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode())); + //6.如果有就不创建,没有就创建 + // 等这边空出来点位,也就是满轴位->待检区或管制区任务完成后,再补发; + if (CollectionUtils.isEmpty(existTaskList)) { + //暂时只确定起点,正在搬运的满轴位->待检区的点位,暂不作为终点 + //jo.put("point_code2", taskList.get(0).getPoint_code1()); + jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + jo.put("is_send", false); + mzhcwTask.createTask(jo); + } + result.put("status", HttpStatus.OK.value()); + result.put("message", "反馈成功!"); + return result; + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @SneakyThrows + public JSONObject applyTwo(JSONObject whereJson) { + log.info("applyTwo请求参数:---------------------------------------------" + whereJson.toString()); + JSONObject result = new JSONObject(); + + String type = whereJson.getString("type"); + RLock lock = redissonClient.getLock("acs_to_wms_two_a:" + type); + boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); + + try { + if (tryLock) { + // 基础校验 + if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) { + throw new BadRequestException("设备不能为空!"); + } + + if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘入库")) || type.equals(IOSEnum.ACSTOLMS_TYPE.code("异常处理位"))) { + if (ObjectUtil.isEmpty(whereJson.getString("container_type"))) { + throw new BadRequestException("载具类型不能为空!"); + } + + if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) { + throw new BadRequestException("载具不能为空!"); + } + } + + // 1-成品入库任务 + if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("成品入库任务"))) { + + // 调用服务处理 + if (ObjectUtil.isEmpty(whereJson.getString("material_barcode"))) { + throw new BadRequestException("子卷号不能为空!"); + } + + inBussManageService.inTask(whereJson); + + } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘入库"))) { + + // 2-空盘入库 + whereJson.put("vehicle_type", whereJson.getString("container_type")); + inVehicleManageService.inVehicle(whereJson); + + } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘出库"))) { + + // 3-空盘出库 + if (ObjectUtil.isEmpty(whereJson.getString("container_type"))) { + throw new BadRequestException("载具类型不能为空!"); + } + + whereJson.put("vehicle_type", whereJson.getString("container_type")); + outVehicleManageService.outVehicle(whereJson); + + } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("异常处理位"))) { + + // 4-异常处理 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("start_device_code", whereJson.getString("device_code")); + jsonTaskParam.put("next_device_code", ""); + jsonTaskParam.put("vehicle_code", whereJson.getString("vehicle_code")); + jsonTaskParam.put("vehicle_type", whereJson.getString("container_type")); + + TwoEmpExcepTask taskBean = new TwoEmpExcepTask(); + taskBean.createTask(jsonTaskParam); + } + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功!"); + log.info("applyTwo返回参数:---------------------------------------------" + result.toString()); + return result; + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", "申请任务超时!" + type); + log.info("applyTwo返回参数:---------------------------------------------" + result.toString()); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject applySendOutTwo(JSONObject whereJson) { + log.info("applySendOutTwo输入参数:---------------------------------------------" + whereJson.toString()); + + // 校验 + if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) { + throw new BadRequestException("设备号不能为空!"); + } + + if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) { + throw new BadRequestException("载具号不能为空!"); + } + + JSONObject result = new JSONObject(); + try { + // 调用服务 + sendOutManageService.createSendOutTask(whereJson); + + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功!"); + return result; + } catch (Exception e) { + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", e.getMessage()); + } + + log.info("applySendOutTwo返回参数:---------------------------------------------" + result.toString()); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @SneakyThrows + public JSONObject deviceApplyTwo(JSONObject whereJson) { + log.info("deviceApplyTwo请求参数:---------------------------------------------" + whereJson.toString()); + JSONObject result = new JSONObject(); + + String type = whereJson.getString("type"); + RLock lock = redissonClient.getLock("acs_to_wms_two_b:" + type); + boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); + + try { + if (tryLock) { + // 校验 + if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) { + throw new BadRequestException("设备号不能为空!"); + } + + if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) { + throw new BadRequestException("载具号不能为空!"); + } + + // 1-贴标 + if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("贴标"))) { + + } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("贴标"))) { + // 2-捆扎 + } + + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功!"); + log.info("deviceApplyTwo返回参数:---------------------------------------------" + result.toString()); + return result; + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", "申请任务超时!" + type); + log.info("deviceApplyTwo返回参数:---------------------------------------------" + result.toString()); + return result; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java index 7d4d78a83..2394deb59 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java @@ -114,4 +114,12 @@ public class MesToLmsController { } + @PostMapping("/sendTargetHouse") + @Log("MES传递给LMS入线边库或者入成品库") + @SaIgnore + public ResponseEntity sendTargetHouse(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.sendTargetHouse(jo), HttpStatus.OK); + } + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java index fd296d665..6e3073fb8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java @@ -62,4 +62,12 @@ public interface MesToLmsService { JSONObject sendAuditResult(JSONObject param); JSONObject sendProcessInfo(JSONObject param); + + /** + * MES传递给LMS入线边库或者入成品库 + */ + JSONObject sendTargetHouse(JSONObject param); + + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java index 326e98a94..4a432e540 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -7,9 +7,17 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import org.nl.b_lms.sch.tasks.ProcessTask; +import org.nl.b_lms.sch.tasks.first_floor_area.DjqTask; +import org.nl.b_lms.sch.tasks.first_floor_area.GzqTask; +import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; @@ -28,8 +36,11 @@ import org.nl.wms.st.instor.service.impl.ProductScrapServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -42,6 +53,15 @@ public class MesToLmsServiceImpl implements MesToLmsService { private final InService inService; + @Resource + private DjqTask djqTask; + @Resource + private GzqTask gzqTask; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + /** * 生箔烘箱: * 母卷批次创建信息发送智能物流(MES生箔工序Move In) @@ -1470,68 +1490,68 @@ public class MesToLmsServiceImpl implements MesToLmsService { throw new BadRequestException("传入的类型不能为空!"); } - JSONObject device_jo = WQLObject.getWQLObject("st_ivt_stpointivt").query("ext_code = '"+ResourceName+"'").uniqueResult(0); - if (ObjectUtil.isEmpty(device_jo)){ - throw new BadRequestException("未查询到["+ResourceName+"]应的表处机设备!"); + JSONObject device_jo = WQLObject.getWQLObject("st_ivt_stpointivt").query("ext_code = '" + ResourceName + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(device_jo)) { + throw new BadRequestException("未查询到[" + ResourceName + "]应的表处机设备!"); } ProcessTask processTask = SpringContextHolder.getBean(ProcessTask.class); //上料 - if ("1".equals(Type)){ + if ("1".equals(Type)) { String up_scroll = device_jo.getString("up_scroll"); String up_pcsn = device_jo.getString("up_pcsn"); - if (StrUtil.isNotEmpty(up_pcsn)){ - throw new BadRequestException("LMS系统上【"+ResourceName+"】表处机上还存在母卷号,不能进行上料!"); + if (StrUtil.isNotEmpty(up_pcsn)) { + throw new BadRequestException("LMS系统上【" + ResourceName + "】表处机上还存在母卷号,不能进行上料!"); } //查询母卷所在点位 JSONObject jsonCoolIvt = coolIvtTab.query("container_name = '" + containerName + "' and full_point_status = '02' and cool_ivt_status <> '04'").uniqueResult(0); JSONObject form = new JSONObject(); - if (StrUtil.isEmpty(up_scroll)){ + if (StrUtil.isEmpty(up_scroll)) { //取满放满 - form.put("point_code1",jsonCoolIvt.getString("point_code")); - form.put("point_code2",device_jo.getString("point_code")); - form.put("task_type","010702"); - form.put("material_code",jsonCoolIvt.getString("container_name")); - form.put("vehicle_code",jsonCoolIvt.getString("full_vehicle_code")); - form.put("product_area",device_jo.getString("product_area")); - }else { + form.put("point_code1", jsonCoolIvt.getString("point_code")); + form.put("point_code2", device_jo.getString("point_code")); + form.put("task_type", "010702"); + form.put("material_code", jsonCoolIvt.getString("container_name")); + form.put("vehicle_code", jsonCoolIvt.getString("full_vehicle_code")); + form.put("product_area", device_jo.getString("product_area")); + } else { //取满取空放满放空 - form.put("point_code1",jsonCoolIvt.getString("full_point_code")); - form.put("point_code2",device_jo.getString("point_code")); - form.put("point_code3",device_jo.getString("point_code")); + form.put("point_code1", jsonCoolIvt.getString("full_point_code")); + form.put("point_code2", device_jo.getString("point_code")); + form.put("point_code3", device_jo.getString("point_code")); //判断对应空轴点位是否为空,为空用当前点位,不为空查询其他点位 - if (jsonCoolIvt.getString("empty_point_status").equals("01")){ - form.put("point_code4",jsonCoolIvt.getString("empty_point_code")); - }else { + if (jsonCoolIvt.getString("empty_point_status").equals("01")) { + form.put("point_code4", jsonCoolIvt.getString("empty_point_code")); + } else { JSONObject map = new JSONObject(); map.put("flag", "6"); map.put("product_area", device_jo.getString("product_area")); JSONObject jsonIvt = WQL.getWO("PDA_RAWFOIL_01").addParamMap(map).process().uniqueResult(0); - form.put("point_code4",jsonIvt.getString("empty_point_code")); + form.put("point_code4", jsonIvt.getString("empty_point_code")); } - form.put("task_type","010701"); - form.put("material_code",jsonCoolIvt.getString("container_name")); - form.put("vehicle_code",jsonCoolIvt.getString("full_vehicle_code")); - form.put("product_area",device_jo.getString("product_area")); + form.put("task_type", "010701"); + form.put("material_code", jsonCoolIvt.getString("container_name")); + form.put("vehicle_code", jsonCoolIvt.getString("full_vehicle_code")); + form.put("product_area", device_jo.getString("product_area")); } processTask.createTask(form); } //退料 - if ("2".equals(Type)){ + if ("2".equals(Type)) { //取满取空放满放空 JSONObject form = new JSONObject(); JSONObject map = new JSONObject(); map.put("flag", "1"); map.put("product_area", device_jo.getString("product_area")); JSONObject jsonIvt = WQL.getWO("PDA_RAWFOIL_01").addParamMap(map).process().uniqueResult(0); - form.put("point_code1",device_jo.getString("point_code")); + form.put("point_code1", device_jo.getString("point_code")); //寻找可用的冷却区满轴点位 - form.put("point_code2",jsonIvt.getString("full_point_code")); - form.put("task_type","010704"); - form.put("material_code",device_jo.getString("up_pcsn")); - form.put("vehicle_code",device_jo.getString("up_scroll")); - form.put("product_area",device_jo.getString("product_area")); + form.put("point_code2", jsonIvt.getString("full_point_code")); + form.put("task_type", "010704"); + form.put("material_code", device_jo.getString("up_pcsn")); + form.put("vehicle_code", device_jo.getString("up_scroll")); + form.put("product_area", device_jo.getString("product_area")); processTask.createTask(form); } @@ -1547,4 +1567,68 @@ public class MesToLmsServiceImpl implements MesToLmsService { log.info("sendProcessInfo接口输出参数为:-------------------" + resultParam.toString()); return resultParam; } + + @Override + public JSONObject sendTargetHouse(JSONObject param) { + log.info("sendTargetHouse输入参数为:-------------------" + param.toString()); + JSONObject resultParam = new JSONObject(); + try { + String containerName = param.getString("sconds"); + String TargetHouse = param.getString("TargetHouse"); + if (StringUtils.isBlank(containerName)) { + throw new BadRequestException("传入的母卷号不能为空!"); + } + if (StringUtils.isBlank(TargetHouse)) { + throw new BadRequestException("传入的目标库不能为空!"); + } + //待检区和管制区库位信息 + List bstIvtPackageinfoivtList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .in(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.POINT_STATUS.code("管制区")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + //子卷信息 + BstIvtPackageinfoivt containerInfo = + bstIvtPackageinfoivtList.stream().filter(r -> r.getContainer_name().equals(containerName)).collect(Collectors.toList()).get(0); + JSONObject toDjqTask = new JSONObject(); + toDjqTask.put("vehicle_code", containerName); + //0 管制区 1待检区 + if ("0".equals(TargetHouse)) { + if (containerInfo.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区"))) { + List djqList = bstIvtPackageinfoivtList.stream().filter(r -> r.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区")) && r.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code("空"))).collect(Collectors.toList()); + //待检区有空位,搬到待检区 + if (CollectionUtils.isNotEmpty(djqList)) { + toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("管制区->待检区")); + toDjqTask.put("point_code1", containerInfo.getPoint_code()); + toDjqTask.put("point_code2", djqList.get(0).getPoint_code()); + djqTask.createTask(toDjqTask); + } + } + + } else if ("1".equals(TargetHouse)) { + if (containerInfo.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("管制区"))) { + List gzqList = bstIvtPackageinfoivtList.stream().filter(r -> r.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("管制区")) && r.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code("空"))).collect(Collectors.toList()); + //管制区有空位 + if (CollectionUtils.isNotEmpty(gzqList)) { + toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("管制区->待检区")); + toDjqTask.put("point_code1", containerInfo.getPoint_code()); + toDjqTask.put("point_code2", gzqList.get(0).getPoint_code()); + gzqTask.createTask(toDjqTask); + } + + } + } + resultParam.put("RTYPE", "S"); + resultParam.put("Code", "0"); + resultParam.put("RTMSG", "操作成功!"); + } catch (Exception e) { + resultParam.put("RTYPE", "E"); + resultParam.put("Code", "1"); + resultParam.put("RTMSG", "操作失败!," + e.getMessage()); + } + log.info("sendTargetHouse接口输出参数为:-------------------" + resultParam); + return resultParam; + } + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java index a80c8cecc..03579cce6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java @@ -20,8 +20,12 @@ public enum RegionTypeEnum { LKCK("17", "密集库出库输送线", "1585167595403874304"), XN01("18", "虚拟区", "1586913215886004224"), PD01("19", "盘点区", "1645705331612979200"), - TWO_ZZ01("20", "二期暂存区", ""), - TWO_TTP01("21", "二期空托盘区", "1750471797729529856"); + TWO_ZZ01("20", "二期暂存区", "1760183596628447232"), + TWO_TTP01("21", "二期空托盘区", "1750471797729529856"), + TWO_MX01("22", "二期木箱区", "1752254266938101760"), + TWO_KZ01("23", "二期捆扎区", "1754774130626007040"), + TWO_FH01("24", "二期发货区", "1759453285649092608"), + TWO_OUT01("25", "二期出库区", "1760141408548818944"); private String name; private String code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index c9afb704b..b1a25052c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -110,7 +110,6 @@ public abstract class AbstractAcsTask { public JSONObject immediateNotifyAcs(String task_id) { List taskList = this.schedule(); if (ObjectUtil.isNotEmpty(taskList)) { - JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); return AcsUtil.notifyAcs("api/wms/task", arr); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java index 6fdcea1f6..d30bace53 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java @@ -1,6 +1,7 @@ package org.nl.wms.sch.manage; public enum TaskStatusEnum { + CREATED("01", "生成"), SURE_START("02", "确定起点"), SURE_END("03", "确定终点"), diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java index a7383d9a1..b7a66b33c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java @@ -85,71 +85,6 @@ public class CutTrussTask extends AbstractAcsTask { String task_id = taskObj.getString("task_id"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - if (StrUtil.equals(status, "0")) { - // 更新删除字段 - jsonTask.put("is_delete", "1"); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - //桁架标准任务 - if ("010403".equals(jsonTask.getString("task_type"))) { - //更新入站气涨轴的分切计划状态 - JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05')").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:入站中或入站完成的分切计划!"); - } - for (int i = 0; i < plan_jo.size(); i++) { - JSONObject plan_row = plan_jo.getJSONObject(i); - plan_row.put("status", "03"); - plan_row.put("end_time", DateUtil.now()); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); - } - - //更新出站气涨轴的分切计划状态 - JSONArray plan_jo2 = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code2") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo2)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code2") + "状态为:出站中的分切计划!"); - } - for (int i = 0; i < plan_jo2.size(); i++) { - JSONObject plan_row = plan_jo2.getJSONObject(i); - plan_row.put("status", "05"); - plan_row.put("end_time", DateUtil.now()); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); - } - } - - //分切>输送线 子卷出站 - if ("010404".equals(jsonTask.getString("task_type"))) { - if (!jsonTask.getString("vehicle_code").contains("废箔")) { - //更新出站气涨轴的分切计划状态 - JSONArray plan_jo2 = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo2)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:出站中的分切计划!"); - } - for (int i = 0; i < plan_jo2.size(); i++) { - JSONObject plan_row = plan_jo2.getJSONObject(i); - plan_row.put("status", "05"); - plan_row.put("end_time", DateUtil.now()); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); - } - } - } - //分切>输送线 子卷入站 - if ("010405".equals(jsonTask.getString("task_type"))) { - //更新入站气涨轴的分切计划状态 - JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:入站中或入站完成的分切计划!"); - } - for (int i = 0; i < plan_jo.size(); i++) { - JSONObject plan_row = plan_jo.getJSONObject(i); - plan_row.put("status", "03"); - plan_row.put("end_time", DateUtil.now()); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); - } - } - } - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { // 更新任务状态为执行中 jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); @@ -165,7 +100,6 @@ public class CutTrussTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); taskTab.update(jsonTask); - //桁架标准任务,双工位任务 if ("010403".equals(jsonTask.getString("task_type"))) { //更新分切机对应位置的气涨轴 @@ -264,84 +198,6 @@ public class CutTrussTask extends AbstractAcsTask { cutConveyorTask.createTask(form); } - //子卷入站 - if ("010405".equals(jsonTask.getString("task_type"))) { - //更新输送线的气涨轴编码 - JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(delivery_point)) { - throw new BadRequestException("未查询到对应的输送线点位!"); - } - delivery_point.put("qzzno", ""); - delivery_point.put("point_status", "02"); - WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); - - //更新入站气涨轴的分切计划状态 - JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "对应的分切计划!"); - } - for (int i = 0; i < plan_jo.size(); i++) { - JSONObject plan_row = plan_jo.getJSONObject(i); - plan_row.put("status", "05"); - plan_row.put("end_time", DateUtil.now()); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); - } - - //如果桁架任务执行完,右侧的输送线上存在气涨轴,则生成一个输送出的任务,防止左侧空载具挡住右侧气涨轴进行横移 - log.debug("如果桁架任务执行完,缓存位的输送线上存在气涨轴,则对上料位的空载具生成一个输送出的任务"); - char dtl_type = jsonTask.getString("point_code1").charAt(jsonTask.getString("point_code1").length() - 1); - if (Integer.valueOf(String.valueOf(dtl_type)) % 2 != 0) { - String point_location = delivery_point.getString("point_location"); - String product_area = delivery_point.getString("product_area"); - String sort_seq = delivery_point.getString("sort_seq"); - JSONObject right_point = WQL.getWO("PDA_02") - .addParam("point_location", point_location) - .addParam("point_code", jsonTask.getString("point_code1")) - .addParam("product_area", product_area) - .addParam("sort_seq", sort_seq) - .addParam("find_type", "3") - .addParam("flag", "17").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(right_point)) { - log.debug("生成一个输送线出库任务"); - //生成一个输送线出库任务 - JSONObject form = new JSONObject(); - form.put("point_code1", jsonTask.getString("point_code1")); - JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); - form.put("point_code2", ss_jo.getString("point_code")); - if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { - throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); - } - form.put("vehicle_code2", delivery_point.getString("vehicle_code")); - //分切输送出 - form.put("task_type", "010401"); - form.put("product_area", delivery_point.getString("product_area")); - cutConveyorTask.createTask(form); - } else { - - right_point = WQL.getWO("PDA_02") - .addParam("point_location", point_location) - .addParam("point_code", jsonTask.getString("point_code1")) - .addParam("product_area", product_area) - .addParam("sort_seq", sort_seq) - .addParam("find_type", "4") - .addParam("flag", "18").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(right_point)) { - //判断对应缓存位是否存在需要末次下卷或者废箔下卷的任务 - JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("vehicle_code2 = '" + right_point.getString("vehicle_code") + "' AND is_delete = '0' AND task_status = '02'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(task_jo)) { - if ("010404".equals(task_jo.getString("task_type"))) { - //出站 - task_jo.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - task_jo.put("point_code2", jsonTask.getString("point_code1")); - task_jo.put("vehicle_code2", delivery_point.getString("vehicle_code")); - WQLObject.getWQLObject("sch_base_task").update(task_jo); - new CutTrussTask().immediateNotifyAcs(null); - } - } - } - } - } - } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java index 97e9a51bf..87acec304 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java @@ -5,8 +5,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.InVehicleManageServiceImpl; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.OutVehicleManageServiceImpl; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.*; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService; import org.nl.modules.logging.annotation.Log; import org.nl.wms.st.inbill.service.CheckOutBillService; import org.springframework.beans.factory.annotation.Autowired; @@ -36,6 +38,12 @@ public class CheckOutBillController { @Autowired private IStIvtIostorinvOutService iStIvtIostorinvOutService; + private final LashManageService lashManageService; + + private final InBussManageService inBussManageService; + + private final SendOutManageServiceImpl sendOutManageService; + @GetMapping @Log("查询出库单") @@ -377,4 +385,39 @@ public class CheckOutBillController { return new ResponseEntity<>(HttpStatus.OK); } + @PostMapping("/testInBox") + @Log("木箱入库测试") + public ResponseEntity testInBox(@RequestBody JSONObject whereJson) { + new InBoxManageServiceImpl().inBox(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/testOutBox") + @Log("木箱出库测试") + public ResponseEntity testOutBox(@RequestBody JSONObject whereJson) { + new OutBoxManageServiceImpl().outBox(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/testBoxLash") + @Log("木箱捆扎测试") + public ResponseEntity testBoxLash(@RequestBody JSONObject whereJson) { + lashManageService.createLashTask(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/testSendOut") + @Log("发货区测试") + public ResponseEntity testSendOut(@RequestBody JSONObject whereJson) { + sendOutManageService.createSendOutTask(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/testIn") + @Log("申请入库") + public ResponseEntity testIn(@RequestBody JSONObject whereJson) { + inBussManageService.inTask(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + } diff --git a/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue b/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue index be120c759..70cc19381 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue @@ -228,6 +228,16 @@ {{ dict.label.placement_type[scope.row.placement_type] }} + + + + + +