diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java index 7b6800b..79ba26b 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java @@ -1,5 +1,6 @@ package org.nl.wms.basedata_manage.service.dao; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -305,4 +306,10 @@ public class Structattr implements Serializable { */ private String remark; + /** + * 备注任务标识 + */ + @TableField(exist = false) + private String task_id; + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpOutMoveTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpOutMoveTask.java new file mode 100644 index 0000000..7e56bb6 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpOutMoveTask.java @@ -0,0 +1,221 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.sch_manage.service.util.TaskType; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 空载具出库移库任务类 + *

+ * + * @author Liuxy + * @since 2025-09-12 + */ +@Component(value = "EmpOutMoveTask") +@TaskType("EmpOutMoveTask") +public class EmpOutMoveTask extends AbstractTask { + + /** + * 任务服务类 + */ + @Autowired + private ISchBaseTaskService taskService; + + /** + * 仓位服务 + */ + @Autowired + private IStructattrService iStructattrService; + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(EmpOutMoveTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setVehicle_code2(json.getString("vehicle_code2")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + + // 下发任务 + this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + return acsTaskDto; + } + + @Override + @Transactional + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj); + } + } + + @Override + @Transactional + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @Override + @Transactional + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { + throw new BadRequestException("只能取消生成中的任务!"); + } + this.cancelTask(taskObj); + } + + @Override + public void taskConfirm(String task_code) { + } + + @Override + public JSONObject resultWeigh(SchBaseTask taskObj) { + return null; + } + + @Transactional + public void finishTask(SchBaseTask taskObj) { + // 起点货位 + Structattr startStruct = iStructattrService.getByCode(taskObj.getPoint_code1()); + // 终点货位 + Structattr endStruct = iStructattrService.getByCode(taskObj.getPoint_code2()); + + // 更新起点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("空托盘出库锁")) + .set(Structattr::getStoragevehicle_code, endStruct.getStoragevehicle_code()) + .set(Structattr::getIs_emptyvehicle, + endStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES + : IOSConstant.IS_DELETE_NO + ) + ); + + // 更新终点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(Structattr::getStoragevehicle_code, startStruct.getStoragevehicle_code()) + .set(Structattr::getIs_emptyvehicle, + startStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES + : IOSConstant.IS_DELETE_NO + ) + ); + + // 更新任务状态 + taskObj.setRemark("已完成"); + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskService.updateById(taskObj); + } + + @Transactional + public void cancelTask(SchBaseTask taskObj) { + + // 取消空载具出库任务 + SchBaseTask empTask = taskService.getById(taskObj.getExt_group_data()); + empTask.setRemark("已取消"); + empTask.setTask_status(TaskStatus.CANCELED.getCode()); + taskService.updateById(empTask); + + + // 更新起点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + ); + // 更新终点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + ); + + // 更新当前任务状态 + taskObj.setRemark("已取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskService.updateById(taskObj); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IosOutMoveTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IosOutMoveTask.java new file mode 100644 index 0000000..311c025 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IosOutMoveTask.java @@ -0,0 +1,250 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.sch_manage.service.util.TaskType; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + *

+ * 出库单出库移库任务类 + *

+ * + * @author Liuxy + * @since 2025-09-12 + */ +@Component(value = "IosOutMoveTask") +@TaskType("IosOutMoveTask") +public class IosOutMoveTask extends AbstractTask { + + /** + * 任务服务类 + */ + @Autowired + private ISchBaseTaskService taskService; + + /** + * 仓位服务 + */ + @Autowired + private IStructattrService iStructattrService; + + /* + * 分配明细mapper + */ + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(IosOutMoveTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setVehicle_code2(json.getString("vehicle_code2")); + task.setExt_group_data(json.getString("ext_group_data")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + + // 下发任务 + this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + return acsTaskDto; + } + + @Override + @Transactional + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj); + } + } + + @Override + @Transactional + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @Override + @Transactional + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { + throw new BadRequestException("只能取消生成中的任务!"); + } + this.cancelTask(taskObj); + } + + @Override + public void taskConfirm(String task_code) { + } + + @Override + public JSONObject resultWeigh(SchBaseTask taskObj) { + return null; + } + + @Transactional + public void finishTask(SchBaseTask taskObj) { + // 起点货位 + Structattr startStruct = iStructattrService.getByCode(taskObj.getPoint_code1()); + // 终点货位 + Structattr endStruct = iStructattrService.getByCode(taskObj.getPoint_code2()); + + // 更新起点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁")) + .set(Structattr::getStoragevehicle_code, endStruct.getStoragevehicle_code()) + .set(Structattr::getInv_id, endStruct.getInv_id()) + .set(Structattr::getInv_code, endStruct.getInv_code()) + .set(Structattr::getInv_type, endStruct.getInv_type()) + .set(Structattr::getIs_emptyvehicle, + endStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES + : IOSConstant.IS_DELETE_NO + ) + ); + + // 更新终点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(Structattr::getStoragevehicle_code, startStruct.getStoragevehicle_code()) + .set(Structattr::getInv_id, null) + .set(Structattr::getInv_code, null) + .set(Structattr::getInv_type, null) + .set(Structattr::getIs_emptyvehicle, + startStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES + : IOSConstant.IS_DELETE_NO + ) + ); + + // 更新任务状态 + taskObj.setRemark("已完成"); + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskService.updateById(taskObj); + } + + @Transactional + public void cancelTask(SchBaseTask taskObj) { + // 查询终点仓位信息 + Structattr attrDao = iStructattrService.getByCode(taskObj.getPoint_code2()); + + // 还原出库分配明细仓位 / 取消分配明细任务 + IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectById(taskObj.getExt_group_data()); + // 取消分配明细任务 + SchBaseTask disTask = taskService.getById(ioStorInvDis.getTask_id()); + disTask.setRemark("已取消"); + disTask.setTask_status(TaskStatus.CANCELED.getCode()); + taskService.updateById(disTask); + + ioStorInvDis.setStruct_id(attrDao.getStruct_id()); + ioStorInvDis.setStruct_code(attrDao.getStruct_code()); + ioStorInvDis.setStruct_name(attrDao.getStruct_name()); + ioStorInvDis.setTask_id(""); + ioStorInvDis.setPoint_code(""); + ioStorInvDis.setIs_issued(IOSConstant.ZERO); + ioStorInvDis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("未生成")); + ioStorInvDisMapper.updateById(ioStorInvDis); + + // 更新起点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + ); + // 更新终点 + iStructattrService.update( + new UpdateWrapper().lambda() + .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁")) + ); + + // 更新任务状态 + taskObj.setRemark("已取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskService.updateById(taskObj); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index 6e2a75d..a9ee989 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java @@ -73,6 +73,9 @@ public enum IOSEnum { "库存锁","7", "回库锁","8", "其他锁","99" )), + // 仓位类型 + PLACEMENT_TYPE(MapOf.of("深货位", "1", "浅货位", "2")), + // 库区编码 SECT_CODE(MapOf.of("合格区", "HG01", "待检区", "DJ01", "不合格区", "BHG01")), diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java index a026811..f629932 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java @@ -8,6 +8,7 @@ import org.nl.common.domain.query.PageQuery; import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto; import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.warehouse_management.service.dao.IOStorInv; +import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; import org.nl.wms.warehouse_management.service.dto.IOStorInvDisDto; import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto; import org.springframework.data.domain.Pageable; @@ -176,4 +177,19 @@ public interface IOutBillService extends IService { * @return */ List> getIoDisDtl(JSONObject param); + + /** + * 一键设置:创建任务 + * @param ioStorInvDis 分配明细实体类 + * @param point_code 出库点位 + * @param ioStorInv 主表实体类 + */ + void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv); + + /** + * 一键设置:下发任务校验是否阻挡 + * @param ioStorInvDis 分配明细实体类 + * @return struct_code 仓位编码 + */ + String checkIsHinder(IOStorInvDis ioStorInvDis); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/IOStorInvDis.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/IOStorInvDis.java index f8592d9..c45658e 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/IOStorInvDis.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/IOStorInvDis.java @@ -1,5 +1,6 @@ package org.nl.wms.warehouse_management.service.dao; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -132,4 +133,34 @@ public class IOStorInvDis implements Serializable { */ private BigDecimal check_qty; + /** + * 仓位放置类型 + */ + @TableField(exist = false) + private String placement_type; + + /** + * 仓位巷道 + */ + @TableField(exist = false) + private String block_num; + + /** + * 仓位排 + */ + @TableField(exist = false) + private BigDecimal row_num; + + /** + * 仓位列 + */ + @TableField(exist = false) + private BigDecimal col_num; + + /** + * 仓位层 + */ + @TableField(exist = false) + private BigDecimal layer_num; + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.java index 0589580..cb306d3 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.java @@ -25,4 +25,11 @@ public interface IOStorInvDisMapper extends BaseMapper { List queryOutBillDisDtl(@Param("params") Map whereJson); List> getIoDisDtl(@Param("param") JSONObject param); + + /** + * 获取下发任务的分配明细 + * @param param / + * @return List + */ + List getListDisSend(@Param("param") JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.xml index 4a8bec8..b0757fc 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/IOStorInvDisMapper.xml @@ -101,4 +101,26 @@ ORDER BY ios.bill_code, dis.seq_no ASC + + diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java index 2fcee25..1bcf524 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java @@ -19,11 +19,13 @@ import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.SecurityUtils; import org.nl.config.IdUtil; +import org.nl.config.SpringContextHolder; import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.IBsrealStorattrService; import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService; import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.dao.BsrealStorattr; +import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto; import org.nl.wms.pdm_manage.enums.BomEnum; @@ -36,6 +38,7 @@ import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.TaskFactory; +import org.nl.wms.sch_manage.service.util.tasks.IosOutMoveTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; import org.nl.wms.warehouse_management.service.IOutBillService; @@ -131,6 +134,18 @@ public class OutBillServiceImpl extends ServiceImpl @Resource private IPdmBomCallMaterialService iPdmBomCallMaterialService; + /** + * 出库单服务 + */ + @Autowired + private IOutBillService iOutBillService; + + /** + * 出库单出库移库任务类 + */ + @Autowired + private IosOutMoveTask iosOutMoveTask; + /** * 任务工厂服务 */ @@ -212,6 +227,7 @@ public class OutBillServiceImpl extends ServiceImpl } @Override + @Transactional public void update(JSONObject whereJson) { String iostorinv_id = (String) whereJson.get("iostorinv_id"); @@ -268,6 +284,7 @@ public class OutBillServiceImpl extends ServiceImpl } @Override + @Transactional public void deleteAll(String[] ids) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); @@ -782,6 +799,7 @@ public class OutBillServiceImpl extends ServiceImpl } @Override + @Transactional public void autoCancel(JSONObject whereJson) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); @@ -1010,6 +1028,7 @@ public class OutBillServiceImpl extends ServiceImpl } @Override + @Transactional public void oneCancel(JSONObject whereJson) { String currentUserId = SecurityUtils.getCurrentUserId(); @@ -1112,50 +1131,139 @@ public class OutBillServiceImpl extends ServiceImpl throw new BadRequestException("未查到相关出库单"); } - List ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) - .eq(IOStorInvDis::getIostorinv_id, iostorinv_id) - .eq(IOStorInvDis::getIs_issued, BaseDataEnum.IS_YES_NOT.code("否")) - .and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).ne(IOStorInvDis::getStruct_code, "")) - .orderByAsc(IOStorInvDis::getIs_check) + List ioStorInvDisList = ioStorInvDisMapper.getListDisSend(whereJson); - ); if (ObjectUtil.isEmpty(ioStorInvDisList)) { throw new BadRequestException("当前没有可设置的分配明细"); } - // 根据任务类创建任务 - IOStorInv iosMstDao = ioStorInvMapper.selectById(ioStorInvDisList.get(0).getIostorinv_id()); for (IOStorInvDis ioStorInvDis : ioStorInvDisList) { - //创建任务 - JSONObject task_form = new JSONObject(); - task_form.put("task_type", "STOutTask"); - task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); - task_form.put("point_code1", ioStorInvDis.getStruct_code()); - task_form.put("point_code2", point_code); - task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); - task_form.put("material_id", ioStorInvDis.getMaterial_id()); - task_form.put("material_qty", ioStorInvDis.getPlan_qty()); - if (ioStorInvDis.getIs_check().equals(IOSConstant.ONE)) { - task_form.put("is_wait", IOSConstant.ONE); - } else { - task_form.put("is_wait", IOSConstant.ZERO); - } - - AbstractTask task = taskFactory.getTask(IOSEnum.OUT_CONFIG_CODE.code(iosMstDao.getBill_type())); - String task_id = task.create(task_form); - - //分配明细表更新任务相关数据 - IOStorInvDis dis = new IOStorInvDis(); - dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_id()); - dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); - dis.setTask_id(task_id); - dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); - dis.setPoint_code(point_code); - ioStorInvDisMapper.updateById(dis); + // 创建任务 + iOutBillService.createTask(ioStorInvDis,point_code,ioStorInv); } } @Override + public void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv) { + /* + * 判断是否是深浅货位 + * 1.浅货位:直接创建任务 + * 2.深货位 + * 1):判断浅货位没货:直接创建任务 + * 2):浅货位有货且未锁定:生成深浅货位互换移库后在下发出库任务 + * 3):浅货位有货且锁定:判断是否此单据下的出库任务,如果是则直接生成出库任务 + * 如果不是则报错提示 + */ + // 调用校验方法 + String struct_code = iOutBillService.checkIsHinder(ioStorInvDis); + + //创建任务 + JSONObject task_form = new JSONObject(); + task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); + task_form.put("point_code1", struct_code); + task_form.put("point_code2", point_code); + task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); + task_form.put("material_id", ioStorInvDis.getMaterial_id()); + task_form.put("material_qty", ioStorInvDis.getPlan_qty()); + if (ioStorInvDis.getIs_check().equals(IOSConstant.ONE)) { + task_form.put("is_wait", IOSConstant.ONE); + } else { + task_form.put("is_wait", IOSConstant.ZERO); + } + + AbstractTask task = taskFactory.getTask(IOSEnum.OUT_CONFIG_CODE.code(ioStorInv.getBill_type())); + String task_id = task.create(task_form); + + //分配明细表更新任务相关数据 + IOStorInvDis dis = new IOStorInvDis(); + dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_id()); + dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); + dis.setTask_id(task_id); + dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); + dis.setPoint_code(point_code); + ioStorInvDisMapper.updateById(dis); + } + + @Override + public String checkIsHinder(IOStorInvDis ioStorInvDis) { + // 返回仓位 + String struct_code; + + // 1.判断仓位深浅货位 + if (ioStorInvDis.getPlacement_type().equals(IOSEnum.PLACEMENT_TYPE.code("浅货位"))) { + // 浅货位直接生成任务 + return ioStorInvDis.getStruct_code(); + } + + // 2.深货位:判断浅货位是否有货 + // 查询浅货位 + Structattr shallowAttr = iStructattrService.getOne( + new QueryWrapper().lambda() + .eq(Structattr::getBlock_num, ioStorInvDis.getBlock_num()) + .eq(Structattr::getCol_num, ioStorInvDis.getCol_num()) + .eq(Structattr::getLayer_num, ioStorInvDis.getLayer_num()) + .eq(Structattr::getPlacement_type, IOSEnum.PLACEMENT_TYPE.code("浅货位")) + ); + if (ObjectUtil.isEmpty(shallowAttr)) { + throw new BadRequestException("仓位【"+ioStorInvDis.getStruct_code()+"】对应的浅货位不存在,请检查数据!"); + } + + // 判断浅货位是否有货 + if (ObjectUtil.isNotEmpty(shallowAttr.getStoragevehicle_code())) { + // 判断是否被锁定 + if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 未锁定:生成出库移库任务 + JSONObject jsonMoveTask = new JSONObject(); + jsonMoveTask.put("point_code1", shallowAttr.getStruct_code()); + jsonMoveTask.put("point_code2", ioStorInvDis.getStruct_code()); + jsonMoveTask.put("vehicle_code", shallowAttr.getStoragevehicle_code()); + jsonMoveTask.put("vehicle_code2", ioStorInvDis.getStoragevehicle_code()); + jsonMoveTask.put("ext_group_data", ioStorInvDis.getIostorinvdis_id()); + iosOutMoveTask.create(jsonMoveTask); + + // 更新起点锁类型 + iStructattrService.update( + new UpdateWrapper().lambda() + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移出锁")) + .eq(Structattr::getStruct_code, jsonMoveTask.getString("point_code1")) + ); + // 更新终点锁类型 + iStructattrService.update( + new UpdateWrapper().lambda() + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移入锁")) + .eq(Structattr::getStruct_code, jsonMoveTask.getString("point_code2")) + ); + // 更新分配明细新仓位 + ioStorInvDis.setStruct_id(shallowAttr.getStruct_id()); + ioStorInvDis.setStruct_code(shallowAttr.getStruct_code()); + ioStorInvDis.setStruct_name(shallowAttr.getStruct_name()); + ioStorInvDisMapper.updateById(ioStorInvDis); + + struct_code = shallowAttr.getStruct_code(); + } else { + // 被锁定:判断是否是本单据 + if (ObjectUtil.isNotEmpty(shallowAttr.getInv_id()) && shallowAttr.getInv_id().equals(ioStorInvDis.getIostorinv_id())) { + // 相同单据出库任务:直接生成出库任务 + return ioStorInvDis.getStruct_code(); + } else { + throw new BadRequestException("当前仓位【"+shallowAttr.getStruct_code()+"】被其他出库单据锁定或人工锁定,无法下发移库任务!"); + } + } + } else { + // 浅货位无货 + if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 直接生成出库任务 + return ioStorInvDis.getStruct_code(); + } else { + throw new BadRequestException("当前仓位【"+shallowAttr.getStruct_code()+"】有其他入库任务或人工锁定,无法下发出库任务,请等待任务完成或人工解锁!"); + } + } + + return struct_code; + } + + @Override + @Transactional public void confirm(JSONObject whereJson) { String currentUserId = SecurityUtils.getCurrentUserId(); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java index 9a13d07..8f767ba 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java @@ -771,6 +771,7 @@ public class RawAssistIStorServiceImpl extends ServiceImpl wrapper.isNull(Structattr::getStoragevehicle_code).or().eq(Structattr::getStoragevehicle_code, "")) + .orderByAsc(Structattr::getPlacement_type) .orderByAsc(Structattr::getStruct_code) ); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleInServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleInServiceImpl.java index a04643f..e5a9dda 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleInServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleInServiceImpl.java @@ -139,6 +139,7 @@ public class VehicleInServiceImpl implements VehicleInService { .eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO) .eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES) .and(wrapper -> wrapper.isNull(Structattr::getStoragevehicle_code).or().eq(Structattr::getStoragevehicle_code, "")) + .orderByAsc(Structattr::getPlacement_type) .orderByAsc(Structattr::getStruct_code) ); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleOutServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleOutServiceImpl.java index d1d9649..15a9195 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleOutServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/VehicleOutServiceImpl.java @@ -3,13 +3,18 @@ package org.nl.wms.warehouse_management.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper; +import org.nl.wms.sch_manage.service.util.tasks.EmpOutMoveTask; import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleOutTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; @@ -34,11 +39,17 @@ import java.util.Map; public class VehicleOutServiceImpl implements VehicleOutService { /** - * 任务服务 + * 任务mapper */ @Autowired private SchBaseTaskMapper schBaseTaskMapper; + /** + * 任务服务 + */ + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + /** * 仓位服务 */ @@ -51,6 +62,12 @@ public class VehicleOutServiceImpl implements VehicleOutService { @Resource private EmpVehicleOutTask empVehicleOutTask; + /** + * 空载具出库移库任务类 + */ + @Autowired + private EmpOutMoveTask empOutMoveTask; + @Override public IPage queryAll(Map whereJson, PageQuery page) { whereJson.put("config_code", EmpVehicleOutTask.class.getSimpleName()); @@ -61,10 +78,55 @@ public class VehicleOutServiceImpl implements VehicleOutService { @Transactional public void create(JSONObject whereJson) { // 根据库区找空载具 - Structattr structattr = autoDivStruct(whereJson); - // 锁定仓位 - structattr.setLock_type(IOSEnum.LOCK_TYPE.code("空托盘出库锁")); - iStructattrService.updateById(structattr); + List attrList = autoDivStruct(whereJson); + + Structattr structattr = new Structattr(); + for (Structattr attrDao : attrList) { + // 判断是深浅货位 + if (attrDao.getPlacement_type().equals(IOSEnum.PLACEMENT_TYPE.code("浅货位"))) { + // 直接创建出库任务 + structattr = attrDao; + break; + } else { + // 深货位:判断浅货位是否有货 + // 查询浅货位 + Structattr shallowAttr = iStructattrService.getOne( + new QueryWrapper().lambda() + .eq(Structattr::getBlock_num, attrDao.getBlock_num()) + .eq(Structattr::getCol_num, attrDao.getCol_num()) + .eq(Structattr::getLayer_num, attrDao.getLayer_num()) + .eq(Structattr::getPlacement_type, IOSEnum.PLACEMENT_TYPE.code("浅货位")) + ); + if (ObjectUtil.isEmpty(shallowAttr)) { + throw new BadRequestException("仓位【" + attrDao.getStruct_code() + "】对应的浅货位不存在,请检查数据!"); + } + + if (ObjectUtil.isEmpty(shallowAttr.getStoragevehicle_code())) { + // 浅货位空位 + if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 直接创建出库任务 + structattr = attrDao; + break; + } else { + continue; + } + + } else { + // 浅货位有货 + if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 创建移库任务 + structattr = createMoveTask(attrDao, shallowAttr); + break; + } else { + continue; + } + } + } + } + + if (ObjectUtil.isEmpty(structattr)) { + throw new BadRequestException("暂时没有可用的空载具!"); + } // 创建任务 JSONObject jsonTask = new JSONObject(); @@ -72,10 +134,54 @@ public class VehicleOutServiceImpl implements VehicleOutService { jsonTask.put("point_code2", IOSConstant.CZW_POINT); // 判断终点是否是称重位 jsonTask.put("point_code3", whereJson.getString("point_code").equals(IOSConstant.CZW_POINT) - ? "" : whereJson.getString("point_code") + ? "" : whereJson.getString("point_code") ); jsonTask.put("vehicle_code", structattr.getStoragevehicle_code()); - empVehicleOutTask.create(jsonTask); + String task_id = empVehicleOutTask.create(jsonTask); + + if (ObjectUtil.isNotEmpty(structattr.getTask_id())) { + // 更新空载具出库任务类ext_group_data字段 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getExt_group_data, task_id) + .eq(SchBaseTask::getTask_id, structattr.getTask_id()) + ); + } + } + + /** + * 创建移库任务 + * + * @param attrDao 深货位 + * @param shallowAttr 浅货位 + * @return Structattr 新货位 + */ + private Structattr createMoveTask(Structattr attrDao, Structattr shallowAttr) { + // 锁定起点 + iStructattrService.update( + new UpdateWrapper().lambda() + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移出锁")) + .eq(Structattr::getStruct_code, shallowAttr.getStruct_code()) + ); + // 锁定终点 + iStructattrService.update( + new UpdateWrapper().lambda() + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移入锁")) + .eq(Structattr::getStruct_code, attrDao.getStruct_code()) + ); + + // 创建移库任务 + JSONObject jsonMoveTask = new JSONObject(); + jsonMoveTask.put("point_code1", shallowAttr.getStruct_code()); + jsonMoveTask.put("point_code2", attrDao.getStruct_code()); + jsonMoveTask.put("vehicle_code", shallowAttr.getStoragevehicle_code()); + jsonMoveTask.put("vehicle_code2", attrDao.getStoragevehicle_code()); + + String task_id = empOutMoveTask.create(jsonMoveTask); + shallowAttr.setTask_id(task_id); + + shallowAttr.setStoragevehicle_code(attrDao.getStoragevehicle_code()); + return shallowAttr; } /** @@ -84,24 +190,25 @@ public class VehicleOutServiceImpl implements VehicleOutService { * @param whereJson { * sect_code: 库区编码 * } - * @return Structattr 仓位实体类 + * @return List 仓位实体类即可 */ - private Structattr autoDivStruct(JSONObject whereJson) { + private List autoDivStruct(JSONObject whereJson) { // 根据库区查询对应载具 - List structattr = iStructattrService.list(new LambdaQueryWrapper<>(Structattr.class) + List attrList = iStructattrService.list(new LambdaQueryWrapper<>(Structattr.class) .eq(Structattr::getSect_code, whereJson.getString("sect_code")) .eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO) .eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES) .eq(Structattr::getIs_emptyvehicle, IOSConstant.IS_DELETE_YES) .and(wrapper -> wrapper.isNotNull(Structattr::getStoragevehicle_code).or().ne(Structattr::getStoragevehicle_code, "")) + .orderByDesc(Structattr::getPlacement_type) .orderByAsc(Structattr::getStruct_code) ); - if (ObjectUtil.isEmpty(structattr)) { - throw new BadRequestException("未找到满足的仓位"); + if (ObjectUtil.isEmpty(attrList)) { + throw new BadRequestException("库内没有空载具"); } - return structattr.get(0); + return attrList; } } diff --git a/wms/nladmin-ui/src/views/wms/basedata/structattr/index.vue b/wms/nladmin-ui/src/views/wms/basedata/structattr/index.vue index 06af75f..9c2be17 100644 --- a/wms/nladmin-ui/src/views/wms/basedata/structattr/index.vue +++ b/wms/nladmin-ui/src/views/wms/basedata/structattr/index.vue @@ -289,16 +289,16 @@ - - + +