From 459bd30d25ceab279401ab4f32f85f20bf7ec16a Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Thu, 20 Mar 2025 13:53:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A5=97=E8=BD=B4=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E3=80=81AGV=E6=8D=A2=E6=89=98=E7=9B=98=20opt?= =?UTF-8?q?:=20=E4=B8=8B=E5=8D=B7=E6=A0=A1=E9=AA=8C=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E8=BD=B4=20fix:=20=E4=B8=8B=E5=8D=B7=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=20feat:=20=E7=AE=A1=E8=8A=AF=E6=89=98?= =?UTF-8?q?=E7=9B=98=E7=95=8C=E9=9D=A2=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BstIvtStockingivtController.java | 7 + .../service/IBstIvtStockingivtService.java | 22 +++ .../dao/mapper/BstIvtStockingivtMapper.java | 13 ++ .../dao/mapper/BstIvtStockingivtMapper.xml | 44 +++++- .../stockingivt/service/dto/ShowStockVo.java | 20 +++ .../impl/BstIvtStockingivtServiceImpl.java | 80 +++++++++-- .../pda/controller/SlitterPdaController.java | 6 + .../IPdmBiSlittingproductionplanService.java | 14 ++ .../PdmBiSlittingproductionplanMapper.java | 2 + .../PdmBiSlittingproductionplanMapper.xml | 27 ++++ ...dmBiSlittingproductionplanServiceImpl.java | 14 ++ .../sch/task/service/IschBaseTaskService.java | 2 + .../service/impl/SchBaseTaskServiceImpl.java | 15 +++ .../slitter/auto/AutoCallAirShaftTask.java | 72 ++++++++-- .../mapper/dto/BhTubeMovePointDto.java | 24 ++++ .../slitter/mapper/dto/BhTubePointDto.java | 24 ++++ .../mapper/dto/SlitterPlanDistinctDto.java | 5 + .../tasks/slitter/service/SlitterService.java | 7 + .../service/impl/SlitterServiceImpl.java | 73 ++++++++-- .../tasks/slitter/util/SlitterTaskUtil.java | 44 ++++++ .../src/test/java/org/nl/init/EventTest.java | 44 ++++++ lms/nladmin-ui/src/assets/images/empty.png | Bin 0 -> 4268 bytes lms/nladmin-ui/src/assets/images/empty2.png | Bin 0 -> 3651 bytes lms/nladmin-ui/src/assets/images/showTube.png | Bin 0 -> 5290 bytes .../bst/ivt/stockingivt/bstIvtStockingivt.js | 10 +- .../views/b_lms/bst/ivt/stockingivt/index.vue | 48 +++++-- .../b_lms/bst/ivt/stockingivt/tubeDialog.vue | 125 ++++++++++++++++++ 27 files changed, 701 insertions(+), 41 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java create mode 100644 lms/nladmin-ui/src/assets/images/empty.png create mode 100644 lms/nladmin-ui/src/assets/images/empty2.png create mode 100644 lms/nladmin-ui/src/assets/images/showTube.png create mode 100644 lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java index c9f0a05cb..7a4405cc5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java @@ -67,5 +67,12 @@ public class BstIvtStockingivtController { return new ResponseEntity<>(bstIvtStockingivtService.operateIvt(param), HttpStatus.OK); } + @Log("管芯托盘库存") + //@SaCheckPermission("@el.check('bstIvtStockingivt:del')") + @PostMapping("/showDetail") + public ResponseEntity showDetail(@RequestBody JSONObject param) { + return new ResponseEntity<>(bstIvtStockingivtService.showDetail(param), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java index d87e371b8..572634226 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java @@ -2,6 +2,9 @@ package org.nl.b_lms.bst.ivt.stockingivt.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.common.domain.query.PageQuery; import com.baomidou.mybatisplus.extension.service.IService; import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt; @@ -78,4 +81,23 @@ public interface IBstIvtStockingivtService extends IService { BstIvtStockingivt getCanMovePointOne(String location, String pointType); JSONObject operateIvt(JSONObject jsonObject) ; + + /** + * 分组聚合获取需要管芯的托盘位置 + * @param pointType + * @param tube + * @param location + * @return + */ + List getNeedPaperTubePoint(String pointType, String tube, String location); + + /** + * 获取3个托盘的数据 + * @param location + * @param pointType + * @return + */ + List getCanMovePointList(String location, String pointType); + + List> showDetail(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java index 49eaa768d..42edf4d39 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java @@ -2,6 +2,8 @@ package org.nl.b_lms.bst.ivt.stockingivt.service.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import java.util.List; @@ -29,4 +31,15 @@ public interface BstIvtStockingivtMapper extends BaseMapper { List getEmptyPointNotTask(String location, String pointType); BstIvtStockingivt getCanMovePointOne(String location, String pointType); + + /** + * 分组聚合获取备货区中数量够用的的货位 + * @param pointType 类型:0暂存位置,1靠近分切机 + * @param tube 纸管号 两个都是一样的,因此拿一个就行 + * @param location 位置:0上区域,1下区域 + * @return / + */ + List getNeedPaperTubePoint(String pointType, String tube, String location); + + List getCanMovePointList(String location, String pointType); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml index 41faca610..d534d57fb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml @@ -12,7 +12,7 @@ AND bs.ivt_status = '1' AND bs.is_used = '1' AND mp.material_code = #{tube} - AND mp.qty = ]]> #{qty} + AND mp.qty ]]> #{qty} AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE (t.point_code1 = bs.point_code OR t.point_code2 = bs.point_code OR @@ -48,4 +48,46 @@ AND t.task_status '07') ORDER BY bs.ivt_status, mp.qty LIMIT 1 + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java new file mode 100644 index 000000000..2a53896fe --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java @@ -0,0 +1,20 @@ +package org.nl.b_lms.bst.ivt.stockingivt.service.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/20 + */ +@Data +public class ShowStockVo { + /** + * 0: 空, 1:空位,2:管芯 + */ + private String have_qzz; + + /** + * 管芯信息 + */ + private String tube; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java index feff28d31..ef6268a91 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java @@ -2,19 +2,19 @@ package org.nl.b_lms.bst.ivt.stockingivt.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.papervehicle.service.IMdPbPapervehicleService; import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle; +import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; -import org.nl.b_lms.sch.tasks.slitter.service.SlitterService; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.modules.common.exception.BadRequestException; import org.nl.common.domain.query.PageQuery; @@ -46,7 +46,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle papervehicle = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, row_num)); if (ObjectUtil.isNotEmpty(papervehicle) && !papervehicle.getMaterial_code().equals(material_code)) { throw new BadRequestException("当前排物料为【" + papervehicle.getMaterial_code() + "】,与绑定的物料不同,如需要请先清除库存,再进行绑定!"); @@ -180,7 +180,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle nextPaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, nextNum)); if (ObjectUtil.isNotEmpty(nextPaper)) { //获取第二排的纸管高度和纸管类型 @@ -194,7 +194,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle nextPaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, nextNum)); if (ObjectUtil.isNotEmpty(nextPaper)) { //获取后一排的纸管高度和纸管类型 @@ -208,7 +208,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle prePaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, preNum)); if (ObjectUtil.isNotEmpty(prePaper)) { //获取后一排的纸管高度和纸管类型 @@ -227,7 +227,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + papervehicleService.remove(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, row_num)); } //判断绑定的纸管是否在机械手范围内,如果存在的话把最新库存推送给电气 BstIvtStockingivt bstIvtStockingivt = bstIvtStockingivtMapper.selectOne(new LambdaQueryWrapper().eq(BstIvtStockingivt::getVehicle_code, vehicle_code)); if (bstIvtStockingivt != null && bstIvtStockingivt.getPoint_type().equals("1")) { - List list = PapervehicleService.list(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code)); + List list = papervehicleService.list(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code)); JSONObject jo = new JSONObject(); SlitterTaskUtil.doSavePaperInfos(list, jo); jo.put("product_area", bstIvtStockingivt.getProduct_area()); @@ -265,4 +265,60 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl getNeedPaperTubePoint(String pointType, String tube, String location) { + return bstIvtStockingivtMapper.getNeedPaperTubePoint(pointType, tube, location); + } + + @Override + public List getCanMovePointList(String location, String pointType) { + return bstIvtStockingivtMapper.getCanMovePointList(location, pointType); + } + + @Override + public List> showDetail(JSONObject param) { + List> res = new ArrayList<>(); + // vehicle_code + String vehicleCode = param.getString("vehicle_code"); + if (ObjectUtil.isEmpty(vehicleCode)) { + // 5*5的0 + for (int i = 0; i < 5; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < 5; j++) { + ShowStockVo one = new ShowStockVo(); + one.setHave_qzz("0"); + one.setTube("-"); + list.add(one); + } + res.add(list); + } + } else { + // 获取数据 + List papers = papervehicleService.list(new LambdaQueryWrapper() + .eq(MdPbPapervehicle::getVehicle_code, vehicleCode) + .orderByAsc(MdPbPapervehicle::getRow_num)); + // 初始化 5*5的1 + for (int i = 0; i < 5; i++) { + // 获取对应排的数据 + int index = i; + MdPbPapervehicle mdPbPapervehicle = papers.stream().filter(p -> p.getRow_num().equals(index + 1)).findFirst().orElse(null); + int indexJ = mdPbPapervehicle == null ? 0 : mdPbPapervehicle.getQty().intValue(); + List list = new ArrayList<>(); + for (int j = 0; j < 5; j++) { + ShowStockVo one = new ShowStockVo(); + one.setHave_qzz("1"); + one.setTube("-"); + if (j < indexJ && indexJ != 0) { + one.setHave_qzz("2"); + one.setTube(mdPbPapervehicle.getMaterial_name()); + } + list.add(one); + } + res.add(list); + } + + } + return res; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java index 2a6971855..ae0abe769 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java @@ -46,6 +46,12 @@ public class SlitterPdaController { public ResponseEntity downRolls2(@RequestBody JSONObject param) { return new ResponseEntity<>(slitterDevices.downRolls2(param), HttpStatus.OK); } + @PostMapping("/downRollsCheck") + @Log("下卷2提示确认") + @SaIgnore + public ResponseEntity downRollsCheck(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterDevices.downRollsCheck(param), HttpStatus.OK); + } @PostMapping("/moveVehicle") @Log("搬运废箔斗") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java index 32af82318..284c52eda 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java @@ -138,4 +138,18 @@ public interface IPdmBiSlittingproductionplanService extends IService getAllHalfPlanRestruct(List qzzs); + + /** + * 获取能够套轴的分切计划,虚拟卷,固定是常规卷 + * @param day 天数 + * @return + */ + List getAllCutPlan2(Integer day); + + /** + * 根据设备获取计划 + * @param deviceCode + * @return + */ + List getXnPlanByDevice(String deviceCode); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java index b02a0d5b4..ccc2f8507 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java @@ -19,4 +19,6 @@ public interface PdmBiSlittingproductionplanMapper extends BaseMapper getCurrentPlanInfos(SlitterPlanDistinctDto dto); List getAllHalfPlanRestruct(List qzzs); + + List getAllCutPlan2(Integer day); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml index cedb0d284..0013b4ac9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml @@ -197,4 +197,31 @@ WHERE rn = 1; + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java index 518f58080..5ef1b8c3b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java @@ -196,4 +196,18 @@ public class PdmBiSlittingproductionplanServiceImpl extends ServiceImpl getAllHalfPlanRestruct(List qzzs) { return pdmBiSlittingproductionplanMapper.getAllHalfPlanRestruct(qzzs); } + + @Override + public List getAllCutPlan2(Integer day) { + return pdmBiSlittingproductionplanMapper.getAllCutPlan2(day); + } + + @Override + public List getXnPlanByDevice(String deviceCode) { + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(PdmBiSlittingproductionplan::getResource_name, deviceCode) + .like(PdmBiSlittingproductionplan::getContainer_name, "虚拟") + .eq(PdmBiSlittingproductionplan::getIs_delete, "0"); + return this.list(lam); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java index 13b3e98b1..3848d8d63 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java @@ -94,6 +94,8 @@ public interface IschBaseTaskService extends IService { * @return */ List checkHaveStartTask(String pointCode); + + List checkHaveTrussTask(List codes); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java index e7c0c6ce1..70a27265f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -166,6 +166,21 @@ public class SchBaseTaskServiceImpl extends ServiceImpl checkHaveTrussTask(List codes) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.lt(SchBaseTask::getTask_status, "07") + .eq(SchBaseTask::getIs_delete, "0") + .and(la2 -> la2.in(SchBaseTask::getPoint_code1, codes) + .or() + .in(SchBaseTask::getPoint_code2, codes) + .or() + .in(SchBaseTask::getPoint_code3, codes) + .or() + .in(SchBaseTask::getPoint_code4, codes)); + return this.list(lam); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java index 0f6ad51e8..f40a7b044 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java @@ -24,6 +24,8 @@ import org.nl.b_lms.sch.tasks.slitter.TrussCallAirShaftTask; import org.nl.b_lms.sch.tasks.slitter.TrussCallShaftCacheTask; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterEnum; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.SlitterPlanDistinctDto; import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.common.enums.NoticeTypeEnum; @@ -37,8 +39,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.Comparator; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -86,6 +93,9 @@ public class AutoCallAirShaftTask { public final static String IS_ONLY_PULLING = "IS_ONLY_PULLING"; public final static String TZ_DAY = "TZ_DAY"; + private static final DateTimeFormatter TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + /** * hint: 目前只是考虑了上区域 * 执行套轴和拔轴任务的逻辑处理。 @@ -119,7 +129,15 @@ public class AutoCallAirShaftTask { } Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue()); // 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑 - List planAll = slittingproductionplanService.getAllCutPlan(integer); +// List planAll = slittingproductionplanService.getAllCutPlan(integer); + List planAllNoSort = slittingproductionplanService.getAllCutPlan2(integer); + // 排序 + List planAll = planAllNoSort.stream() + .sorted(Comparator.comparing( + dto -> LocalDateTime.parse(dto.getStart_time(), TIME_FORMATTER) + )) + .collect(Collectors.toList()); + // 过滤 String value = paramObj.getValue(); List prefixList = Arrays.asList(value.split("[,,]")); List plans = planAll.stream() @@ -313,28 +331,60 @@ public class AutoCallAirShaftTask { return plan.getFRP_material(); } }).collect(Collectors.toList()); + // 判断另一台穿拔轴机的管芯 + BstIvtShafttubeivt one = bstIvtShafttubeivtService.getOne(new LambdaQueryWrapper() + .ne(BstIvtShafttubeivt::getPoint_code, empty.getPoint_code()) + .eq(BstIvtShafttubeivt::getPoint_location, empty.getPoint_location()) + .eq(BstIvtShafttubeivt::getPoint_type, empty.getPoint_type()) + .eq(BstIvtShafttubeivt::getIs_used, "1")); + log.info("同位置的另一台穿拔轴机构:{}", one); + // 另一台所需要的数量 + int otherDeviceTubeSize = 0; + // 缺省的数量 + int needQuantity = 0; // 判断当前区域location对应的备货区是否含有相同的纸管 校验了不在搬运中 - // type=1, 关联对象material_code=纸管, qty > 0 - List useList = stockingivtService.getPaperTubePoint("1", tubes.get(0), location, tubes.size()); + // type=1(桁架底下的托盘), 关联对象material_code=纸管, qty > 0 + List useList = stockingivtService.getPaperTubePoint("1", tubes.get(0), location, 0); if (useList.size() > 0) { + // 求和,三个托盘中需要的管芯的数量。 + int sum = useList.stream().mapToInt(BstIvtStockingivt::getQty).sum(); + if (ObjectUtil.isNotEmpty(one)) { + if (one.getTube_code1().equals(tubes.get(0))) { + otherDeviceTubeSize = (int) Stream.of(one.getTube_code1(), one.getTube_code2()).filter(ObjectUtil::isNotEmpty).count(); + } + } // 说明三个位置中有包含此纸管的数据。 - return; + if (sum >= tubes.size() + otherDeviceTubeSize) { + return; + } + // 如果不够,就计算还缺多少个 + int needTemp = tubes.size() + otherDeviceTubeSize - sum; + // 兜底 + needQuantity = needTemp > 0 ? needTemp : 1; } - // 查找type=0的位置中是否存在 校验了不在搬运中 - List stockingivtList = stockingivtService.getPaperTubePoint("0", tubes.get(0), location, tubes.size()); - if (stockingivtList.size() == 0) { + // 查找type=0的位置(待命的托盘)中是否存在(需要判断的是单独一个托盘) 校验了不在搬运中 + List stockingivtList = stockingivtService.getNeedPaperTubePoint("0", tubes.get(0), location); + // 找一个点位: 目的需要的点位 + // 筛选单独托盘有超过所需数 + BhTubePointDto needPoint = null; + for (BhTubePointDto bhTubePointDto : stockingivtList) { + if (bhTubePointDto.getQty() >= needQuantity) { + needPoint = bhTubePointDto; + break; + } + } + if (needPoint == null) { // 不存在则站内通知 noticeService.createNotice("备货区找不到[" + tubes.get(0) + "]的纸管信息", "点位[" + empty.getPoint_name() + "]无法从备货区找到纸管信息", NoticeTypeEnum.EXCEPTION.getCode()); return; } - // 找一个点位: 目的需要的点位 - BstIvtStockingivt needPoint = stockingivtList.get(0); // 找到就创建AGV搬运任务 - // 筛选3个位置中数量最少的搬走 - BstIvtStockingivt needMovePoint = stockingivtService.getCanMovePointOne(location, "1"); + // 筛选3个位置中数量最少的搬走, 如果是空位,直接搬运过来 + List needMovePointList = stockingivtService.getCanMovePointList(location, "1"); // 空位就直接创建搬过来的任务 + BhTubeMovePointDto needMovePoint = needMovePointList.size() > 0 ? needMovePointList.get(0) : null; if (ObjectUtil.isEmpty(needMovePoint) || "0".equals(needMovePoint.getIvt_status())) { // 直接搬过来即可 JSONObject param = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java new file mode 100644 index 000000000..00aea2cd7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.sch.tasks.slitter.mapper.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/19 + */ +@Data +public class BhTubeMovePointDto { + /** + * 点位 + */ + private String point_code; + /** + * 托盘号 + */ + private String vehicle_code; + private String ivt_status; + /** + * 数量 + */ + private Integer qty; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java new file mode 100644 index 000000000..6c63ba254 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.sch.tasks.slitter.mapper.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/18 + */ +@Data +public class BhTubePointDto { + + /** + * 点位 + */ + private String point_code; + /** + * 托盘号 + */ + private String vehicle_code; + /** + * 数量 + */ + private Integer qty; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java index 4d112329c..9629ebd41 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java @@ -37,4 +37,9 @@ public class SlitterPlanDistinctDto { * 气胀轴代数 */ private String qzz_generation; + + /** + * 开始时间 + */ + private String start_time; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java index 52abf16c0..10ea40978 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java @@ -334,4 +334,11 @@ public interface SlitterService { * @return */ JSONObject rollCacheManageTip(JSONObject param); + + /** + * 下卷确认 + * @param param + * @return + */ + JSONObject downRollsCheck(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index 3597eef2f..dacb2418a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -57,11 +57,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -810,7 +808,7 @@ public class SlitterServiceImpl implements SlitterService { if (list.size() == 0) { throw new BadRequestException("分切机" + device_code + " 的分切计划 " + qzzNo + " 不存在"); } - List tasks = taskService.checkHaveTask(device_code); + List tasks = taskService.checkHaveTrussTask(Arrays.asList(deviceCode.getUp_point_code(), deviceCode.getDown_point_code())); if (tasks.size() > 0) { throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); } @@ -1948,6 +1946,11 @@ public class SlitterServiceImpl implements SlitterService { String downRightSizeK = param.getString("down_right_size_k"); String downLeftSizeV = param.getString("down_left_size_v"); String downRightSizeV = param.getString("down_right_size_v"); + // 获取设备的 + List checkPlans = slittingproductionplanService.getXnPlanByDevice(deviceCode); + if (!doCheckCanCallAgain(checkPlans)) { + throw new BadRequestException("气胀轴正在准备或配送中、未使用,不允许二次呼叫套轴!"); + } List plans = new ArrayList<>(); // 虚拟计划 for (int i = 0; i < 4; i++) { @@ -2116,6 +2119,16 @@ public class SlitterServiceImpl implements SlitterService { return res; } + private boolean doCheckCanCallAgain(List checkPlans) { + // 如果is_paper_ok = 2那就不允许 + for (PdmBiSlittingproductionplan checkPlan : checkPlans) { + if ("2".equals(checkPlan.getIs_paper_ok())) { + return false; + } + } + return true; + } + @Override public List showManualView(JSONObject param) { return slitterMapper.showManualView(); @@ -2124,13 +2137,30 @@ public class SlitterServiceImpl implements SlitterService { @Override public JSONObject downRolls2(JSONObject param) { log.info("下卷2的输入参数为:{}", param); - // param: device_code, container + // param: device_code, container: [{"container_name":"子卷号", "site":"上下轴(1/2)"}] String device_code = param.getString("device_code"); - List tasks = taskService.checkHaveTask(device_code); + StIvtCutpointivt deviceCode = cutpointivtService.getPintByExtCode(device_code, false); + List tasks = taskService.checkHaveTrussTask(Arrays.asList(deviceCode.getUp_point_code(), deviceCode.getDown_point_code())); if (tasks.size() > 0) { throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); } - return mesSlittingMachineSendMaterial(param); + JSONArray conArray = param.getJSONArray("container"); + List containerNames = new ArrayList<>(); + for (int i = 0; i < conArray.size(); i++) { + JSONObject container = conArray.getJSONObject(i); + containerNames.add(container.getString("container_name")); + } + List plans = slittingproductionplanService.getByContainerNames(containerNames); + // 兜底校验:判断与实际是否一致 + SlitterTaskUtil.validateConsistency(conArray, plans); + JSONObject reqParam = new JSONObject(); + reqParam.put("device_code", device_code); + reqParam.put("container", containerNames); + mesSlittingMachineSendMaterial(reqParam); + JSONObject res = new JSONObject(); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "子卷出站任务生成成功!"); + return res; } @Override @@ -2174,4 +2204,31 @@ public class SlitterServiceImpl implements SlitterService { res.put("data", data); return res; } + + @Override + public JSONObject downRollsCheck(JSONObject param) { + // param: device_code, container: [{"container_name":"子卷号", "site":"上下轴(1/2)"}] + JSONObject res = new JSONObject(); + String device_code = param.getString("device_code"); + List tasks = taskService.checkHaveTask(device_code); + if (tasks.size() > 0) { + throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); + } + JSONArray conArray = param.getJSONArray("container"); + List containerNames = new ArrayList<>(); + for (int i = 0; i < conArray.size(); i++) { + JSONObject container = conArray.getJSONObject(i); + containerNames.add(container.getString("container_name")); + } + List plans = slittingproductionplanService.getByContainerNames(containerNames); + + try { + SlitterTaskUtil.validateConsistency(conArray, plans); + } catch (Exception e) { + res.put("flag", "2"); + res.put("message", e.getMessage()); + } + res.put("flag", "1"); + return res; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java index 5c04ea3d6..76327a847 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; @@ -14,12 +15,15 @@ import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Author: lyd * @Description: 分切部分的任务工具类 * @Date: 2024/4/12 */ +@Slf4j public class SlitterTaskUtil { /** B1区域 */ @@ -452,4 +456,44 @@ public class SlitterTaskUtil { default: throw new BadRequestException("站点输入错误: " + input); } } + + /** + * 下卷前置校验,判断卷的上下轴属性与实际是否一致 - 校验子卷属性 + * @param jsonArray 子卷数组 + * @param plans 计划 + */ + public static void validateConsistency(JSONArray jsonArray, List plans) { + if (plans.size() == 0) { + throw new BadRequestException("计划未找到,请确保MES已推送。"); + } + // 1. 将 List 转为 Map + Map planMap = plans.stream() + .collect(Collectors.toMap( + p -> p.getContainer_name(), + p -> p.getUp_or_down(), + // 如果有重复 key,保留第一个(按需调整) + (existing, replacement) -> existing + )); + + // 2. 遍历 JSONArray + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject item = jsonArray.getJSONObject(i); + String containerName = item.getString("container_name"); + String site = item.getString("site"); + + // 3. 检查 Plan 中是否存在对应的 container_name + if (!planMap.containsKey(containerName)) { + throw new BadRequestException("校验失败: container_name " + containerName + " 在计划列表中不存在"); + } + + // 4. 比较 site 和 up_or_down 是否一致 + String expectedUpDown = planMap.get(containerName); + if (!expectedUpDown.equals(site)) { + throw new BadRequestException("校验失败: 子卷号 " + containerName + + " 的上下轴位置值 '" + site + + "' 与计划中的上下轴位置值 '" + expectedUpDown + "' 不一致"); + } + } + log.info("分切下卷计划位置校验通过!"); + } } diff --git a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java index e7c879339..8fbb5fc47 100644 --- a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java +++ b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java @@ -1,5 +1,6 @@ package org.nl.init; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -11,11 +12,16 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt; import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.mapper.BstIvtShafttubeivtMapper; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import org.nl.b_lms.sch.tasks.first_floor_area.*; +import org.nl.b_lms.sch.tasks.slitter.service.impl.SlitterServiceImpl; +import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; import org.nl.common.enums.ContainerLevelEnum; import org.nl.common.enums.PackageInfoIvtEnum; @@ -26,6 +32,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -62,6 +69,43 @@ public class EventTest { private PdmBiSubpackagerelationMapper pdmBiSubpackagerelationMapper; @Autowired private BstIvtShafttubeivtMapper bstIvtShafttubeivtMapper; + @Autowired + private SchBasePointMapper schBasePointMapper; + @Autowired + private IPdmBiSlittingproductionplanService slittingproductionplanService; + @Test + public void sss() { + System.out.println(schBasePointMapper.queryKZPoint()); + } + + @Test + public void getWeight() { + List plans = slittingproductionplanService.getByQzzNos(Arrays.asList("B203-4")); + String weights = ""; + SlitterTaskUtil.setPaperWeightStr(weights, plans); + slittingproductionplanService.updateBatchById(plans); + System.out.println(weights); + } + + @Test + public void testValidate() { + // 示例数据 + JSONArray jsonArray = JSONArray.parseArray( + "[{\"container_name\":\"A\", \"site\":\"1\"},{\"container_name\":\"B\", \"site\":\"2\"}]" + ); + + PdmBiSlittingproductionplan p1 = new PdmBiSlittingproductionplan(); + PdmBiSlittingproductionplan p2 = new PdmBiSlittingproductionplan(); + p1.setContainer_name("A"); + p1.setUp_or_down("1"); + p2.setContainer_name("B"); + p2.setUp_or_down("2"); + List plans = Arrays.asList(p1, p2); + + // 执行校验 + SlitterTaskUtil.validateConsistency(jsonArray, plans); + } + @Test public void sl() { diff --git a/lms/nladmin-ui/src/assets/images/empty.png b/lms/nladmin-ui/src/assets/images/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ee838b670661d27a179a64f6cb38df7839e7a611 GIT binary patch literal 4268 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 F?mroe&4d5| literal 0 HcmV?d00001 diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js index bb77adce0..cab0e3453 100644 --- a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js @@ -24,4 +24,12 @@ export function edit(data) { }) } -export default { add, edit, del } +export function showDetail(data) { + return request({ + url: 'api/bstIvtStockingivt/showDetail', + method: 'post', + data + }) +} + +export default { add, edit, del, showDetail } diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue index daaa66ac9..2c61428ee 100644 --- a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue @@ -83,12 +83,24 @@ - + - + + + - + - + + + - - @@ -125,6 +139,7 @@ + @@ -135,6 +150,7 @@ import rrOperation from '@crud/RR.operation' import crudOperation from '@crud/CRUD.operation' import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' +import TubeDialog from '@/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue' const defaultForm = { ivt_id: null, @@ -159,7 +175,7 @@ const defaultForm = { export default { name: 'BstIvtStockingivt', dicts: ['STOCK_POINT_STATUS', 'STOCK_POINT_TYPE', 'point_location'], - components: { pagination, crudOperation, rrOperation, udOperation }, + components: { TubeDialog, pagination, crudOperation, rrOperation, udOperation }, mixins: [presenter(), header(), form(defaultForm), crud()], cruds() { return CRUD({ @@ -203,12 +219,28 @@ export default { create_time: [ { required: true, message: '创建时间不能为空', trigger: 'blur' } ] - }} + }, + showView: false, + vehicle_code: '', + rows: {} + } }, methods: { // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { return true + }, + toView(index, row) { + // vehicle_code, point_code + console.log(row) + const param = { + vehicle_code: this.vehicle_code + } + crudBstIvtStockingivt.showDetail(param).then(res => { + this.vehicle_code = row.vehicle_code + this.showView = true + this.rows = res + }) } } } diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue new file mode 100644 index 000000000..0798b8676 --- /dev/null +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue @@ -0,0 +1,125 @@ + + + + +