diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java new file mode 100644 index 0000000..50c5ce4 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java @@ -0,0 +1,62 @@ +package org.nl.b_lms.bst.ivt.boxstack.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; +import org.nl.common.domain.query.PageQuery; +import org.nl.modules.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@RestController +@RequestMapping("/api/bstIvtboxstack") +public class BstIvtBoxstackController { + @Autowired + private IBstIvtBoxstackService boxstackService; + + @GetMapping + @Log("查询木箱堆叠位") + public ResponseEntity query(BstIvtBoxstackQuery whereJson, PageQuery page) { + return new ResponseEntity<>(boxstackService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增木箱堆叠位") + public ResponseEntity create(@Validated @RequestBody BstIvtBoxstackDto entity) { + boxstackService.create(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping + @Log("修改木箱堆叠位") + public ResponseEntity update(@Validated @RequestBody BstIvtBoxstackDto entity) { + boxstackService.update(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("删除木箱堆叠位") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + boxstackService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/saveBoxStack") + public ResponseEntity saveBoxStack(@Validated @RequestBody JSONObject reqParam) { + boxstackService.saveBoxStack(reqParam); + return new ResponseEntity<>(HttpStatus.OK); + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java new file mode 100644 index 0000000..fc7b5f2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java @@ -0,0 +1,34 @@ +package org.nl.b_lms.bst.ivt.boxstack.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; +import org.nl.common.domain.query.PageQuery; +import org.nl.modules.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@RestController +@RequestMapping("/api/bstIvtboxstacklayer") +public class BstIvtBoxstacklayerController { + + @Autowired + private IBstIvtBoxstacklayerService boxstacklayerService; + + @GetMapping("/getBoxLayer/{stackId}") + @Log("根据堆叠位ID查询堆叠位层数详情") + public ResponseEntity query(@PathVariable String stackId) { + return new ResponseEntity<>(boxstacklayerService.getByStackId(stackId), HttpStatus.OK); + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java new file mode 100644 index 0000000..8d75624 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java @@ -0,0 +1,54 @@ +package org.nl.b_lms.bst.ivt.boxstack.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 lxy + * @Date 2023/11/14 20:11 + */ +@AllArgsConstructor +@Getter +public enum BoxStackEnum { + // 木箱任务类型 + TASK_TYPE(MapOf.of("木箱入库", "010702", "木箱出库", "010704", "木箱移库", "010705")), + // 木箱出入库任务二次分配类型 + AGV_ACTION_TYPE(MapOf.of("普通任务", "1", "取货二次分配", "2", "放货二次分配", "3", "取放货二次分配", "4")), + //木箱库二次分配等待点 + AGV_WAIT_POINT(MapOf.of("木箱等待点1", "MX_WAIT_1", "木箱等待点2", "MX_WAIT_2")), + //木箱库ACS任务类型 + ACS_TASK_TYPE(MapOf.of("agv任务", "1")), + //木箱库AGV系统类型 + AGV_SYSTEM_TYPE(MapOf.of("1楼诺宝任务", "1", "2楼1区域AGV系统", "2", "1楼叉车任务", "3")), + //木箱库位启用状态 + IS_USED(MapOf.of("启用", "1", "未启用", "0")), + //木箱库区域 + POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3")); + + + 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 + "未定义"); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstackService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstackService.java new file mode 100644 index 0000000..b09ec3c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstackService.java @@ -0,0 +1,55 @@ +package org.nl.b_lms.bst.ivt.boxstack.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +public interface IBstIvtBoxstackService extends IService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + Object queryAll(BstIvtBoxstackQuery whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(BstIvtBoxstackDto entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(BstIvtBoxstackDto entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 保存木箱堆叠信息 + * + * @param reqParam + */ + void saveBoxStack(JSONObject reqParam); +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java new file mode 100644 index 0000000..fee2ad7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java @@ -0,0 +1,17 @@ +package org.nl.b_lms.bst.ivt.boxstack.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +public interface IBstIvtBoxstacklayerService extends IService { + + + List getByStackId(String stackId); +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java new file mode 100644 index 0000000..42b722d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java @@ -0,0 +1,103 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("bst_ivt_boxstack") +public class BstIvtBoxstack implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "stack_id", type = IdType.NONE) + /** + * 唯一标识 + */ + private String stack_id; + + /** + * 堆叠位编码 + */ + private String stack_code; + + /** + * 堆叠位名称 + */ + private String stack_name; + + /** + * 当前堆叠层数 + */ + private Integer current_layer_count; + + /** + * 最大堆叠层数 + */ + private Integer max_layer_count; + + /** + * 区域 + */ + private String point_status; + + /** + * 木箱规格(物料编码) + */ + private String box_spec; + + /** + * 排 + */ + private Integer x; + + /** + * 列 + */ + private Integer y; + + /** + * 是否启用(0禁用,1启用) + */ + private String is_used; + + /** + * 创建人id + */ + private String created_id; + + /** + * 创建人名称 + */ + private String created_name; + + /** + * 创建时间,yyyy-MM-dd HH:mm:ss + */ + private String created_time; + + /** + * 修改人id + */ + private String update_id; + + /** + * 修改人名称 + */ + private String update_name; + + /** + * 修改时间,yyyy-MM-dd HH:mm:ss + */ + private String update_time; +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java new file mode 100644 index 0000000..afa4689 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java @@ -0,0 +1,73 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("bst_ivt_boxstacklayer") +public class BstIvtBoxstacklayer implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "stack_layer_id", type = IdType.NONE) + private String stack_layer_id; + + /** + * 堆叠位id + */ + private String stack_id; + + /** + * 木箱编码 + */ + private String box_code; + + /** + * 层号 + */ + private Integer layer_index; + + /** + * 创建人id + */ + private String created_id; + + /** + * 创建人名称 + */ + private String created_name; + + /** + * 创建时间,yyyy-MM-dd HH:mm:ss + */ + private String created_time; + + /** + * 修改人id + */ + private String update_id; + + /** + * 修改人名称 + */ + private String update_name; + + /** + * 修改时间,yyyy-MM-dd HH:mm:ss + */ + private String update_time; +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java new file mode 100644 index 0000000..49698f9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java @@ -0,0 +1,16 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Map; + + +public interface BstIvtBoxstackMapper extends BaseMapper { + + List pageQuery(@Param("query") BstIvtBoxstackQuery query, @Param("pageQuery") PageQuery pageQuery); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml new file mode 100644 index 0000000..6ace4dc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml @@ -0,0 +1,44 @@ + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java new file mode 100644 index 0000000..58a3c8a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java @@ -0,0 +1,10 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; + + +public interface BstIvtBoxstacklayerMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml new file mode 100644 index 0000000..b6585a1 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java new file mode 100644 index 0000000..878eac3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java @@ -0,0 +1,65 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstackDto implements Serializable { + + /** + * 唯一标识 + */ + private String stack_id; + + /** + * 堆叠位编码 + */ + private String stack_code; + + /** + * 堆叠位名称 + */ + private String stack_name; + + /** + * 当前堆叠层数 + */ + private Integer current_layer_count; + + /** + * 最大堆叠层数 + */ + private Integer max_layer_count; + + /** + * 区域 + */ + private String point_status; + + /** + * 木箱规格(物料编码) + */ + private String box_spec; + + /** + * 是否启用(0禁用,1启用) + */ + private String is_used; + + /** + * 排 + */ + private Integer x; + + /** + * 列 + */ + private Integer y; + +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java new file mode 100644 index 0000000..60ed6d9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java @@ -0,0 +1,29 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstackQuery { + + /** + * 堆叠位信息 + */ + private String stack_info; + /** + * 区域 + */ + private String point_status; + /** + * 木箱规格 + */ + private String box_spec; + /** + * 是否弃用 + */ + private Boolean is_used; +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackVo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackVo.java new file mode 100644 index 0000000..d2d75fc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackVo.java @@ -0,0 +1,12 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstackVo { +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java new file mode 100644 index 0000000..34b2eb0 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java @@ -0,0 +1,61 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstacklayerDto implements Serializable { + private String stack_layer_id; + + /** + * 堆叠位id + */ + private String stack_id; + + /** + * 木箱编码 + */ + private String box_code; + + /** + * 层号 + */ + private Integer layer_index; + + /** + * 创建人id + */ + private String created_id; + + /** + * 创建人名称 + */ + private String created_name; + + /** + * 创建时间,yyyy-MM-dd HH:mm:ss + */ + private String created_time; + + /** + * 修改人id + */ + private String update_id; + + /** + * 修改人名称 + */ + private String update_name; + + /** + * 修改时间,yyyy-MM-dd HH:mm:ss + */ + private String update_time; +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java new file mode 100644 index 0000000..a50d940 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java @@ -0,0 +1,12 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstacklayerQuery { +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java new file mode 100644 index 0000000..2287b91 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java @@ -0,0 +1,12 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dto; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Data +public class BstIvtBoxstacklayerVo { +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java new file mode 100644 index 0000000..c6c6a62 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java @@ -0,0 +1,185 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +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.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@Service +public class BstIvtBoxstackServiceImpl extends ServiceImpl implements IBstIvtBoxstackService { + + @Autowired + private BstIvtBoxstackMapper boxstackMapper; + @Autowired + private IBstIvtBoxstacklayerService boxstacklayerService; + @Autowired + private IBstIvtBoxinfoService boxinfoService; + + @Override + public Object queryAll(BstIvtBoxstackQuery whereJson, PageQuery pageQuery) { + Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + List list = boxstackMapper.pageQuery(whereJson, pageQuery); + TableDataInfo build = TableDataInfo.build(list); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(BstIvtBoxstackDto entity) { + if (entity.getMax_layer_count() <= 0) { + throw new RuntimeException("最大堆叠数必须大于0"); + } + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentNickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + BstIvtBoxstack boxstack = new BstIvtBoxstack(); + boxstack.setStack_id(IdUtil.getStringId()); + boxstack.setStack_code(entity.getStack_code()); + boxstack.setStack_name(entity.getStack_name()); + boxstack.setCurrent_layer_count(entity.getCurrent_layer_count()); + boxstack.setMax_layer_count(entity.getMax_layer_count()); + boxstack.setPoint_status(entity.getPoint_status()); + boxstack.setBox_spec(entity.getBox_spec()); + boxstack.setX(entity.getX()); + boxstack.setY(entity.getY()); + boxstack.setIs_used(entity.getIs_used()); + boxstack.setCreated_id(currentUserId); + boxstack.setCreated_name(currentNickName); + boxstack.setCreated_time(now); + boxstackMapper.insert(boxstack); + for (Integer i = 0; i < entity.getMax_layer_count(); i++) { + BstIvtBoxstacklayer boxstacklayer = new BstIvtBoxstacklayer(); + boxstacklayer.setStack_layer_id(IdUtil.getStringId()); + boxstacklayer.setStack_id(boxstack.getStack_id()); + boxstacklayer.setLayer_index(i + 1); + boxstacklayer.setCreated_id(currentUserId); + boxstacklayer.setCreated_name(currentNickName); + boxstacklayer.setCreated_time(now); + boxstacklayerService.save(boxstacklayer); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(BstIvtBoxstackDto entity) { + BstIvtBoxstack boxstack = this.getById(entity.getStack_id()); + if (ObjectUtil.isNotNull(boxstack)) { + boxstack.setStack_code(entity.getStack_code()); + boxstack.setStack_name(entity.getStack_name()); + boxstack.setPoint_status(entity.getPoint_status()); + boxstack.setX(entity.getX()); + boxstack.setY(entity.getY()); + boxstack.setIs_used(entity.getIs_used()); + boxstack.setUpdate_id(SecurityUtils.getCurrentUserId()); + boxstack.setUpdate_name(SecurityUtils.getCurrentNickName()); + boxstackMapper.updateById(boxstack); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Set ids) { + boxstackMapper.deleteBatchIds(ids); + boxstacklayerService.remove(new LambdaQueryWrapper().in(BstIvtBoxstacklayer::getStack_id, ids)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBoxStack(JSONObject reqParam) { + String box_spec = reqParam.getString("box_spec"); + String stack_id = reqParam.getString("stack_id"); + JSONArray layers = reqParam.getJSONArray("tableData"); + int current_layer_count = reqParam.getIntValue("current_layer_count"); + boolean hasBoxSpec = StringUtils.isNotBlank(box_spec); + + List boxCodes = layers.stream() + .map(obj -> { + if (obj instanceof JSONObject) { + return ((JSONObject) obj).getString("box_code"); + } else if (obj instanceof Map) { + return (String) ((Map) obj).get("box_code"); + } + return null; + }) + .collect(Collectors.toList()); + boolean allBoxCodesEmpty = boxCodes.stream() + .allMatch(code -> StringUtils.isBlank(code)); + boolean anyBoxCodeNotEmpty = boxCodes.stream() + .anyMatch(code -> StringUtils.isNotBlank(code)); + + if (!hasBoxSpec && anyBoxCodeNotEmpty) { + throw new BadRequestException("木箱规格为空,但是木箱条码不为空"); + } + if (hasBoxSpec && allBoxCodesEmpty) { + throw new BadRequestException("木箱规格不为空,但是木箱条码全部为空"); + } + String now = DateUtil.now(); + String currentNickName = SecurityUtils.getCurrentNickName(); + String currentUserId = SecurityUtils.getCurrentUserId(); + for (int i = 0; i < layers.size(); i++) { + JSONObject layer = layers.getJSONObject(i); + String stack_layer_id = layer.getString("stack_layer_id"); + String box_code = layer.getString("box_code"); + if (StringUtils.isNotBlank(box_code)) { + BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, box_code)); + if (ObjectUtil.isEmpty(boxinfo)) { + throw new BadRequestException("请核对木箱号, 木箱号:" + box_code + "在木箱信息表中不存在"); + } + } + BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstacklayer::getStack_layer_id, stack_layer_id)); + if (!ObjectUtil.isEmpty(boxstacklayer)) { + boxstacklayer.setBox_code(box_code); + boxstacklayer.setUpdate_time(now); + boxstacklayer.setUpdate_id(currentUserId); + boxstacklayer.setUpdate_name(currentNickName); + boxstacklayerService.updateById(boxstacklayer); + } + } + BstIvtBoxstack boxstack = this.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_id, stack_id)); + if (!ObjectUtil.isEmpty(boxstack)) { + boxstack.setBox_spec(box_spec); + boxstack.setCurrent_layer_count(current_layer_count); + boxstack.setUpdate_time(now); + boxstack.setUpdate_id(currentUserId); + boxstack.setUpdate_name(currentNickName); + this.updateById(boxstack); + } + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java new file mode 100644 index 0000000..6f43d03 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java @@ -0,0 +1,27 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstacklayerMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@Service +public class BstIvtBoxstacklayerServiceImpl extends ServiceImpl implements IBstIvtBoxstacklayerService { + + @Override + public List getByStackId(String stackId) { + return this.list(new LambdaQueryWrapper().eq(BstIvtBoxstacklayer::getStack_id, stackId)); + } + +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java new file mode 100644 index 0000000..dba16ba --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java @@ -0,0 +1,34 @@ +package org.nl.b_lms.pda.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.pda.service.BoxStackInOutService; +import org.nl.modules.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/14 + */ +@RestController +@RequestMapping("/api/boxStackInOut") +@Slf4j +public class BoxStackInOutController { + + @Autowired + private BoxStackInOutService boxStackInOutService; + + @PostMapping("/boxIn") + @Log("木箱入库") + public ResponseEntity confirmPass(@RequestBody JSONObject reqParam) { + boxStackInOutService.boxIn(reqParam); + return new ResponseEntity<>( HttpStatus.OK); + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java new file mode 100644 index 0000000..90efe3f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java @@ -0,0 +1,18 @@ +package org.nl.b_lms.pda.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/14 + */ +public interface BoxStackInOutService { + + /** + * 入库 + * + * @param reqParam + */ + void boxIn(JSONObject reqParam); +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java new file mode 100644 index 0000000..523b306 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java @@ -0,0 +1,136 @@ +package org.nl.b_lms.pda.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.pda.service.BoxStackInOutService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.tasks.boxstack.MxInTask; +import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/14 + */ +@Service +public class BoxStackInOutServiceImpl implements BoxStackInOutService { + + @Resource + private MxInTask mxInTask; + @Resource + private RedissonClient redissonClient; + @Resource + private PointService pointService; + @Resource + private IBstIvtBoxinfoService boxinfoService; + @Resource + private IschBaseTaskService taskService; + @Resource + private IBstIvtBoxstackService boxstackService; + + @SneakyThrows + @Override + public void boxIn(JSONObject reqParam) { + String point_code = reqParam.getString("point_code"); + if (StringUtils.isBlank(point_code)) { + throw new BadRequestException("请输入入库点位"); + } + PointDto pointDto = pointService.findByCode(point_code); + if (ObjectUtil.isEmpty(pointDto)) { + throw new BadRequestException("入库点位不存在"); + } + String vehicle_code = reqParam.getString("vehicle_code"); + if (StringUtils.isBlank(vehicle_code)) { + throw new BadRequestException("请输入木箱号"); + } + String[] vehicle_codes = vehicle_code.split(","); + List box_specs = new ArrayList<>(); + for (String vehicle_code1 : vehicle_codes) { + if (StringUtils.isBlank(vehicle_code1)) { + BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, vehicle_code1)); + if (ObjectUtil.isEmpty(boxinfo)) { + throw new BadRequestException("木箱号:" + vehicle_code1 + "不存在"); + } + box_specs.add(boxinfo.getMaterial_code()); + } + } + String firstMaterial = box_specs.get(0); + boolean allMatch = box_specs.stream().allMatch(code -> code.equals(firstMaterial)); + if (!allMatch) { + throw new BadRequestException("木箱规格不一致"); + } + RLock lock = redissonClient.getLock("boxIn"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + //查询第一排非缓存区的并且无货的库位 + List noHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() + .isNull(BstIvtBoxstack::getBox_spec) + .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getX, 1) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + //判断是否满足最大数量,如果不满足 + if (noHasGoodsPointList.size() <= 3) { + //获取相同木箱规格的的第一排的库位 + List hasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getBox_spec, firstMaterial) + .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getX, 1) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + //遍历相同木箱规格同列不同排的库位是否大于最大数量 + int currentCanUseCount = 0; + for (BstIvtBoxstack bstIvtBoxstack : hasGoodsPointList) { + Integer x = bstIvtBoxstack.getX(); + Integer y = bstIvtBoxstack.getY(); + List list = boxstackService.list(new LambdaQueryWrapper() + .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + .notIn(BstIvtBoxstack::getX, x) + .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区"))); + currentCanUseCount += list.size(); + } + if (currentCanUseCount <= 3) { + List taskTypes = new ArrayList<>(Collections.singletonList(BoxStackEnum.TASK_TYPE.code("木箱入库"))); + List existTask = taskService.getExistTasks(taskTypes); + if (existTask.size() >= 3) { + throw new BadRequestException("木箱入库任务超过最大数量"); + } + } + } + JSONObject taskParam = new JSONObject(); + taskParam.put("material_code", box_specs.get(0)); + taskParam.put("vehicle_code", vehicle_code); + taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("放货二次分配")); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱入库")); + taskParam.put("point_code1", point_code); + taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); + mxInTask.createTask(reqParam); + } + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java new file mode 100644 index 0000000..9956b3f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java @@ -0,0 +1,226 @@ +package org.nl.b_lms.sch.tasks.boxstack; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; +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.IdUtil; +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.nl.wms.util.TaskUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + + +/** + * 1 木箱入库任务 木箱入库位->木箱库 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class MxInTask extends AbstractAcsTask { + + private final String THIS_CLASS = MxInTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + @Resource + private IBstIvtBoxstackService boxstackService; + @Resource + private IBstIvtBoxstacklayerService boxstacklayerService; + + @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()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) + .agv_system_type(BoxStackEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) + .interaction_json(JSON.parseObject(r.getRequest_param())) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + String now = DateUtil.now(); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentNickName = SecurityUtils.getCurrentNickName(); + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskObj.getString("task_id")) + .set(SchBaseTask::getUpdate_optid, currentUserId) + .set(SchBaseTask::getUpdate_optname, currentNickName) + .set(SchBaseTask::getUpdate_time, now); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.EXECUTING.getCode())) return; + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + log.info("任务编号为:" + schBaseTask.getTask_code() + "的任务完成接口在" + now + "被调用---------------------------------------------"); + //更新终点库存 + String box_spec = schBaseTask.getMaterial_code(); + String vehicle_code = schBaseTask.getVehicle_code(); + String[] boxNos = vehicle_code.split(","); + //修改木箱库木箱规格信息 + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code2())); + if (!ObjectUtil.isEmpty(boxstack)) { + for (int i = 0; i < boxNos.length; i++) { + //修改每层的木箱号信息 + String boxNo = boxNos[i]; + BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstacklayer::getStack_id, boxstack.getStack_id()) + .eq(BstIvtBoxstacklayer::getLayer_index, i + 1)); + if (!ObjectUtil.isEmpty(boxstacklayer)) { + boxstacklayer.setBox_code(boxNo); + boxstacklayer.setUpdate_time(now); + boxstacklayer.setUpdate_id(currentUserId); + boxstacklayer.setUpdate_name(currentNickName); + boxstacklayerService.updateById(boxstacklayer); + } + } + boxstack.setBox_spec(box_spec); + boxstack.setUpdate_time(now); + boxstack.setUpdate_id(currentUserId); + boxstack.setUpdate_name(currentNickName); + boxstackService.updateById(boxstack); + } + //3.更改任务状态为完成 + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被ACS在:" + schBaseTask.getUpdate_time() + "调用接口强制取消。"); + } + taskService.update(null, updateWrapper); + } + + @Override + @Transactional + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String taskType = form.getString("task_type"); + if (StrUtil.isBlank(taskType)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicleCode = form.getString("vehicle_code"); + String pointCode1 = form.getString("point_code1"); + if (StrUtil.isBlank(pointCode1)) { + throw new BadRequestException("起点不能为空"); + } + String pointCode2 = form.getString("point_code2"); + if (StrUtil.isBlank(pointCode2)) { + throw new BadRequestException("下一点不能为空"); + } + //是否立即下发 + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + SchBaseTaskVO schBaseTaskVo = SchBaseTaskVO.builder() + .task_type(taskType) + .vehicle_code(vehicleCode) + //二次分配要用的类型 + .vehicle_code2(form.getString("vehicle_code2")) + .point_code1(pointCode1) + .point_code2(pointCode2) + .task_group_id(form.getString("task_group_id")) + .task_id(IdUtil.getStringId()) + .task_code(IdUtil.getStringId()) + .handle_class(THIS_CLASS) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentUsername()) + .create_time(DateUtil.now()) + .is_send(isSend ? "1" : "0") + .acs_task_type(StrUtil.isEmpty(form.getString("acs_task_type")) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : form.getString("acs_task_type")) + .task_status(StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")) + .build(); + SchBaseTask task = new SchBaseTask(); + BeanUtils.copyProperties(schBaseTaskVo, task); + taskService.save(task); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(null); + } + return task.getTask_id(); + } + + + @Override + @Transactional + public void forceFinish(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("木箱入库取消接口任务号为空!"); + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId) + .set(SchBaseTask::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(SchBaseTask::getUpdate_optname, SecurityUtils.getCurrentUsername()) + .set(SchBaseTask::getUpdate_time, DateUtil.now()); + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被用户:" + schBaseTask.getUpdate_optname() + "在:" + DateUtil.now() + "强制取消。"); + taskService.update(null, updateWrapper); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java new file mode 100644 index 0000000..4086e72 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java @@ -0,0 +1,226 @@ +package org.nl.b_lms.sch.tasks.boxstack; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; +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.IdUtil; +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.nl.wms.util.TaskUtil; +import org.springframework.beans.BeanUtils; +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 MxMoveTask extends AbstractAcsTask { + + private final String THIS_CLASS = MxMoveTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + @Resource + private IBstIvtBoxstackService boxstackService; + @Resource + private IBstIvtBoxstacklayerService boxstacklayerService; + + + @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()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) + .interaction_json(JSON.parseObject(r.getRequest_param())) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + String now = DateUtil.now(); + String currentNickName = SecurityUtils.getCurrentNickName(); + String currentUserId = SecurityUtils.getCurrentUserId(); + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskObj.getString("task_id")) + .set(SchBaseTask::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(SchBaseTask::getUpdate_optname, SecurityUtils.getCurrentUsername()) + .set(SchBaseTask::getUpdate_time, now); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.EXECUTING.getCode())) return; + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + log.info("任务编号为:" + schBaseTask.getTask_code() + "的任务完成接口在" + now + "被调用---------------------------------------------"); + //更新终点库存 + String box_spec = schBaseTask.getMaterial_code(); + String vehicle_code = schBaseTask.getVehicle_code(); + String[] boxNos = vehicle_code.split(","); + //修改木箱库木箱规格信息 + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code2())); + if (!ObjectUtil.isEmpty(boxstack)) { + for (int i = 0; i < boxNos.length; i++) { + //修改每层的木箱号信息 + String boxNo = boxNos[i]; + BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstacklayer::getStack_id, boxstack.getStack_id()) + .eq(BstIvtBoxstacklayer::getLayer_index, i + 1)); + if (!ObjectUtil.isEmpty(boxstacklayer)) { + boxstacklayer.setBox_code(boxNo); + boxstacklayer.setUpdate_time(now); + boxstacklayer.setUpdate_id(currentUserId); + boxstacklayer.setUpdate_name(currentNickName); + boxstacklayerService.updateById(boxstacklayer); + } + } + boxstack.setBox_spec(box_spec); + boxstack.setUpdate_time(now); + boxstack.setUpdate_id(currentUserId); + boxstack.setUpdate_name(currentNickName); + boxstackService.updateById(boxstack); + } + //3.更改任务状态为完成 + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被ACS在:" + schBaseTask.getUpdate_time() + "调用接口强制取消。"); + } + taskService.update(null, updateWrapper); + } + + @Override + @Transactional + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String taskType = form.getString("task_type"); + if (StrUtil.isBlank(taskType)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicleCode = form.getString("vehicle_code"); + String pointCode1 = form.getString("point_code1"); + if (StrUtil.isBlank(pointCode1)) { + throw new BadRequestException("起点不能为空"); + } + String pointCode2 = form.getString("point_code2"); + if (StrUtil.isBlank(pointCode2)) { + throw new BadRequestException("下一点不能为空"); + } + //是否立即下发 + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + SchBaseTaskVO schBaseTaskVo = SchBaseTaskVO.builder() + .task_type(taskType) + .material_code(form.getString("material_code")) + .vehicle_code(vehicleCode) + .vehicle_code2(form.getString("vehicle_code2")) + .point_code1(pointCode1) + .point_code2(pointCode2) + .task_group_id(form.getString("task_group_id")) + .task_id(IdUtil.getStringId()) + .task_code(IdUtil.getStringId()) + .handle_class(THIS_CLASS) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentUsername()) + .create_time(DateUtil.now()) + .is_send(isSend ? "1" : "0") + .acs_task_type(StrUtil.isEmpty(form.getString("acs_task_type")) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : form.getString("acs_task_type")) + .task_status(StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")) + .build(); + SchBaseTask task = new SchBaseTask(); + BeanUtils.copyProperties(schBaseTaskVo, task); + taskService.save(task); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(null); + } + return task.getTask_id(); + } + + + @Override + @Transactional + public void forceFinish(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("木箱移库取消接口任务号为空!"); + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId) + .set(SchBaseTask::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(SchBaseTask::getUpdate_optname, SecurityUtils.getCurrentUsername()) + .set(SchBaseTask::getUpdate_time, DateUtil.now()); + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被用户:" + schBaseTask.getUpdate_optname() + "在:" + DateUtil.now() + "强制取消。"); + taskService.update(null, updateWrapper); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java new file mode 100644 index 0000000..75cc784 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java @@ -0,0 +1,224 @@ +package org.nl.b_lms.sch.tasks.boxstack; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +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.ObjectUtils; +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.dto.SchBaseTaskVO; +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.nl.wms.util.TaskUtil; +import org.springframework.beans.BeanUtils; +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 木箱出库任务 木箱库密集区、缓存区、零散区->出库对接位 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class MxOutTask extends AbstractAcsTask { + + + private final String THIS_CLASS = MxOutTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + + @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()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) + .interaction_json(JSON.parseObject(r.getRequest_param())) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + String now = DateUtil.now(); + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskObj.getString("task_id")) + .set(SchBaseTask::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(SchBaseTask::getUpdate_optname, SecurityUtils.getCurrentUsername()) + .set(SchBaseTask::getUpdate_time, now); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.EXECUTING.getCode())) return; + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + log.info("任务编号为:" + schBaseTask.getTask_code() + "的任务完成接口在" + now + "被调用---------------------------------------------"); + //1.改变起点点位状态 + packageinfoivtService.update(null, new UpdateWrapper().set("update_time", now).set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //2.更新库存记录 + packageinfoivtService.update(null, new UpdateWrapper().set("update_time", now).set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空载具")).eq("point_code", schBaseTask.getPoint_code2())); + //3.更改任务状态为完成 + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被ACS在:" + schBaseTask.getUpdate_time() + "调用接口强制取消。"); + } + taskService.update(null, updateWrapper); + } + + public void exchangeTaskPoint(SchBaseTask schBaseTask) { + List taskList = taskService.list(new LambdaQueryWrapper() + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + .and( + r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")) + .or() + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")) + .or() + )); + List SamePointtaskList = taskList.stream().filter(r -> r.getPoint_code4().equals(schBaseTask.getPoint_code2()) && !r.getTask_id().equals(schBaseTask.getTask_id())).collect(Collectors.toList()); + if (ObjectUtils.isNotEmpty(SamePointtaskList)) { + UpdateWrapper updateWrapper1 = new UpdateWrapper<>(); + updateWrapper1.eq("task_id", SamePointtaskList.get(0).getTask_id()); + updateWrapper1.set("point_code4", schBaseTask.getPoint_code4()); + taskService.update(null, updateWrapper1); + } + } + + @Override + @Transactional + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String taskType = form.getString("task_type"); + if (StrUtil.isBlank(taskType)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicleCode = form.getString("vehicle_code"); + // if (StrUtil.isBlank(vehicleCode)) { + // throw new BadRequestException("载具号不能为空"); + // } + String pointCode1 = form.getString("point_code1"); + if (StrUtil.isBlank(pointCode1)) { + throw new BadRequestException("起点不能为空"); + } + String pointCode2 = form.getString("point_code2"); + if (StrUtil.isBlank(pointCode2)) { + throw new BadRequestException("下一点不能为空"); + } + String pointCode3 = form.getString("point_code3"); + //是否立即下发 + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + SchBaseTaskVO schBaseTaskVo = SchBaseTaskVO.builder() + .task_type(taskType) + .vehicle_code(vehicleCode) + .vehicle_code2(form.getString("vehicle_code2")) + .point_code1(pointCode1) + .point_code2(pointCode2) + .point_code3(pointCode3) + .point_code4(form.getString("point_code4")) + .task_group_id(form.getString("task_group_id")) + .task_id(org.nl.common.utils.IdUtil.getStringId()) + .task_code(org.nl.common.utils.IdUtil.getStringId()) + .handle_class(THIS_CLASS) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentUsername()) + .create_time(DateUtil.now()) + .is_send(isSend ? "1" : "0") + .acs_task_type(StrUtil.isEmpty(form.getString("acs_task_type")) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : form.getString("acs_task_type")) + .task_status(StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")) + .product_area(StrUtil.isEmpty(form.getString("product_area")) ? "BLK" : form.getString("product_area")) + .build(); + SchBaseTask task = new SchBaseTask(); + BeanUtils.copyProperties(schBaseTaskVo, task); + taskService.save(task); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(null); + } + return task.getTask_id(); + } + + + @Override + @Transactional + public void forceFinish(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区->空载具缓存位取消接口任务号为空!"); + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId) + .set(SchBaseTask::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(SchBaseTask::getUpdate_optname, SecurityUtils.getCurrentUsername()) + .set(SchBaseTask::getUpdate_time, DateUtil.now()); + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被用户:" + schBaseTask.getUpdate_optname() + "在:" + DateUtil.now() + "强制取消。"); + taskService.update(null, updateWrapper); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java new file mode 100644 index 0000000..4c3e136 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java @@ -0,0 +1,180 @@ +package org.nl.b_lms.sch.tasks.boxstack.auto; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.tasks.boxstack.MxMoveTask; +import org.nl.common.utils.IdUtil; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoMxMoveTask { + + @Resource + private IschBaseTaskService taskService; + private final String THIS_CLASS = AutoMxMoveTask.class.getName(); + @Resource + private RedissonClient redissonClient; + @Resource + private MxMoveTask mxMoveTask; + @Resource + private IBstIvtBoxstackService boxstackService; + + //满轴->待检区agv自动搬运任务 + public void run() { + try { + this.sendMxMove(); + } catch (Exception ex) { + log.error(ex.getMessage()); + } + } + + + @SneakyThrows + public void sendMxMove() { + log.info(THIS_CLASS + "-根据装箱计划木箱库移库定时任务开始执行扫描。"); + RLock lock = redissonClient.getLock("boxMove"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + //获取装箱计划 + List zxjhs = new ArrayList<>(); + for (String box_spec : zxjhs) { + //判断木箱库是否存在该木箱规格的木箱 + List hasGoodsPoint = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getBox_spec, box_spec) + .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + if (!CollectionUtil.isEmpty(hasGoodsPoint)) { + //查询缓存区可用库位的数量 + List hcqNoHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() + .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getX, 1) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + if (hcqNoHasGoodsPointList.size() <= 3) { + //获取缓存区相同木箱规格的的第一排的库位 + List hcqHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getBox_spec, box_spec) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getX, 1) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + //遍历相同木箱规格同列不同排的库位是否大于最大数量 + int currentCanUseCount = 0; + for (BstIvtBoxstack bstIvtBoxstack : hcqHasGoodsPointList) { + Integer x = bstIvtBoxstack.getX(); + Integer y = bstIvtBoxstack.getY(); + List list = boxstackService.list(new LambdaQueryWrapper() + .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + .notIn(BstIvtBoxstack::getX, x) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区"))); + currentCanUseCount += list.size(); + } + if (currentCanUseCount <= 3) { + List taskTypes = new ArrayList<>(Collections.singletonList(BoxStackEnum.TASK_TYPE.code("木箱移库"))); + List existTask = taskService.getExistTasks(taskTypes); + if (existTask.size() >= 3) { + break; + } + } + } + //如果存在则根据装箱计划获取需要移库的木箱规格的数量 + int needBoxNum = 10; + int hasBoxNum = hasGoodsPoint.stream() + .map(BstIvtBoxstack::getCurrent_layer_count) + .filter(Objects::nonNull) + .mapToInt(Integer::intValue) + .sum(); + //如果需要的木箱数量小于木箱库内的该木箱规格的数量 + if (needBoxNum <= hasBoxNum) { + List sortedList = hasGoodsPoint.stream() + .sorted(Comparator + .comparing(BstIvtBoxstack::getY) + .thenComparing(Comparator.comparingInt(BstIvtBoxstack::getX).reversed())) + .collect(Collectors.toList()); + List selected = new ArrayList<>(); + int total = 0; + for (BstIvtBoxstack boxstack : sortedList) { + if (total >= needBoxNum) break; + Integer layerCount = boxstack.getCurrent_layer_count(); + selected.add(boxstack); + total += layerCount; + } + String task_group_id = IdUtil.getStringId(); + for (int i = 0; i < selected.size(); i++) { + JSONObject requestParam = new JSONObject(); + requestParam.put("needQty", needBoxNum); + JSONObject taskParam = new JSONObject(); + taskParam.put("task_group_id", task_group_id); + taskParam.put("material_code", box_spec); + taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); + taskParam.put("vehicle_code", null); + taskParam.put("point_code1", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); + taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点2")); + taskParam.put("requestParam", requestParam); + mxMoveTask.createTask(taskParam); + } + } else { + String task_group_id = IdUtil.getStringId(); + //如果需要的该木箱规格的数量大于木箱库内的数量 + for (int i = 0; i < hasGoodsPoint.size(); i++) { + JSONObject requestParam = new JSONObject(); + requestParam.put("needQty", hasBoxNum); + JSONObject taskParam = new JSONObject(); + taskParam.put("task_group_id", task_group_id); + taskParam.put("material_code", box_spec); + taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); + taskParam.put("vehicle_code", null); + taskParam.put("point_code1", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); + taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点2")); + taskParam.put("requestParam", requestParam); + mxMoveTask.createTask(taskParam); + } +// for (BstIvtBoxstack bstIvtBoxstack : hasGoodsPoint) { +// List boxstacklayerList = boxstacklayerService.list(new LambdaQueryWrapper() +// .eq(BstIvtBoxstacklayer::getStack_id, bstIvtBoxstack.getStack_id())); +// String vehicle_code = boxstacklayerList.stream() +// .map(BstIvtBoxstacklayer::getBox_code) +// .filter(Objects::nonNull) +// .filter(boxNo -> !boxNo.isEmpty()) +// .collect(Collectors.joining(",")); + +// } + //TODO 是否修改装箱计划中剩余需要移库木箱的数量 + } + } + } + } else { + log.info("木箱移库自动搬运任务正在创建被锁住。"); + } + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + } +} 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 index d4dea34..0c91a1a 100644 --- 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 @@ -41,7 +41,7 @@ public class BstIvtBoxinfoController { return new ResponseEntity<>(iBstIvtBoxinfoService.boxIvtQuery(whereJson, page), HttpStatus.OK); } - @PostMapping("/saveBoxInfo") + @PostMapping @Log("保存木箱信息") public ResponseEntity saveBoxInfo(@RequestBody JSONObject jsonObject) { return new ResponseEntity<>(iBstIvtBoxinfoService.saveBoxInfo(jsonObject), HttpStatus.OK); 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 index 061abf3..c43ddf9 100644 --- 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.springframework.data.domain.Pageable; +import java.util.List; import java.util.Map; /** @@ -42,7 +43,7 @@ public interface IBstIvtBoxinfoService extends IService { */ BstIvtBoxinfo mesInsert(JSONObject whereJson); - JSONObject saveBoxInfo(JSONObject jsonObject); + List saveBoxInfo(JSONObject jsonObject); BstIvtBoxinfo getBoxInfo(JSONObject jsonObject); 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 index be8cbc9..ec98b39 100644 --- 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 @@ -80,7 +80,7 @@ public class BstIvtBoxinfo implements Serializable { /* * 捆绑数量 */ - private String lash_num; + private String lash_num = "1"; /* * 插入时间 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 index 55e2923..c84ae7d 100644 --- 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 @@ -1,5 +1,6 @@ package org.nl.b_lms.storage_manage.database.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; @@ -14,6 +15,7 @@ import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.database.service.dao.MdpbBoxtype; import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; import org.nl.common.TableDataInfo; +import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.util.SpringContextHolder; @@ -25,9 +27,12 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** *

@@ -59,6 +64,7 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl result = bstIvtBoxinfoMapper.selectPage(new Page<>(page.getPageNumber() + 1, page.getPageSize()), queryWrapper); mapReslt.put("content", result.getRecords()); mapReslt.put("totalElements", result.getTotal()); @@ -83,8 +89,8 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl1){ - height=height.substring(0,i); + if (i > 1) { + height = height.substring(0, i); } boxDao = BstIvtBoxinfo.builder() .box_id(IdUtil.getStringId()) @@ -112,11 +118,11 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl1){ - height=height.substring(0,i); + if (i > 1) { + height = height.substring(0, i); } boxDao.setBox_high(height); boxDao.setBox_length(whereJson.getString("Length")); @@ -137,20 +143,50 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl saveBoxInfo(JSONObject jsonObject) { //从MES获取包装关系 - String boxNo = jsonObject.getString("box_no"); + String material_code = jsonObject.getString("material_code"); + String material_name = jsonObject.getString("material_name"); + String num = jsonObject.getString("num"); + String lash_num = jsonObject.getString("lash_num"); + String vehicle_type = jsonObject.getString("vehicle_type"); + String is_packing = jsonObject.getString("is_packing"); String box_weight = jsonObject.getString("box_weight"); - BstIvtBoxinfo boxinfo = bstIvtBoxinfoMapper.selectOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, boxNo)); - if (boxinfo == null) { - throw new BadRequestException("未查询到该木箱对应的木箱信息"); + int box_num = jsonObject.getIntValue("box_num"); + Pattern pattern = Pattern.compile("(\\d+\\*\\d+\\*\\d+)"); + Matcher matcher = pattern.matcher(material_name); + if (!matcher.find()) { + throw new BadRequestException("木箱名称有误,不包含长宽高!"); } - boxinfo.setBox_weight(box_weight); - bstIvtBoxinfoMapper.updateById(boxinfo); - JSONObject jo = new JSONObject(); - jo.put("message", "修改成功!"); - return jo; + String lwh = matcher.group(1); + String[] lwhs = lwh.split("\\*"); + String box_length = lwhs[0]; + String box_width = lwhs[1]; + String box_high = lwhs[2]; + List boxinfos = new ArrayList<>(); + for (int i = 0; i < box_num; i++) { + BstIvtBoxinfo boxinfo = BstIvtBoxinfo.builder() + .box_id(IdUtil.getStringId()) + .box_no(CodeUtil.getNewCode("BOX_CODE")) + .material_code(material_code) + .material_name(material_name) + .num(num) + .box_length(box_length) + .box_width(box_width) + .box_high(box_high) + .vehicle_type(vehicle_type) + .is_packing(is_packing) + .insert_time(DateUtil.now()) + .box_weight(box_weight) + .build(); + boxinfos.add(boxinfo); + } + if (CollectionUtil.isNotEmpty(boxinfos)) { + this.saveBatch(boxinfos); + } + return boxinfos; } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/MaterialbaseService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/MaterialbaseService.java index 36a27b5..4691286 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/MaterialbaseService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/MaterialbaseService.java @@ -91,7 +91,6 @@ public interface MaterialbaseService { JSONArray getProductSeries(String parent_class_id); - /** * 通过物料编码获取物料列表JSONObject *

使用mybatis-plus

diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/impl/MaterialbaseServiceImpl.java index f8e8910..e675397 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/md/service/impl/MaterialbaseServiceImpl.java @@ -233,7 +233,7 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { } return newParentArray; } - + @Override public List getMaterialAllByCodes(List materialCodes) { LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); diff --git a/lms/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js b/lms/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js index 3b3f371..f37b3d5 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js +++ b/lms/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js @@ -32,6 +32,14 @@ export function getMaterOptType(data) { }) } +export function getMaterialByName(data) { + return request({ + url: 'api/Materialbase/getMaterialByName', + method: 'post', + data + }) +} + export function isAlongMaterType(data) { return request({ url: 'api/Materialbase/isAlongMaterType', @@ -47,4 +55,4 @@ export function getProductSeries() { }) } -export default { add, edit, del, getMaterOptType, isAlongMaterType, getProductSeries } +export default { add, edit, del, getMaterOptType, isAlongMaterType, getProductSeries, getMaterialByName } diff --git a/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/MaterDialog.vue b/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/MaterDialog.vue new file mode 100644 index 0000000..501af4f --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/MaterDialog.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/index.vue b/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/index.vue index b6c7d38..8e434c2 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/st/boxInfo/index.vue @@ -37,76 +37,114 @@ - + - + + + 打印 + + - + - - + + - - + + - - + + - - + + + + - - + + - - - - - - - - - + + + + {{ item.label }} + + - --> + - - - - - - - - - - - - + - + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/LayerViewDialog.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/LayerViewDialog.vue new file mode 100644 index 0000000..cdb0de2 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/LayerViewDialog.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/MaterDialog.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/MaterDialog.vue new file mode 100644 index 0000000..a32d622 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/MaterDialog.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/boxstack.js b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/boxstack.js new file mode 100644 index 0000000..95823e3 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/boxstack.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/bstIvtboxstack', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/bstIvtboxstack', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/bstIvtboxstack', + method: 'put', + data + }) +} + +export function getBoxLayer(id) { + return request({ + url: 'api/bstIvtboxstacklayer/getBoxLayer/' + id, + method: 'get', + }) +} + +export function saveBoxStack(data) { + return request({ + url: 'api/bstIvtboxstack/saveBoxStack', + method: 'post', + data + }) +} + +export default {add, edit, del, getBoxLayer, saveBoxStack} diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/index.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/index.vue new file mode 100644 index 0000000..eea13c1 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/boxstack/index.vue @@ -0,0 +1,320 @@ + + + + +