diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/DateUtil.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/DateUtil.java index 2316c83..15782f6 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/DateUtil.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/DateUtil.java @@ -16,6 +16,8 @@ package org.nl.common.utils; +import cn.hutool.core.date.DatePattern; + import java.time.*; import java.time.format.DateTimeFormatter; import java.util.Date; @@ -158,6 +160,17 @@ public class DateUtil { return LocalDateTime.from(DFY_MD_HMS.parse(localDateTime)); } + + /** + * 返回当前年月日 + * + * @return / + */ + public static String getDateTimeFormatyMd() { + return cn.hutool.core.date.DateUtil.format(cn.hutool.core.date.DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + } + + /** * 字符串转 yyyy-MM-dd * diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Sectattr.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Sectattr.java index 9164404..d80f621 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Sectattr.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Sectattr.java @@ -48,7 +48,7 @@ public class Sectattr implements Serializable { /** * 仓库标识 */ - private String stor_id; + private String stor_code; /** * 仓库类型 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml index 8067845..753f752 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml @@ -72,6 +72,7 @@ attr.struct_name, attr.stor_name, attr.sect_name, + attr.lock_type, mater.material_code, mater.material_name FROM diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml index 386172a..f247ea3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml @@ -2,7 +2,7 @@ - SELECT sect.*,stor.stor_name FROM st_ivt_sectattr sect LEFT JOIN st_ivt_bsrealstorattr stor ON sect.stor_id = stor.stor_id + SELECT sect.*,stor.stor_name FROM st_ivt_sectattr sect LEFT JOIN st_ivt_bsrealstorattr stor ON sect.stor_code = stor.stor_code sect.is_delete = '0' @@ -11,10 +11,6 @@ OR sect.sect_name LIKE CONCAT('%', #{params.search}, '%') - - AND - sect.stor_id = #{params.stor_id} - AND sect.sect_code LIKE CONCAT('%', #{params.stor_code}, '%') diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml index 27bb00e..830a63c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml @@ -54,8 +54,10 @@ order by ${order_by} + limit 20 + ( SELECT gro.qty, gro.frozen_qty, @@ -68,17 +70,16 @@ mater.material_code, mater.material_name, mater.material_spec, - po.point_code as struct_code, - po.vehicle_code as storagevehicle_code + po.point_code AS struct_code, + po.vehicle_code AS storagevehicle_code FROM sch_base_point po LEFT JOIN md_pb_groupplate gro ON po.vehicle_code = gro.storagevehicle_code LEFT JOIN md_me_materialbase mater ON mater.material_id = gro.material_id - gro.frozen_qty = 0 + gro.frozen_qty = 0 - and (mater.material_code LIKE '%${search}%' - or mater.material_name LIKE '%${search}%') + AND (mater.material_code LIKE '%${search}%' OR mater.material_name LIKE '%${search}%') AND gro.status = #{status} @@ -93,17 +94,52 @@ AND po.region_code = #{region_code} - AND po.vehicle_code in + AND po.vehicle_code IN #{value} - and po.is_has_workder = '0' - - - order by ${order_by} + AND po.is_has_workder = '0' + ) + UNION + ( + SELECT + 1 AS qty, + 0 AS frozen_qty, + NULL AS create_time, + 'Pcs' AS qty_unit_name, + NULL AS qty_unit_id, + NULL AS material_id, + NULL AS pcsn, + NULL AS group_id, + 'KH001' AS material_code, + '空载具' AS material_name, + '空载具' AS material_spec, + po.point_code AS struct_code, + po.vehicle_code AS storagevehicle_code + FROM + sch_base_point po + WHERE + po.vehicle_code IS NOT NULL + AND po.point_status = #{pointStatus} + + AND po.region_code = #{region_code} + + + AND po.is_has_workder = '0' + + + AND po.vehicle_code IN + + #{value} + + + ) + + ORDER BY ${order_by} + diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/BsrealStorattrServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/BsrealStorattrServiceImpl.java index e6ced6f..26545e2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/BsrealStorattrServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/BsrealStorattrServiceImpl.java @@ -56,6 +56,8 @@ public class BsrealStorattrServiceImpl extends ServiceImpl queryAll(Map whereJson, PageQuery page) { @@ -198,22 +200,21 @@ public class BsrealStorattrServiceImpl extends ServiceImpl(Sectattr.class) .set(Sectattr::getIs_used, is_used) .set(Sectattr::getUpdate_optid, currentUserId) .set(Sectattr::getUpdate_optname, nickName) .set(Sectattr::getUpdate_time, now) - .eq(Sectattr::getStor_id, stor_id) + .eq(Sectattr::getStor_code, stor_code) ); - iStructattrService.update(new LambdaUpdateWrapper<>(Structattr.class) .set(Structattr::getIs_used, is_used) .set(Structattr::getUpdate_optid, currentUserId) .set(Structattr::getUpdate_optname, nickName) .set(Structattr::getUpdate_time, now) - .eq(Structattr::getStor_id, stor_id) + .eq(Structattr::getStor_code, stor_code) ); } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java index 9a0bd72..3540630 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java @@ -8,6 +8,7 @@ import cn.hutool.poi.excel.ExcelUtil; 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.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -23,6 +24,7 @@ import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo; import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper; import org.nl.wms.ext.service.WmsToErpService; +import org.nl.wms.pda.ios_manage.service.PdaIosInService; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.springframework.beans.factory.annotation.Autowired; @@ -51,6 +53,13 @@ import java.util.stream.Collectors; @Service public class MdMeMaterialbaseServiceImpl extends ServiceImpl implements IMdMeMaterialbaseService { + + /** + * 手持服务 + */ + @Autowired + private PdaIosInService pdaIosInService; + /** * wms调用erp服务 */ @@ -58,19 +67,20 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper().lambda(); String search = MapUtil.getStr(whereJson, "search"); - if (ObjectUtil.isNotEmpty(search)) { queryWrapper.likeRight(MdMeMaterialbase::getMaterial_code, search) .or(item -> item.likeRight(MdMeMaterialbase::getMaterial_name, search)); } + String regionCode = MapUtil.getStr(whereJson, "region"); + if (ObjectUtil.isNotEmpty(regionCode)) { + queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + } queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); - return this.baseMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()), queryWrapper ); @@ -102,9 +114,11 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl list = read.get(i); String m1 = String.valueOf(list.get(0)); String m2 = String.valueOf(list.get(1)); - String m3 = ObjectUtil.isEmpty(list.get(2))?null:String.valueOf(list.get(2)); - String m4 = ObjectUtil.isEmpty(list.get(3))?null:String.valueOf(list.get(3)); - String m5 = ObjectUtil.isEmpty(list.get(4))?null:String.valueOf(list.get(4)); + String m3 = ObjectUtil.isEmpty(list.get(2)) ? null : String.valueOf(list.get(2)); + String m4 = ObjectUtil.isEmpty(list.get(3)) ? null : String.valueOf(list.get(3)); + String m5 = ObjectUtil.isEmpty(list.get(4)) ? null : String.valueOf(list.get(4)); // 根据物料编码查询是否有相同物料编码的物料 MdMeMaterialbase mdMeMaterialbase = this.baseMapper.selectOne( new QueryWrapper().lambda() @@ -167,9 +181,90 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl> read = excelReader.read(); + if (read.size() > 1) { + for (int i = 1; i < read.size(); i++) { + List list = read.get(i); + if (ObjectUtil.isEmpty(list.get(0)) || ObjectUtil.isEmpty(list.get(2)) || ObjectUtil.isEmpty(list.get(3)) || ObjectUtil.isEmpty(list.get(4))) { + if (ObjectUtil.isEmpty(list.get(1))) { + throw new BadRequestException("第" + i + "行,物料编码不能为空,请检查。"); + } + if (ObjectUtil.isEmpty(list.get(4))) { + throw new BadRequestException("第" + i + "行,库位编号不能为空,请检查。"); + } + if (ObjectUtil.isEmpty(list.get(5))) { + throw new BadRequestException("第" + i + "行,托盘编号不能为空,请检查。"); + } + if (ObjectUtil.isEmpty(list.get(6))) { + throw new BadRequestException("第" + i + "行,库存数量不能为空,请检查。"); + } + } + //物料编码 + String m1 = String.valueOf(list.get(1)).trim(); + MdMeMaterialbase mdMeMaterialbase = this.baseMapper.selectOne( + new QueryWrapper().lambda() + .eq(MdMeMaterialbase::getMaterial_code, m1) + ); + if (ObjectUtil.isEmpty(mdMeMaterialbase)) { + throw new BadRequestException("第" + i + "行,物料编码不存在【" + m1 + "】,请检查。"); + } + //库位编号 + String m2 = String.valueOf(list.get(4)).trim(); + Structattr structattr = iStructattrService.getOne( + new QueryWrapper().lambda() + .eq(Structattr::getStruct_code, m2) + ); + if (ObjectUtil.isEmpty(structattr)) { + throw new BadRequestException("第" + i + "行,库位编号不存在【" + m1 + "】,请检查。"); + } + //托盘编号 + String m3 = String.valueOf(list.get(5)).trim(); + MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new LambdaQueryWrapper<>(MdPbStoragevehicleinfo.class) + .eq(MdPbStoragevehicleinfo::getStoragevehicle_code, m3) + ); + if (ObjectUtil.isEmpty(mdPbStoragevehicleinfo)) { + throw new BadRequestException("第" + i + "行,托盘编号不存在【" + m1 + "】,请检查。"); + } + //物料数量 + Integer m4 = Integer.parseInt(String.valueOf(list.get(6)).trim()); + JSONObject whereJson = new JSONObject(); + whereJson.put("store_id", structattr.getStor_id()); + whereJson.put("material_id", mdMeMaterialbase.getMaterial_id()); + whereJson.put("material_code", mdMeMaterialbase.getMaterial_code()); + whereJson.put("pcsn", ""); + whereJson.put("qty", m4); + whereJson.put("vehicle_code", mdPbStoragevehicleinfo.getStoragevehicle_code()); + whereJson.put("groupStatus", "02"); + whereJson.put("remark", "该库存通过仓库数据初始化进行仓库盘点,手动导入库存。"); + pdaIosInService.groupPlate(whereJson); + iStructattrService.update(new LambdaUpdateWrapper<>(Structattr.class) + .set(Structattr::getStoragevehicle_code, mdPbStoragevehicleinfo.getStoragevehicle_code()) + .set(Structattr::getUpdate_optid, currentUserId) + .set(Structattr::getUpdate_optname, nickName) + .set(Structattr::getUpdate_time, now) + .eq(Structattr::getStruct_id, structattr.getStruct_id()) + ); + } + } + } catch (Exception ex) { + throw new BadRequestException("导入失败" + ex.getMessage()); + } + } + + /** + * 仓库导入 + */ + @Transactional + public void excelImport98(MultipartFile file, HttpServletRequest request, HttpServletResponse response) { try { InputStream inputStream = file.getInputStream(); ExcelReader excelReader = ExcelUtil.getReader(inputStream); @@ -244,7 +339,6 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl i Sectattr sectattr = sectattrMapper.selectOne(new LambdaQueryWrapper<>(Sectattr.class) .eq(Sectattr::getSect_id, dto.getSect_code()) - .eq(Sectattr::getStor_id, dto.getStor_id()) + .eq(Sectattr::getStor_code, dto.getStor_code()) ); if (ObjectUtil.isNotEmpty(sectattr)) { @@ -124,7 +124,7 @@ public class SectattrServiceImpl extends ServiceImpl i List sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper() .eq(Sectattr::getSect_code,sect_code) - .eq(Sectattr::getStor_id,dto.getStor_id()) + .eq(Sectattr::getStor_code,dto.getStor_code()) ); if (sectattrList.size() > 1) { throw new BadRequestException("存在相同仓库的库区编号"); @@ -185,7 +185,7 @@ public class SectattrServiceImpl extends ServiceImpl i List sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper<>(Sectattr.class) .select(Sectattr::getSect_id,Sectattr::getSect_name) - .eq(StrUtil.isNotEmpty(stor_jo.getStor_id()),Sectattr::getStor_id,stor_jo.getStor_id()) + .eq(StrUtil.isNotEmpty(stor_jo.getStor_id()),Sectattr::getStor_code,stor_jo.getStor_code()) .eq(StrUtil.isNotEmpty(sect_type_attr),Sectattr::getSect_type_attr,sect_type_attr) .eq(Sectattr::getIs_delete,BaseDataEnum.IS_YES_NOT.code("否")) .eq(Sectattr::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index 969d2c9..bc8e969 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -139,7 +139,7 @@ public class StructattrServiceImpl extends ServiceImpl apply(@RequestBody InteracteDto form) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java index 24d835b..98f65dd 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java @@ -173,7 +173,7 @@ public class GateWayServiceImpl implements IGateWayService { status = TaskStatus.UNFINISHED; break; case EXECUTE_FAIL: - status = TaskStatus.UNFINISHED; + status = TaskStatus.CANCELED; break; case ISSUE: status = TaskStatus.ISSUED; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java index e1a1055..8170c22 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java @@ -82,10 +82,10 @@ public class PdaIosInController { /** - * 组盘获取物料列表 + * 出库管理组盘获取物料列表 */ @PostMapping("/getMaterialList") - @Log("获取物料列表") + @Log("出库管理组盘获取物料列表") public ResponseEntity> getMaterialList(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(pdaIosInService.getMaterialList(whereJson), HttpStatus.OK); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosOutController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosOutController.java index 30bb1ff..b9d93b7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosOutController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosOutController.java @@ -5,12 +5,16 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.vo.SelectItemVo; import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; import org.nl.common.utils.MapOf; import org.nl.common.utils.RedissonUtils; import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.dao.Param; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; import org.nl.wms.pda.ios_manage.service.PdaIosOutService; import org.nl.wms.pda.util.PdaResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +27,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import static org.nl.common.utils.ValidationUtil.assertNotBlankJson; @@ -36,6 +42,8 @@ import static org.nl.common.utils.ValidationUtil.assertNotBlankJson; @RestController @RequiredArgsConstructor @RequestMapping("/api/pda/iosOut") + + @SaIgnore @Slf4j public class PdaIosOutController { @@ -65,10 +73,10 @@ public class PdaIosOutController { /** - * 线边库物料出库确认 + * 线边库仓物料点确认出库 */ @PostMapping("/materialConfirm") - @Log("线边库物料出库确认") + @Log("线边库仓物料点确认出库") public ResponseEntity materialConfirm(@RequestBody JSONObject whereJson) { assertNotBlankJson(whereJson, "请求参数不能为空", "sect_id", "siteCode"); RedissonUtils.lock(() -> { @@ -79,10 +87,10 @@ public class PdaIosOutController { /** - * 线边库物料出库确认 + * 产线叫料出库点确认出库 */ @PostMapping("/callMaterialConfirm") - @Log("产线叫料出库点确认") + @Log("产线叫料出库点确认出库") public ResponseEntity callMaterialConfirm(@RequestBody JSONObject whereJson) { assertNotBlankJson(whereJson, "请求参数不能为空", "region_code", "siteCode"); RedissonUtils.lock(() -> { @@ -97,13 +105,28 @@ public class PdaIosOutController { @PostMapping("bindOrUnbind") @Log("绑定或解绑") public ResponseEntity bindOrUnbind(@RequestBody JSONObject whereJson) { - assertNotBlankJson(whereJson, "请求参数不能为空", "siteCode", "shelfCode", "mode"); + assertNotBlankJson(whereJson, "请求参数不能为空", "mode"); RedissonUtils.lock(() -> { + if (StringUtils.isBlank( whereJson.getString("siteCode"))&&StringUtils.isBlank( whereJson.getString("shelfCode"))) { + throw new BadRequestException("点位编号和载具编号需要扫其中一个,不能同时为空"); + } pdaIosOutService.bindOrUnbind(whereJson); }, "bindOrUnbind" + whereJson.getString("siteCode") + whereJson.getString("shelfCode"), null); return new ResponseEntity<>(PdaResponse.requestParamOk(whereJson), HttpStatus.OK); } + /** + * 出库管理组盘获取物料列表 + */ + @PostMapping("/getMaterialList") + @Log("出库管理组盘获取物料列表") + public ResponseEntity> getMaterialList(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaIosOutService.getMaterialList(whereJson), HttpStatus.OK); + } + + + + /** * 出库确认获取物料明细 */ @@ -114,6 +137,20 @@ public class PdaIosOutController { } + + + /** + * 获取预装区可用放空载具空位 + */ + @PostMapping("/getReturnPoint") + @Log("出库确认获取物料明细") + public ResponseEntity getReturnPoint(@RequestBody JSONObject whereJson) { + List selectList = new ArrayList<>(); + selectList.add(SelectItemVo.builder().text("B02").value("1").build()); + return new ResponseEntity<>(pdaIosOutService.getReturnPoint(whereJson), HttpStatus.OK); + } + + /** * 载具出库确认 */ @@ -134,7 +171,7 @@ public class PdaIosOutController { @PostMapping("/update") @Log("获取升级地址") public ResponseEntity apkUrl() { - Map of = MapOf.of("versionName", "1.0.1", "url", "http://172.18.51.221:8011/api/pda/download/app-release"); + Map of = MapOf.of("versionName", "1.0.1", "url", "http://172.18.51.221:8011/api/pda/iosOut/download/app-release"); return new ResponseEntity<>(of, HttpStatus.OK); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java index 9e214a3..e0eda49 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java @@ -5,7 +5,6 @@ import org.nl.common.base.TableDataInfo; import org.nl.common.domain.vo.SelectItemVo; import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; import org.nl.wms.pda.util.PdaResponse; -import org.springframework.http.ResponseEntity; import java.util.List; @@ -127,4 +126,17 @@ public interface PdaIosInService { * @return PdaResponse */ PdaResponse confirmReturnMaterial(JSONObject whereJson); + + /** + * 不含单据入库业务 + * storagevehicle_code 载具号 + * stor_id 入库仓库id + * sect_code 库区编号 + * material_code 物料编号 + * qty 数量 + * pcsn 批次 + * site_code 所在点位 + * config_code 任务配置类型 + */ + void divStructNoBills(JSONObject whereJson); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosOutService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosOutService.java index 7e07185..3409465 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosOutService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosOutService.java @@ -1,8 +1,13 @@ package org.nl.wms.pda.ios_manage.service; import com.alibaba.fastjson.JSONObject; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.vo.SelectItemVo; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; import org.nl.wms.pda.util.PdaResponse; +import java.util.List; + /** * * 手持IOS 服务类 @@ -46,6 +51,14 @@ public interface PdaIosOutService { PdaResponse getVehicleMaterial(JSONObject whereJson); + /** + * 获取预装区可用放空空位 + * + * @return PdaResponse + */ + List getReturnPoint(JSONObject whereJson); + + /** * 产线叫料点确认 * @@ -82,7 +95,12 @@ public interface PdaIosOutService { */ PdaResponse bindOrUnbind(JSONObject whereJson); - + /** + * 查询物料列表 + * + * @return PdaResponse + */ + TableDataInfo getMaterialList(JSONObject whereJson); /** * 载具出库确认 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java index 554a1b6..d8078ea 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.pda.ios_manage.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -10,6 +11,7 @@ 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.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; @@ -17,10 +19,13 @@ import org.nl.common.domain.vo.SelectItemVo; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; +import org.nl.config.SpringContextHolder; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.*; -import org.nl.wms.basedata_manage.service.dto.MaterialQuery; +import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper; import org.nl.wms.pda.ios_manage.service.PdaIosInService; +import org.nl.wms.pda.ios_manage.service.PdaIosOutService; import org.nl.wms.pda.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.service.ISchBasePointService; @@ -28,7 +33,6 @@ import org.nl.wms.sch_manage.service.ISchBaseRegionService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseRegion; import org.nl.wms.sch_manage.service.util.AbstractTask; -import org.nl.wms.sch_manage.service.util.tasks.BackInTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; import org.nl.wms.warehouse_management.service.IMdPbGroupplateService; @@ -46,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -74,11 +79,18 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IMdPbGroupplateService iMdPbGroupplateService; + /** + * 基础物料服务 + */ + @Autowired + private MdMeMaterialbaseMapper mdMeMaterialbaseMapper; + /** * 基础物料服务 */ @Autowired private IMdMeMaterialbaseService iMdMeMaterialbaseService; + @Resource private IStructattrService iStructattrService; /** @@ -93,6 +105,13 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; + /** + * 手持出库服务 + */ + @Autowired + private PdaIosOutService pdaIosOutService; + + /** * 库区服务 */ @@ -121,11 +140,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { */ @Autowired private IRawAssistIStorService iRawAssistIStorService; - /** - * 回库任务类 - */ - @Autowired - private BackInTask backInTask; + /** * 入库明细服务 */ @@ -140,12 +155,11 @@ public class PdaIosInServiceImpl implements PdaIosInService { private ISchBaseRegionService iSchBaseRegionService; + @Transactional @Override public JSONObject groupPlate(JSONObject whereJson) { // 物料编码 String materialId = whereJson.getString("material_id"); - //批次 - String pcsn = whereJson.getString("pcsn"); // 数量 String qty = whereJson.getString("qty"); MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("vehicle_code")); @@ -157,15 +171,14 @@ public class PdaIosInServiceImpl implements PdaIosInService { } whereJson.put("material_id", materDao.getMaterial_id()); whereJson.put("material_code", materDao.getMaterial_code()); + //批次 + String pcsn = StringUtils.isBlank(whereJson.getString("pcsn")) ? org.nl.common.utils.DateUtil.getDateTimeFormatyMd() : whereJson.getString("pcsn"); //判断该载具是否存在组盘信息 - long statusCount = iMdPbGroupplateService.count( + List groupPlateList = iMdPbGroupplateService.list( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, vehicleDao.getStoragevehicle_code()) - .lt(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("出库")) + .lt(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("入库")) ); - if (statusCount > 0) { - throw new BadRequestException("载具编码:" + vehicleDao.getStoragevehicle_code() + "已存在组盘信息,请对数据进行核实!"); - } //判断该载具编号是否已经存在库内 long count = iStructattrService.count( new LambdaQueryWrapper() @@ -174,6 +187,17 @@ public class PdaIosInServiceImpl implements PdaIosInService { if (count > 0) { throw new BadRequestException("载具编码:" + vehicleDao.getStoragevehicle_code() + "已存在库内,请对数据进行核实!"); } + if (ObjectUtils.isNotEmpty(groupPlateList)) { + //出库重新组盘 + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + .set(GroupPlate::getQty, BigDecimal.ZERO) + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .in(GroupPlate::getGroup_id, groupPlateList.stream().map(GroupPlate::getGroup_id).collect(Collectors.toSet()))); + } GroupPlate groupDao = GroupPlate.builder() .group_id(IdUtil.getStringId()) .material_id(materDao.getMaterial_id()) @@ -182,13 +206,20 @@ public class PdaIosInServiceImpl implements PdaIosInService { .qty_unit_id(unitDao.getMeasure_unit_id()) .qty_unit_name(unitDao.getUnit_name()) .qty(new BigDecimal(qty)) - .status(GROUP_PLATE_STATUS.code("组盘")) + .status(StringUtils.isBlank(whereJson.getString("groupStatus")) ? GROUP_PLATE_STATUS.code("组盘") : whereJson.getString("groupStatus")) .ext_code(whereJson.getString("ext_code")) .create_id(SecurityUtils.getCurrentUserId()) .create_name(SecurityUtils.getCurrentNickName()) .create_time(DateUtil.now()) + .remark(StringUtils.isBlank(whereJson.getString("remark")) ? "" : whereJson.getString("remark")) .build(); iMdPbGroupplateService.save(groupDao); + if (StringUtils.isNotBlank(whereJson.getString("siteCode"))) { + whereJson.put("shelfCode", whereJson.getString("vehicle_code")); + whereJson.put("mode", IOSEnum.BIND_OR_UNBIND.code("绑定")); + //确定点位则绑定 + pdaIosOutService.bindOrUnbind(whereJson); + } return whereJson; } @@ -220,11 +251,21 @@ public class PdaIosInServiceImpl implements PdaIosInService { PageQuery pageQuery = new PageQuery(); pageQuery.setPage(whereJson.getInteger("page") - 1); pageQuery.setSize(whereJson.getInteger("size")); - MaterialQuery materialQuery = new MaterialQuery(); - if (StringUtils.isNotBlank(whereJson.getString("search"))) { - materialQuery.setSearch(whereJson.getString("search").trim().toUpperCase()); + // 查询条件 + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + String search = MapUtil.getStr(whereJson, "search"); + if (ObjectUtil.isNotEmpty(search)) { + queryWrapper.likeRight(MdMeMaterialbase::getMaterial_code, search) + .or(item -> item.likeRight(MdMeMaterialbase::getMaterial_name, search)); } - Page mapPage = iMdMeMaterialbaseService.pageMaps(pageQuery.build(), materialQuery.build()); + String regionCode = MapUtil.getStr(whereJson, "region"); + if (ObjectUtil.isNotEmpty(regionCode)) { + queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + } + queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); + Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), + queryWrapper + ); return PdaResponse.build(mapPage); } @@ -306,10 +347,10 @@ public class PdaIosInServiceImpl implements PdaIosInService { whereJson.put("site_code",schBasePoint.getPoint_code()); whereJson.put("config_code", IOSConstant.BACK_IN_TASK); whereJson.put("vehicle_code", whereJson.getString("storagevehicle_code")); - whereJson.put("stor_id", sectDao.getStor_id()); + whereJson.put("stor_code", sectDao.getStor_code()); whereJson.put("sect_code", sectDao.getSect_code()); //入库分配 - divStructNoBills(whereJson); + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); return PdaResponse.requestOk(); } @@ -324,15 +365,18 @@ public class PdaIosInServiceImpl implements PdaIosInService { * pcsn 批次 * site_code 所在点位 * config_code 任务配置类型 + * is_auto_confirm 是否自动出库确认 */ - private void divStructNoBills(JSONObject whereJson) { + @Override + @Transactional + public void divStructNoBills(JSONObject whereJson) { //校验载具 MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("storagevehicle_code")); if (ObjectUtil.isEmpty(vehicleDao)) { throw new BadRequestException("不存在该载具号信息,请检查"); } //校验仓库 - BsrealStorattr storeDao = iSrealStorattrService.getById(whereJson.getString("stor_id")); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(whereJson.getString("stor_code")); if (ObjectUtil.isEmpty(storeDao)) { throw new BadRequestException("该库区未找到对应仓库信息,请检查"); } @@ -354,12 +398,14 @@ public class PdaIosInServiceImpl implements PdaIosInService { whereJson.put("point_code1", schBasePoint.getPoint_code()); //确定终点 whereJson.put("point_code2", attrDao.getStruct_code()); + whereJson.put("handle_status", BaseDataEnum.IS_YES_NOT.code("否")); //创建任务 String taskId = applyTaskMap.get(whereJson.getString("config_code")).create(whereJson); // 更新起点绑定id iSchBasePointService.update( new UpdateWrapper().lambda() .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) ); // 更新终点锁定状态 @@ -378,7 +424,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Transactional public PdaResponse confirmIn(JSONObject whereJson) { Sectattr sectDao = updateIvtUtils.checkVehicleType(whereJson.getString("sect_id"),whereJson.getString("vehicle_code")); - whereJson.put("stor_id", sectDao.getStor_id()); + whereJson.put("stor_code", sectDao.getStor_code()); whereJson.put("sect_code", sectDao.getSect_code()); //物料组盘入库 if (StringUtils.isBlank(whereJson.getString("is_empty_vehicle"))) { @@ -392,14 +438,31 @@ public class PdaIosInServiceImpl implements PdaIosInService { // 预组织出入库单据实体 Map jsonMst = organizeInsertData(whereJson); // 调用服务新增出入库单 - String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst); + String iostorinvId = iRawAssistIStorService.insertDtl(jsonMst); // 预组织出入库单据明细的分配数据 - whereJson.put("iostorinv_id", iostorinv_id); + whereJson.put("iostorinv_id", iostorinvId); Map jsonDtl = organizeDivData(whereJson); // 调用分配,默认自动分配库位 iRawAssistIStorService.divStruct(new JSONObject(jsonDtl)); // 下发任务 - sendTask(whereJson); + Map taskJson = new HashMap<>(); + taskJson.put("point_code", whereJson.getString("point_code")); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + ArrayList tableMater = new ArrayList<>(); + disDtl.forEach(item -> { + tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + taskJson.put("tableMater", tableMater); + iRawAssistIStorService.divPoint(taskJson); //更新组盘表状态 mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper() .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")) @@ -408,16 +471,15 @@ public class PdaIosInServiceImpl implements PdaIosInService { } else { //空载具入库 whereJson.put("qty", 1); - whereJson.put("pcsn", whereJson.getString("material_id")); String materialCode = "1".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空托盘") : "2".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空料箱") : StatusEnum.VEHICLE_TYPE.code("空货架"); whereJson.put("material_id", materialCode); //组盘 - groupPlate(whereJson); - // 生成空载具入库任务 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); + //生成空载具入库任务 whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); whereJson.put("storagevehicle_code", whereJson.getString("vehicle_code")); //入库分配 - divStructNoBills(whereJson); + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); } return PdaResponse.requestOk(); } @@ -489,13 +551,13 @@ public class PdaIosInServiceImpl implements PdaIosInService { // 查询库区 Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id")); // 查询仓库 - BsrealStorattr storeDao = iSrealStorattrService.getById(sectDao.getStor_id()); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(sectDao.getStor_code()); // 组织主数据 Map jsonMst = new HashMap<>(); jsonMst.put("checked", true); jsonMst.put("sect_id", sectDao.getSect_id()); - jsonMst.put("stor_id", sectDao.getStor_id()); jsonMst.put("sect_code", sectDao.getSect_code()); + jsonMst.put("stor_id", storeDao.getStor_id()); jsonMst.put("stor_code", storeDao.getStor_code()); // 组织明细数据 IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( @@ -516,37 +578,6 @@ public class PdaIosInServiceImpl implements PdaIosInService { return jsonMst; } - /** - * 下发任务 - * @param whereJson { - * storagevehicle_code:载具编码 - * point_code:点位编码 - * sect_code:库区 - * iostorinv_id: id - * } - */ - private void sendTask(JSONObject whereJson) { - // 组织主数据 - Map jsonMst = new HashMap<>(); - jsonMst.put("point_code", whereJson.getString("point_code")); - // 组织明细数据 - IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( - new QueryWrapper().lambda() - .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) - ); - // 查找分配明细 - Map map = new HashMap<>(); - map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id()); - List disDtl = iRawAssistIStorService.getDisDtl(map); - // 类型转换 - ArrayList tableMater = new ArrayList<>(); - disDtl.forEach(item -> { - tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); - }); - jsonMst.put("tableMater", tableMater); - - iRawAssistIStorService.divPoint(jsonMst); - } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java index 9f06f46..248a640 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java @@ -1,14 +1,20 @@ package org.nl.wms.pda.ios_manage.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; 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.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.domain.vo.SelectItemVo; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; @@ -16,24 +22,24 @@ import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; 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.IMdMeMaterialbaseService; -import org.nl.wms.basedata_manage.service.ISectattrService; -import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.*; +import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; +import org.nl.wms.pda.ios_manage.service.PdaIosInService; import org.nl.wms.pda.ios_manage.service.PdaIosOutService; import org.nl.wms.pda.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.util.AbstractTask; -import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask; import org.nl.wms.sch_manage.service.util.tasks.StOutTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; -import org.nl.wms.warehouse_management.service.IRawAssistIStorService; import org.nl.wms.warehouse_management.service.dao.GroupPlate; import org.nl.wms.warehouse_management.service.dao.IOStorInv; import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; @@ -42,17 +48,13 @@ import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvMapper; import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper; -import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -79,7 +81,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private ISectattrService iSectattrService; - + /** + * 基础物料服务 + */ + @Autowired + private MdMeMaterialbaseMapper mdMeMaterialbaseMapper; /** * 出入库单主表 */ @@ -90,7 +96,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private IBsrealStorattrService iSrealStorattrService; - + /** + * 载具服务 + */ + @Autowired + private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; /** * 基础物料服务 */ @@ -101,6 +111,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper; + /* + * 任务服务 + */ + @Autowired + private ISchBaseTaskService iSchBaseTaskService; /** * 点位服务 @@ -127,29 +142,10 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { private IOStorInvDisMapper ioStorInvDisMapper; /** - * 更新库存服务 + * 入库服务 */ @Autowired - private UpdateIvtUtils updateIvtUtils; - - /** - * 出库任务类 - */ - @Autowired - private StOutTask stOutTask; - - /** - * 手持任务 - */ - @Autowired - private PdaPointTask pdaPointTask; - - - /** - * 入库服务服务 - */ - @Autowired - private IRawAssistIStorService iRawAssistIStorService; + private PdaIosInService pdaIosInServiceImpl; @Override @@ -173,8 +169,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { MapOf.of("search", whereJson.getString("search"), "region_code", whereJson.getString("region_code"), "status", GROUP_PLATE_STATUS.code("入库"), - "is_has_workder", "false", - "order_by", "gro.create_time asc")); + "pointStatus", "1")); + } + //显示所有货架的点位 + if (StringUtils.isBlank(whereJson.getString("search"))) { + list = list.stream() + .collect(Collectors.groupingBy(StructattrVechielDto::getStruct_code)) + .values() + .stream() + .map(r -> r.stream() + .filter(f -> !StatusEnum.VEHICLE_TYPE.code("空货架").equals(f.getMaterial_code())) + .findFirst() + .orElse(r.get(0))) + .sorted(Comparator.comparing(StructattrVechielDto::getStruct_code)) + .collect(Collectors.toList()); + } else { + //只显示库存 + list = list.stream().filter(f -> !StatusEnum.VEHICLE_TYPE.code("空货架").equals(f.getMaterial_code())) + .sorted(Comparator.comparing(StructattrVechielDto::getStruct_code)) + .collect(Collectors.toList()); } return PdaResponse.requestParamOk(list); } @@ -197,6 +210,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { } + @Override + public List getReturnPoint(JSONObject whereJson) { + List selectList = new ArrayList<>(); + List cxPointLists = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + cxPointLists = cxPointLists.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(cxPointLists)) { + throw new BadRequestException("暂无可用放置空架的点位,请稍后再试。"); + } + cxPointLists.forEach(r -> + selectList.add(SelectItemVo.builder().text(r.getPoint_name()).value(r.getPoint_code()).build()) + ); + return selectList; + } + + @Override @Transactional public PdaResponse materialConfirm(JSONObject whereJson) { @@ -223,13 +255,15 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { iStructattrService.updateStatusByCode("0", lock_map); //创建任务 JSONObject taskForm = new JSONObject(); - taskForm.put("task_type", "STOutTask"); + taskForm.put("task_type", IOSConstant.ST_OUT_TASK); + taskForm.put("config_code", IOSConstant.ST_OUT_TASK); taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); taskForm.put("point_code1", json.getString("struct_code")); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", json.getString("storagevehicle_code")); - StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); - String taskId = stOutTask.create(taskForm); + taskForm.put("is_auto_confirm",(BaseDataEnum.IS_YES_NOT.code("是"))); + taskForm.put("handle_status",(BaseDataEnum.IS_YES_NOT.code("是"))); + String taskId = applyTaskMap.get(IOSConstant.ST_OUT_TASK).create(whereJson); //更新任务id ioStorInvDisMapper.update(new IOStorInvDis(), new LambdaUpdateWrapper() .set(IOStorInvDis::getTask_id, taskId) @@ -251,6 +285,9 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { if (ObjectUtil.isEmpty(schBasePoint)) { throw new BadRequestException("未找到目标:" + whereJson.getString("siteCode") + "的点位信息,请检查"); } + if (StringUtils.isNotBlank(schBasePoint.getVehicle_code()) || IOSEnum.POINT_STATUS.code("有货").equals(schBasePoint.getPoint_status())) { + throw new BadRequestException("该点位有货架在2分钟之后进行出库确认,请稍等"); + } //锁定货位 // JSONObject lock_map = new JSONObject(); // lock_map.put("struct_code", json.getString("struct_code")); @@ -264,8 +301,8 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { taskForm.put("point_code1", json.getString("struct_code")); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", json.getString("storagevehicle_code")); - PdaPointTask pdaPointTask = SpringContextHolder.getBean("PdaPointTask"); - pdaPointTask.create(taskForm); + taskForm.put("is_auto_confirm",(BaseDataEnum.IS_YES_NOT.code("是"))); + String taskCode = applyTaskMap.get(IOSConstant.PDA_POINT_TASK).create(taskForm); GroupPlate plateDao = mdPbGroupplateMapper.selectOne( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, json.getString("storagevehicle_code")).eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))); @@ -274,6 +311,10 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { .set(GroupPlate::getFrozen_qty, plateDao.getQty()) .eq(GroupPlate::getGroup_id, json.getString("group_id")) ); + //更新任务标识 + iSchBasePointService.update(new UpdateWrapper().lambda() + .eq(SchBasePoint::getPoint_code, whereJson.getString("siteCode")) + .set(SchBasePoint::getIng_task_code, taskCode)); return PdaResponse.requestOk(); } @@ -306,7 +347,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { if (ObjectUtil.isEmpty(sectattr)) { throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!"); } - BsrealStorattr storeDao = iSrealStorattrService.getById(sectattr.getStor_id()); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(sectattr.getStor_code()); whereJson.put("stor_code", storeDao.getStor_code()); whereJson.put("sect_code", sectattr.getSect_code()); StrategyStructParam strategyStructParam = StrategyStructParam.builder() @@ -330,6 +371,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { taskForm.put("point_code1", r.getStruct_code()); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", r.getStoragevehicle_code()); + taskForm.put("handle_status", BaseDataEnum.IS_YES_NOT.code("否")); applyTaskMap.get(IOSConstant.VEHICLE_OUT_TASK).create(taskForm); }); //更新组盘记录表 @@ -431,36 +473,90 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { return disId; } + + @Override + public TableDataInfo getMaterialList(JSONObject whereJson) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPage(whereJson.getInteger("page") - 1); + pageQuery.setSize(100); + whereJson.put("region", "YZHJ"); + // 查询条件 + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + String search = MapUtil.getStr(whereJson, "search"); + if (ObjectUtil.isNotEmpty(search)) { + queryWrapper.likeRight(MdMeMaterialbase::getMaterial_code, search) + .or(item -> item.likeRight(MdMeMaterialbase::getMaterial_name, search)); + } + String regionCode = MapUtil.getStr(whereJson, "region"); + if (ObjectUtil.isNotEmpty(regionCode)) { + queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + } + queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); + Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), + queryWrapper + ); + return PdaResponse.build(mapPage); + } + + @Override @Transactional(rollbackFor = Exception.class) public PdaResponse bindOrUnbind(JSONObject whereJson) { String siteCode = whereJson.getString("siteCode"); String shelfCode = whereJson.getString("shelfCode"); String mode = whereJson.getString("mode"); - // 校验站点是否存在、是否可用 - SchBasePoint sitePoint = iSchBasePointService.getOne( - new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, siteCode) - .eq(SchBasePoint::getIs_used, true) - ); - if (sitePoint == null) { - throw new BadRequestException("输入的站点编号有误或被禁用,请检查!"); - } - //校验站点是否有在途输送任务 - List activeTasks = iSchBasePointService.checkEndPointTask( - null, null, StatusEnum.SORT_TYPE.code("升序"), null, siteCode, null, false - ); - if (CollectionUtils.isNotEmpty(activeTasks)) { - throw new BadRequestException("该货架正在执行输送任务,状态为锁定,请等任务完成再做绑定或解绑!"); + SchBasePoint sitePoint; + if (IOSEnum.BIND_OR_UNBIND.code("绑定").equals(mode)) { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, siteCode) + .eq(SchBasePoint::getIs_used, true) + ); + if (sitePoint == null) { + throw new BadRequestException("输入的站点编号有误或被禁用,请检查!"); + } + Set pointIds = new HashSet<>(); + pointIds.add(siteCode); + //校验是否有任务 + List activeTasks = iSchBaseTaskService.getTaskList(null, pointIds, null, null); + if (CollectionUtils.isNotEmpty(activeTasks)) { + throw new BadRequestException("检查到运输到这个点位的任务,任务号为:" + activeTasks.get(0).getTask_code() + + ",起点为:" + activeTasks.get(0).getPoint_code1() + ",终点为:" + activeTasks.get(0).getPoint_code2() + + ",载具号为:" + activeTasks.get(0).getVehicle_code() + ",请稍后操作,或在WMS任务列表中检查。"); + } + } else { + if (StringUtils.isNotBlank(shelfCode)) { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, shelfCode) + .eq(SchBasePoint::getIs_used, true) + ); + if (sitePoint == null) { + //无需解绑 + return PdaResponse.requestOk(); + } + siteCode = sitePoint.getPoint_code(); + } else { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, siteCode) + .eq(SchBasePoint::getIs_used, true) + ); + } } LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); if (IOSEnum.BIND_OR_UNBIND.code("绑定").equals(mode)) { - doBind(sitePoint, siteCode, shelfCode, wrapper); + checkGroupPlateStatus(shelfCode, sitePoint.getRegion_code()); + doBind(siteCode, shelfCode, wrapper); } else { doUnbind(sitePoint, siteCode, wrapper); } wrapper.set(SchBasePoint::getUpdate_time, DateUtil.now()) .set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")) + .set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()); iSchBasePointService.update(wrapper); return PdaResponse.requestOk(); @@ -469,23 +565,19 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 绑定 */ - private void doBind(SchBasePoint sitePoint, String siteCode, String shelfCode, LambdaUpdateWrapper wrapper) { - // 校验站点是否已绑定 - if (StringUtils.isNotBlank(sitePoint.getVehicle_code())) { - if (sitePoint.getVehicle_code().equals(shelfCode)) { - checkGroupPlateStatus(shelfCode); - return; - } - throw new BadRequestException("当前站点已绑定货架:" + sitePoint.getVehicle_code() + ",请先解绑!"); - } - // 校验货架是否已绑定在其他站点 + private void doBind(String siteCode, String shelfCode, LambdaUpdateWrapper wrapper) { SchBasePoint boundPoint = iSchBasePointService.getOne( new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, shelfCode) ); if (boundPoint != null) { - throw new BadRequestException("当前货架:" + shelfCode + "已绑定在站点:" + boundPoint.getPoint_code() + ",请先解绑。"); + //解绑 + LambdaUpdateWrapper wrapper1 = new LambdaUpdateWrapper<>(); + wrapper1.eq(SchBasePoint::getPoint_code, boundPoint.getPoint_code()) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")); + iSchBasePointService.update(wrapper1); + //throw new BadRequestException("当前货架:" + shelfCode + "已绑定在站点:" + boundPoint.getPoint_code() + ",请扫描站点:" + boundPoint.getPoint_code() + "进行解绑,再绑定。"); } - checkGroupPlateStatus(shelfCode); wrapper.eq(SchBasePoint::getPoint_code, siteCode) .set(SchBasePoint::getVehicle_code, shelfCode) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")); @@ -494,17 +586,21 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 校验组盘状态 */ - private void checkGroupPlateStatus(String shelfCode) { + private void checkGroupPlateStatus(String shelfCode, String regionCode) { List plates = mdPbGroupplateMapper.selectList( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, shelfCode) .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) ); if (CollectionUtils.isNotEmpty(plates)) { + LambdaUpdateWrapper update = new LambdaUpdateWrapper<>(); Set plateCodes = plates.stream().map(GroupPlate::getGroup_id).collect(Collectors.toSet()); - mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() - .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) - .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO).in(GroupPlate::getGroup_id, plateCodes)); + if (!regionCode.equals(StatusEnum.REGION_INFO.code("商用线5号线"))) { + update.set(GroupPlate::getFrozen_qty, BigDecimal.ZERO); + } + update.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + .in(GroupPlate::getGroup_id, plateCodes); + mdPbGroupplateMapper.update(null, update); } } @@ -534,18 +630,88 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 1.库存载具绑定到出库点位 * 2.更新组盘记录为出库 + * 3.type="1",出库确认;type="2",强制确认。 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public PdaResponse outStorageConfirm(JSONObject whereJson) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); + //任务校验 + SchBaseTask task = iSchBaseTaskService.getOne(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, whereJson.getString("storagevehicle_code")).lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())); + if (ObjectUtil.isNotEmpty(task)) { + throw new BadRequestException("该货架:" + whereJson.getString("storagevehicle_code") + "的运输任务,任务号为:" + task.getTask_code() + ",尚未完成,请等待任务完成,再取货确认。"); + } //获取终点 SchBasePoint pointDao = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code"))); if (ObjectUtil.isEmpty(pointDao)) { throw new BadRequestException("未找到载具所在的点位信息,请检查"); } + //预装区与商用5号线点位需自动回空 + if (pointDao.getRegion_code().equals(StatusEnum.REGION_INFO.code("商用线5号线"))) { + //物料组盘信息出库 + whereJson.put("type", "2"); + //处理组盘信息 + handleGroupPlate(whereJson); + if (StringUtils.isNotBlank(pointDao.getIng_task_code())) { + SchBaseTask schBaseTask = iSchBaseTaskService.getByCode(pointDao.getIng_task_code()); + SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, schBaseTask.getPoint_code1())); + if (schBasePoint.getRegion_code().equals(StatusEnum.REGION_INFO.code("预装线货架区")) && StringUtils.isNotBlank(whereJson.getString("isAutoReturn"))) { + String pointCode1 = whereJson.getString("startCode"); + String pointCode2 = whereJson.getString("siteCode"); + //自动获取终点回空载具 + if (BaseDataEnum.IS_YES_NOT.code("是").equals(whereJson.getString("isAutoReturn"))) { + if (StringUtils.isBlank(pointCode1)) { + SchBasePoint startPoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code")) + ); + pointCode1 = startPoint.getPoint_code(); + } + List cxPointLists = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + cxPointLists = cxPointLists.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(cxPointLists)) { + throw new BadRequestException("暂无可用放置空架的点位,请稍后再试。"); + } + pointCode2 = cxPointLists.get(0).getPoint_code(); + } + whereJson.put("pointCode", pointCode1); + whereJson.put("siteCode", pointCode2); + //生成任务 + SpringContextHolder.getBean(PdaIosOutServiceImpl.class).transferConfirm(whereJson); + } else { + //线边仓 + whereJson.put("qty", 1); + String materialCode = StatusEnum.VEHICLE_TYPE.code("空货架"); + whereJson.put("material_id", materialCode); + //组盘 + pdaIosInServiceImpl.groupPlate(whereJson); + // 生成空载具入库任务 + whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); + whereJson.put("storagevehicle_code", whereJson.getString("storagevehicle_code")); + //入库分配 + pdaIosInServiceImpl.divStructNoBills(whereJson); + } + } + } else { + handleGroupPlate(whereJson); + //载具绑定到出库点 + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code")) + .set(SchBasePoint::getIos_id, BaseDataEnum.IS_YES_NOT.code("是")) + .eq(SchBasePoint::getPoint_code, pointDao.getPoint_code()) + ); + } + return PdaResponse.requestOk(); + } + + + private void handleGroupPlate(JSONObject whereJson) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); GroupPlate groupPlate = mdPbGroupplateMapper.selectById(whereJson.getString("group_id")); if (ObjectUtil.isEmpty(groupPlate)) { throw new BadRequestException("未找到该载具的组盘信息,请检查"); @@ -573,52 +739,133 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { .eq(GroupPlate::getGroup_id, whereJson.getString("group_id")); //更新组盘记录表 mdPbGroupplateMapper.update(new GroupPlate(), updateWrapper); - //库存绑定到出库点 - iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) - .set(SchBasePoint::getVehicle_code, groupPlate.getStoragevehicle_code()) - .set(SchBasePoint::getIos_id, BaseDataEnum.IS_YES_NOT.code("是")) - .eq(SchBasePoint::getPoint_code, pointDao.getPoint_code()) - ); - return PdaResponse.requestOk(); } + /** + * 目标站点或区域传值二选一 + * 载具编号:"storagevehicle_code":"T0002", + * 点位编号:"siteCode":"", + * 区域编号:"region_code":"IN01" + */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public PdaResponse transferConfirm(JSONObject whereJson) { - if (StringUtils.isBlank(whereJson.getString("region_code")) && StringUtils.isBlank(whereJson.getString("siteCode"))) { + String regionCode = whereJson.getString("region_code"); + //起点 + String pointCode1 = whereJson.getString("pointCode"); + //终点 + String pointCode2 = whereJson.getString("siteCode"); + String vehicleCode = whereJson.getString("storagevehicle_code"); + if (StringUtils.isBlank(regionCode) && StringUtils.isBlank(pointCode2)) { throw new BadRequestException("请选择目标站点或区域!"); } - String pointCode = whereJson.getString("siteCode"); - if (StringUtils.isBlank(pointCode)) { - List pointList = iSchBasePointService.list(new LambdaQueryWrapper() - .eq(SchBasePoint::getRegion_code, whereJson.getString("region_code")) - .eq(SchBasePoint::getIs_used, 1) - .isNull(SchBasePoint::getVehicle_code) - .orderByAsc(SchBasePoint::getIn_order_seq)); - if (CollectionUtils.isEmpty(pointList)) { - throw new BadRequestException("该区域无可用空余点位!"); - } - pointCode = pointList.get(0).getPoint_code(); + //校验载具 + MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(vehicleCode); + if (ObjectUtil.isEmpty(vehicleDao)) { + throw new BadRequestException("不存在该载具号信息,请检查"); } - //确定起点 - SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code"))); - if (ObjectUtil.isEmpty(schBasePoint)) { - throw new BadRequestException("未找到载具所在的点位信息,请检查"); + if (StringUtils.isNotBlank(pointCode2)) { + SchBasePoint schBasePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, pointCode2).eq(SchBasePoint::getIs_used, true) + ); + if (schBasePoint == null) { + throw new BadRequestException("输入终点点位有误或被禁用,请检查是否手动输入输错。"); + } + } + // 确定起点 + String startPointCode; + SchBasePoint schBasePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, vehicleCode) + ); + if (StringUtils.isBlank(pointCode1)) { + if (ObjectUtil.isEmpty(schBasePoint)) { + throw new BadRequestException("未找到载具所在的点位信息,请检查"); + } + startPointCode = schBasePoint.getPoint_code(); + } else { + + SchBasePoint point = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, pointCode1).eq(SchBasePoint::getIs_used, true)); + if (point == null) { + throw new BadRequestException("起点点位:" + pointCode1 + "不存在,请检查。"); + } + //自动解绑/绑定 + if (schBasePoint != null) { + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) + ); + } + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, vehicleCode) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) + .eq(SchBasePoint::getPoint_code, pointCode1) + ); + startPointCode = pointCode1; + } + // 确定终点 + String endPointCode = pointCode2; + if (StringUtils.isBlank(endPointCode)) { + List pointList; + //特殊分配规则 + if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区"))) { + pointList = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + pointList = pointList.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(pointList)) { + //入线边仓 + whereJson.put("stor_code",StatusEnum.STORE_INFO.code("料架线边库")); + whereJson.put("sect_code","XB01"); + whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); + whereJson.put("qty", 1); + whereJson.put("site_code",startPointCode); + whereJson.put("vehicle_code",vehicleCode); + whereJson.put("is_auto_confirm",startPointCode); + //组盘 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); + //生成空载具入库任务 + whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); + //入库分配 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); + return PdaResponse.requestOk(); + } + } else { + pointList = iSchBasePointService.checkEndPointTask( + regionCode, + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), + null, null, "true", false + ); + if (CollectionUtils.isEmpty(pointList)) { + throw new BadRequestException("暂无可用空位,请稍后再试。"); + } + } + endPointCode = pointList.get(0).getPoint_code(); } // 生成转运任务 JSONObject task = new JSONObject(); task.put("task_type", IOSConstant.PDA_POINT_TASK); task.put("config_code", IOSConstant.PDA_POINT_TASK); - task.put("point_code1", schBasePoint.getPoint_code()); - task.put("point_code2", pointCode); - task.put("vehicle_code", whereJson.getString("storagevehicle_code")); - pdaPointTask.create(task); - // 更新起点绑定id + task.put("point_code1", startPointCode); + task.put("point_code2", endPointCode); + task.put("vehicle_code", vehicleCode); + // 创建任务 + applyTaskMap.get(IOSConstant.PDA_POINT_TASK).create(task); + // 清空起点任务标识 iSchBasePointService.update( new UpdateWrapper().lambda() .set(SchBasePoint::getIos_id, null) - .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) + .set(SchBasePoint::getIng_task_code, null) + .eq(SchBasePoint::getPoint_code, startPointCode) ); return PdaResponse.requestOk(); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java index 3d624fc..d588bbe 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java @@ -40,7 +40,6 @@ public class PdaSchPointController { } @PostMapping("/binding") - @Log("解绑") @SaIgnore public ResponseEntity binding(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(pdaSchPointService.binding(whereJson), HttpStatus.OK); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java index d478560..28179e3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java @@ -25,7 +25,6 @@ public interface PdaSchPointService extends IService { PdaResponse getPoint(JSONObject whereJson); /** - * 解绑 * @param whereJson { * point_code: 点位编码 * point_name: 点位名称 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java index 4ee0e0b..9beaffb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java @@ -56,7 +56,7 @@ public class PdaSchTaskServiceImpl extends ServiceImpl SELECT - p.* + p.* FROM - `sch_base_point` p + `sch_base_point` p p.workshop_code = #{whereJson.workshop_code} - AND (p.point_code LIKE '%${whereJson.blurry}%' OR p.point_name LIKE '%${whereJson.blurry}%') + AND (p.point_code LIKE '%${whereJson.blurry}%' OR p.point_name LIKE '%${whereJson.blurry}%' OR + p.vehicle_code LIKE '%${whereJson.blurry}%' OR p.region_name LIKE '%${whereJson.blurry}%' OR + p.region_code LIKE '%${whereJson.blurry}%') AND p.region_code = #{whereJson.region_code} @@ -50,16 +52,16 @@ AND p.is_used = #{whereJson.is_used} - - - - AND (p.ing_task_code IS NOT NULL AND p.ing_task_code ]]> '') - - - - AND (p.ing_task_code IS NULL OR p.ing_task_code = '') - - + + + + + + + + + + ORDER BY p.region_code, p.point_code, p.point_type diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml index cf092a8..5bebd87 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml @@ -103,7 +103,7 @@ - SELECT config_code,task_id,point_code1, point_code2 + SELECT config_code,task_id,vehicle_code,task_code,point_code1, point_code2 FROM sch_base_task WHERE diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index 9bef0de..7e512ab 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -6,6 +6,7 @@ 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.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -122,33 +123,33 @@ public class SchBasePointServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper(); + updateWrapper.eq(SchBasePoint::getPoint_code, entity.getPoint_code()); // 获取region_name SchBaseRegion baseRegion = regionMapper.selectById(entity.getRegion_code()); - entity.setRegion_name(baseRegion.getRegion_name()); - if (ObjectUtil.isNotEmpty(entity.getCan_vehicle_types())) { - String can_vehicle_type = String.join(",", entity.getCan_vehicle_types()); - entity.setCan_vehicle_type(can_vehicle_type); + updateWrapper.set(SchBasePoint::getRegion_code, baseRegion.getRegion_code()); + updateWrapper.set(SchBasePoint::getRegion_name, baseRegion.getRegion_name()); + if (StringUtils.isNotBlank(entity.getVehicle_code())) { + updateWrapper.set(SchBasePoint::getVehicle_code, entity.getVehicle_code()); + }else { + updateWrapper.set(SchBasePoint::getVehicle_code, null); } String pointStatus = entity.getPoint_status(); + updateWrapper.set(SchBasePoint::getPoint_status, pointStatus); + updateWrapper.set(SchBasePoint::getIs_has_workder, entity.getIng_task_code()); // 根据点位状态来判断更新内容 - if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals(IOSEnum.POINT_STATUS.code("无货"))) { - entity.setVehicle_type(""); - entity.setVehicle_code(""); + if (pointStatus.equals(IOSEnum.POINT_STATUS.code("无货"))) { + updateWrapper.set(SchBasePoint::getVehicle_type, null); + updateWrapper.set(SchBasePoint::getPoint_status, pointStatus); } - pointMapper.updateById(entity); + pointMapper.update(null, updateWrapper); } @Override @Transactional public void deleteAll(Set ids) { // 真删除 - pointMapper.deleteBatchIds(ids); + // pointMapper.deleteBatchIds(ids); } @Override diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java index 8dc4a61..0144300 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java @@ -88,34 +88,35 @@ public abstract class AbstractTask { resultForAcs.setCode(HttpStatus.HTTP_BAD_REQUEST); resultForAcs.setMessage(e.getMessage()); } - // 如果下发完毕,就修改状态 - if (resultForAcs.getCode() == HttpStatus.HTTP_OK) { - // 查询所有任务 - List taskList = taskService.list( - new QueryWrapper().lambda() - .in(SchBaseTask::getTask_code, taskDtoList.stream() - .map(AcsTaskDto::getTask_code) - .collect(Collectors.toList()) - ) - ); - - // 解析并备注 - JSONArray errArr = resultForAcs.getErrArr(); - for (SchBaseTask schBaseTask : taskList) { - schBaseTask.setTask_status(TaskStatus.ISSUED.getCode()); - // 判断是否是出错的任务 - for (int i = 0; ObjectUtil.isNotEmpty(errArr) && i < errArr.size(); i++) { - JSONObject errObj = errArr.getJSONObject(i); - String taskCode = errObj.getString("task_code"); - if (taskCode.equals(schBaseTask.getTask_code())) { - // 出错的任务就设置出错信息为备注,不是出错就设置下发 - schBaseTask.setTask_status(TaskStatus.CREATED.getCode()); - schBaseTask.setRemark(errObj.getString("message")); - break; + if (resultForAcs != null) { + // 如果下发完毕,就修改状态 + if (resultForAcs.getCode() == HttpStatus.HTTP_OK) { + // 查询所有任务 + List taskList = taskService.list( + new QueryWrapper().lambda() + .in(SchBaseTask::getTask_code, taskDtoList.stream() + .map(AcsTaskDto::getTask_code) + .collect(Collectors.toList()) + ) + ); + // 解析并备注 + JSONArray errArr = resultForAcs.getErrArr(); + for (SchBaseTask schBaseTask : taskList) { + schBaseTask.setTask_status(TaskStatus.ISSUED.getCode()); + // 判断是否是出错的任务 + for (int i = 0; ObjectUtil.isNotEmpty(errArr) && i < errArr.size(); i++) { + JSONObject errObj = errArr.getJSONObject(i); + String taskCode = errObj.getString("task_code"); + if (taskCode.equals(schBaseTask.getTask_code())) { + // 出错的任务就设置出错信息为备注,不是出错就设置下发 + schBaseTask.setTask_status(TaskStatus.CREATED.getCode()); + schBaseTask.setRemark(errObj.getString("message")); + break; + } } } + taskService.updateBatchById(taskList); } - taskService.updateBatchById(taskList); } return resultForAcs; } @@ -131,7 +132,6 @@ public abstract class AbstractTask { /** * 以下改为public会出现自动注入类出现问题 - * * @param task_code r任务号 * @param status 状态码 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java deleted file mode 100644 index bb67e17..0000000 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.nl.wms.sch_manage.service.util; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.http.HttpStatus; -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.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; -import org.nl.config.SpringContextHolder; -import org.nl.wms.gateway.dto.RcsResponse; -import org.nl.wms.gateway.service.IGateWayService; -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.tasks.StOutTask; -import org.nl.wms.warehouse_management.enums.IOSConstant; -import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -@Slf4j -@Component -@RequiredArgsConstructor -public class AutoTask { - - /** - * 任务服务 - */ - @Autowired - private ISchBaseTaskService taskService; - /** - * 通用工具类 - */ - @Autowired - private UpdateIvtUtils updateIvtUtils; - /** - * 任务工厂服务 - */ - @Autowired - private TaskFactory taskFactory; - @Resource - private IGateWayService iGateWayService; - - - private final RedissonClient redissonClient; - - //定时任务 - @SneakyThrows - public void run() { - RLock lock = redissonClient.getLock(this.getClass().getName()); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - try { - if (tryLock) { - sendTask(); - } - } catch (Exception e) { - if (tryLock) { - lock.unlock(); - } - } - } - - /** - * 定时任务:下发任务 - */ - private void sendTask() { - List taskList = taskService.list(new LambdaQueryWrapper() - .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) - .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); - if (CollectionUtils.isEmpty(taskList)) { - return; - } - List failTaskList = new ArrayList<>(); - Set issuedTaskSet = new HashSet<>(); - // 整理下发rcs参数 - for (SchBaseTask taskDao : taskList) { - List taskDtoList = new ArrayList<>(); - taskDtoList.add(updateIvtUtils.sendRcsParam(taskDao)); - RcsResponse resultForRcs = RcsResponse.requestOkMessage("", ""); - resultForRcs.setResponseDate(DateUtil.now()); - try { - // 创建下发对象 - resultForRcs = iGateWayService.renotifyRcs(taskDtoList); - } catch (Exception e) { - log.error("任务下发异常: {}", e.getMessage()); - resultForRcs.setCode(HttpStatus.HTTP_BAD_REQUEST); - resultForRcs.setDesc(e.getMessage()); - } - if (resultForRcs.getCode() == 1000) { - issuedTaskSet.add(taskDao.getTask_id()); - log.info("任务号{},载具号{}下发任务成功", taskDao.getTask_code(), taskDao.getVehicle_code()); - } else { - //获取返回的错误信息 - String error = resultForRcs.getDesc(); - //把下发失败的任务号放在集合中,统一更新备注任务下发失败 - taskDao.setRemark(resultForRcs.getResponseDate() + ":" + error); - failTaskList.add(taskDao); - log.error("任务号{},载具号{}下发任务失败,错误信息:{}", taskDao.getTask_code(), taskDao.getVehicle_code(), error); - } - } - if (CollectionUtils.isNotEmpty(issuedTaskSet)) { - // 如果下发成功,就修改状态 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(SchBaseTask::getTask_status, TaskStatus.ISSUED.getCode()); - updateWrapper.in(SchBaseTask::getTask_id, issuedTaskSet); - taskService.update(updateWrapper); - } - //失败的,更新每个不同失败的原因 - for (SchBaseTask r : failTaskList) { - LambdaUpdateWrapper failUpdateWrapper = new LambdaUpdateWrapper<>(); - failUpdateWrapper.set(SchBaseTask::getRemark, r.getRemark()); - failUpdateWrapper.eq(SchBaseTask::getTask_id, r.getTask_id()); - taskService.update(failUpdateWrapper); - } - } -} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java new file mode 100644 index 0000000..d0de7b8 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java @@ -0,0 +1,110 @@ +package org.nl.wms.sch_manage.service.util.autoTasks; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/** + * 延迟完成任务 + * + * @author gbx + * @since 2025-07-21 + */ +@Service +@Slf4j +public class AutoDelayFinish { + + private final ReentrantLock lock = new ReentrantLock(); + /** + * 点位服务 + */ + @Autowired + private ISchBasePointService iSchBasePointService; + + + //定时任务 + public void run() { + try { + this.runTask(); + } catch (Exception e) { + log.error("定时任务:AutoDelayFinish,运行异常:", e); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + /** + * 定时任务:延迟更新点位 + */ + public void runTask() { + boolean isLock = false; + try { + isLock = lock.tryLock(3, TimeUnit.SECONDS); + if (!isLock) { + log.warn("未获取到锁,跳过此次任务"); + return; + } + List taskList = iSchBasePointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("是")) + .eq(SchBasePoint::getRegion_code, StatusEnum.REGION_INFO.code("商用线5号线"))); + if (CollectionUtils.isEmpty(taskList)) { + return; + } + LocalDateTime now = LocalDateTime.now(); + List pointCodes = taskList.stream() + .filter(r -> { + try { + String updateTimeStr = r.getUpdate_time(); + if (StringUtils.isBlank(updateTimeStr)) { + return false; + } + LocalDateTime updateTime = LocalDateTime.parse(updateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return Duration.between(updateTime, now).toMinutes() >= 2; + } catch (Exception e) { + return false; + } + }) + .map(SchBasePoint::getPoint_code) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(pointCodes)) { + iSchBasePointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .in(SchBasePoint::getPoint_code, pointCodes)); + } + } catch ( + Exception ex) { + log.error("AutoDelayFinish执行异常:", ex); + } finally { + if (isLock && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java new file mode 100644 index 0000000..2d2e50e --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java @@ -0,0 +1,135 @@ +package org.nl.wms.sch_manage.service.util.autoTasks; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; +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.apache.commons.collections4.CollectionUtils; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.gateway.dto.RcsResponse; +import org.nl.wms.gateway.service.IGateWayService; +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.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + +@Service +@Slf4j +@RequiredArgsConstructor +public class AutoTask { + + private final ReentrantLock lock = new ReentrantLock(); + + /** + * 任务服务 + */ + @Autowired + private ISchBaseTaskService taskService; + /** + * 通用工具类 + */ + @Autowired + private UpdateIvtUtils updateIvtUtils; + @Resource + private IGateWayService iGateWayService; + + + //定时任务 + + public void run() { + try { + this.sendTask(); + } catch (Exception e) { + log.error("定时任务:AutoTask,运行异常:", e); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + /** + * 定时任务:下发任务 + */ + private void sendTask() { + boolean isLock = false; + try { + isLock = lock.tryLock(3, TimeUnit.SECONDS); + if (!isLock) { + log.warn("未获取到锁,跳过此次任务"); + return; + } + List taskList = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); + if (CollectionUtils.isEmpty(taskList)) { + return; + } + List failTaskList = new ArrayList<>(); + Set issuedTaskSet = new HashSet<>(); + // 整理下发rcs参数 + for (SchBaseTask taskDao : taskList) { + List taskDtoList = new ArrayList<>(); + taskDtoList.add(updateIvtUtils.sendRcsParam(taskDao)); + RcsResponse resultForRcs = RcsResponse.requestOkMessage("", ""); + resultForRcs.setResponseDate(DateUtil.now()); + try { + // 创建下发对象 + resultForRcs = iGateWayService.renotifyRcs(taskDtoList); + } catch (Exception e) { + log.error("任务下发异常: {}", e.getMessage()); + resultForRcs.setCode(HttpStatus.HTTP_BAD_REQUEST); + resultForRcs.setDesc(e.getMessage()); + } + if (resultForRcs != null) { + if (resultForRcs.getCode() == 1000) { + issuedTaskSet.add(taskDao.getTask_id()); + log.info("任务号{},载具号{}下发任务成功", taskDao.getTask_code(), taskDao.getVehicle_code()); + } else { + //获取返回的错误信息 + String error = resultForRcs.getDesc(); + //把下发失败的任务号放在集合中,统一更新备注任务下发失败 + taskDao.setRemark(resultForRcs.getResponseDate() + ":" + error); + failTaskList.add(taskDao); + log.error("任务号{},载具号{}下发任务失败,错误信息:{}", taskDao.getTask_code(), taskDao.getVehicle_code(), error); + } + } + } + if (CollectionUtils.isNotEmpty(issuedTaskSet)) { + // 如果下发成功,就修改状态 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatus.ISSUED.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务下发成功!"); + updateWrapper.in(SchBaseTask::getTask_id, issuedTaskSet); + taskService.update(updateWrapper); + } + //失败的,更新每个不同失败的原因 + for (SchBaseTask r : failTaskList) { + LambdaUpdateWrapper failUpdateWrapper = new LambdaUpdateWrapper<>(); + failUpdateWrapper.set(SchBaseTask::getRemark, r.getRemark()); + failUpdateWrapper.eq(SchBaseTask::getTask_id, r.getTask_id()); + taskService.update(failUpdateWrapper); + } + } catch ( + Exception ex) { + log.error("AutoTask执行异常:", ex); + } finally { + if (isLock && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java index ddd902c..e03eed7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java @@ -3,11 +3,16 @@ 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.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; 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.enums.BaseDataEnum; 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; @@ -19,20 +24,33 @@ 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.IOSEnum; +import org.nl.wms.warehouse_management.service.IOutBillService; +import org.nl.wms.warehouse_management.service.dao.GroupPlate; +import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper; import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.math.BigDecimal; + /** * @Author: Liuxy - * @Description: 手持定点任务 + * @Description: 点位运输任务, 该任务完成,组盘信息默认整出 * @Date: 2025/6/6 */ @Component(value = "PdaPointTask") @TaskType("PdaPointTask") public class PdaPointTask extends AbstractTask { + @Resource + private IOutBillService outBillService; + /** + * 组盘记录mapper + */ + @Autowired + private MdPbGroupplateMapper mdPbGroupplateMapper; /** * 任务服务类 */ @@ -68,12 +86,14 @@ public class PdaPointTask extends AbstractTask { task.setVehicle_code(json.getString("vehicle_code")); task.setVehicle_type(json.getString("vehicle_type")); task.setRequest_param(json.toString()); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setAcs_trace_id(json.getString("acs_task_type")); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); taskService.save(task); - return task.getTask_id(); + return task.getTask_code(); } @Override @@ -131,10 +151,10 @@ public class PdaPointTask extends AbstractTask { if (ObjectUtil.isEmpty(taskObj)) { throw new BadRequestException("该任务不存在"); } - if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { - throw new BadRequestException("只能取消生成中的任务!"); - } - this.cancelTask(taskObj); + // if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { + // throw new BadRequestException("只能取消生成中的任务!"); + // } + this.cancelTask(taskObj); } @Override @@ -143,28 +163,21 @@ public class PdaPointTask extends AbstractTask { @Transactional public void finishTask(SchBaseTask taskObj) { + // 更新任务 + taskObj.setRemark("已完成"); + taskObj.setHandle_status(BaseDataEnum.IS_YES_NOT.code("是")); + taskService.updateById(taskObj); + //更新单据 + outBillService.taskFinish(taskObj); // 更新起点 iSchBasePointService.update(new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) - .set(SchBasePoint::getVehicle_code, null) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) - ); - iStructattrService.update( - new UpdateWrapper().lambda() - .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) - .set(Structattr::getStoragevehicle_code, null) - .set(Structattr::getTaskdtl_id, null) - .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) ); // 更新终点 - iSchBasePointService.update( - new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) - .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) - ); iStructattrService.update( new UpdateWrapper().lambda() .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) @@ -172,26 +185,40 @@ public class PdaPointTask extends AbstractTask { .set(Structattr::getTaskdtl_id, null) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) ); - // 更新任务 - taskObj.setRemark("已完成"); - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskService.updateById(taskObj); + } @Transactional public void cancelTask(SchBaseTask taskObj) { - iSchBasePointService.update(new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) - .set(SchBasePoint::getVehicle_code, null)); - iStructattrService.update(new UpdateWrapper().lambda() - .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) - .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + //更新起点 + // iSchBasePointService.update(new UpdateWrapper().lambda() + // .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + // .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + // .set(SchBasePoint::getVehicle_code, null)); + // iStructattrService.update(new UpdateWrapper().lambda() + // .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + // .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + // ); + //解冻 + GroupPlate plate = mdPbGroupplateMapper.selectOne( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, taskObj.getVehicle_code()) + .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) ); + if (ObjectUtils.isNotEmpty(plate)) { + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .eq(GroupPlate::getGroup_id, plate.getGroup_id())); + } // 更新终点 iSchBasePointService.update(new UpdateWrapper().lambda() .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getVehicle_code, null)); iStructattrService.update(new UpdateWrapper().lambda() .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java index 711052f..a92336c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; import org.nl.config.IdUtil; @@ -68,6 +69,8 @@ public class StOutTask extends AbstractTask { task.setVehicle_type(json.getString("vehicle_type")); task.setGroup_id(json.getString("group_id")); task.setRequest_param(json.toString()); + task.setHandle_status(json.getString("vehicle_type")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setAcs_trace_id(json.getString("acs_task_type")); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java index adc2988..922aca2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.SecurityUtils; @@ -78,6 +79,8 @@ public class VehicleInTask extends AbstractTask { task.setVehicle_type(json.getString("vehicle_type")); task.setRequest_param(json.toString()); task.setAcs_trace_id(json.getString("acs_task_type")); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java index b825c2c..42cdb00 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java @@ -5,9 +5,11 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; 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; @@ -69,12 +71,14 @@ public class VehicleOutTask extends AbstractTask { task.setTask_status(TaskStatus.CREATE.getCode()); task.setConfig_code(json.getString("task_type")); task.setPoint_code1(json.getString("point_code1")); - task.setPoint_code2(json.getString("PlacedLocation")); + task.setPoint_code2(json.getString("point_code2")); task.setVehicle_code(json.getString("vehicle_code")); task.setVehicle_type(json.getString("vehicle_type")); task.setGroup_id(json.getString("group_id")); task.setRequest_param(json.toString()); task.setAcs_trace_id(json.getString("acs_task_type")); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); @@ -155,7 +159,7 @@ public class VehicleOutTask extends AbstractTask { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setRemark("已完成"); - taskObj.setHandle_status("1"); + taskObj.setHandle_status(BaseDataEnum.IS_YES_NOT.code("是")); taskService.updateById(taskObj); outBillService.taskFinish(taskObj); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java index d40f1da..0d7c92b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java @@ -58,12 +58,27 @@ public class IOSConstant { public final static String MOVE_CONFIG_TASK = "MoveTask"; /** - * 余料回库任务类编码 + * 入库任务 + */ + public final static String ST_IN_TASK = "STInTask"; + + /** + * 出库任务 + */ + public final static String ST_OUT_TASK = "STOutTask"; + + /** + * 移库任务 + */ + public final static String MOVE_TASK = "MoveTask"; + + /** + * 余料回库 */ public final static String BACK_IN_TASK = "BackInTask"; /** - * 手持定点任务 + * 点位运输任务 */ public final static String PDA_POINT_TASK = "PdaPointTask"; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index b8f49b3..3abf856 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java @@ -38,7 +38,7 @@ public enum IOSEnum { // 锁类型 LOCK_TYPE(MapOf.of("未锁定", "0", "入库锁", "1", "出库锁", "2" - , "移入锁", "3", "移出锁", "4", "其他锁","9" + , "移入锁", "3", "移出锁", "4", "其他锁","99" )), // 点位状态 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java index fd6a40a..3d2417c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java @@ -9,7 +9,6 @@ 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.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -1213,7 +1212,7 @@ public class OutBillServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) public void taskFinish(SchBaseTask task) { - //解锁库位 + //更新起点 JSONObject finish_map = new JSONObject(); finish_map.put("struct_code", task.getPoint_code1()); finish_map.put("storagevehicle_code", null); @@ -1221,15 +1220,38 @@ public class OutBillServiceImpl extends ServiceImpl finish_map.put("inv_id", null); finish_map.put("inv_code", null); iStructattrService.updateStatusByCode("1", finish_map); - // 更新终点 - iSchBasePointService.update( - new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, task.getPoint_code2()) - .set(SchBasePoint::getVehicle_code, task.getVehicle_code()) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) - ); - if (StringUtils.isBlank(task.getHandle_status())) { + //更新终点 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + if (BaseDataEnum.IS_YES_NOT.code("是").equals(task.getIs_auto_confirm().toString())) { + //整出 + GroupPlate plate = mdPbGroupplateMapper.selectOne( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code()) + .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + ); + if (ObjectUtils.isNotEmpty(plate)) { + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + .set(GroupPlate::getQty, BigDecimal.ZERO) + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .eq(GroupPlate::getGroup_id, plate.getGroup_id())); + } + wrapper.set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("是")); + } else { + wrapper.set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")); + } + wrapper.eq(SchBasePoint::getPoint_code, task.getPoint_code2()) + .set(SchBasePoint::getVehicle_code, task.getVehicle_code()) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")); + iSchBasePointService.update(wrapper); + if (BaseDataEnum.IS_YES_NOT.code("是").equals(task.getHandle_status())) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java index 68bc408..f8ec345 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java @@ -142,6 +142,9 @@ public class UpdateIvtUtils { throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")) + ",请在WMS任务列表中检查!"); } MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, where.getString("vehicle_code"))); + if (mdPbStoragevehicleinfo == null) { + throw new BadRequestException("该载具不存在,请检查。"); + } String acsTaskType = StatusEnum.ACS_TASK_TYPE.getR(mdPbStoragevehicleinfo.getStoragevehicle_type()); where.put("acs_task_type", acsTaskType); where.put("vehicle_type", mdPbStoragevehicleinfo.getStoragevehicle_type()); diff --git a/nladmin-ui/.env.production b/nladmin-ui/.env.production index 4ce9728..16ca0e1 100644 --- a/nladmin-ui/.env.production +++ b/nladmin-ui/.env.production @@ -2,6 +2,7 @@ ENV = 'production' # 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置 # 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http -VUE_APP_BASE_API = 'http://localhost:8011' +VUE_APP_BASE_API = 'http://172.18.51.221:8011' # 如果接口是 http 形式, wss 需要改为 ws -VUE_APP_WS_API = 'ws://localhost:8011' +VUE_APP_WS_API = 'ws://172.18.51.221:8011' + diff --git a/nladmin-ui/src/views/wms/basedata/material/index.vue b/nladmin-ui/src/views/wms/basedata/material/index.vue index 8eafb68..b697509 100644 --- a/nladmin-ui/src/views/wms/basedata/material/index.vue +++ b/nladmin-ui/src/views/wms/basedata/material/index.vue @@ -16,7 +16,7 @@ /> - + @@ -31,16 +31,16 @@ - - 导入 - + + + + + + + + + + - + - + 规 格 - + @@ -73,37 +73,37 @@ 型 号 - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - - - - - - + + + + + + + + - - + + - + @@ -195,7 +195,7 @@ const defaultForm = { is_used_time: null, is_used: null, is_delete: null, - ext_id: null, + ext_id: 'YZHJ', material_height_type: null, product_series: null } @@ -229,9 +229,9 @@ export default { material_id: [ { required: true, message: '不能为空', trigger: 'blur' } ], - material_code: [ - { required: true, message: '物料编码不能为空', trigger: 'blur' } - ], + // material_code: [ + // { required: true, message: '物料编码不能为空', trigger: 'blur' } + // ], material_name: [ { required: true, message: '物料名称不能为空', trigger: 'blur' } ], diff --git a/nladmin-ui/src/views/wms/sch/point/index.vue b/nladmin-ui/src/views/wms/sch/point/index.vue index 1225a0e..5f97c1c 100644 --- a/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/nladmin-ui/src/views/wms/sch/point/index.vue @@ -225,6 +225,12 @@ /> + + + + + + @@ -243,9 +249,6 @@ - - - - + + + + + - - - {{ dict.label.vehicle_type[scope.row.vehicle_type] }} - - + + + + + + + + + - - - - {{ scope.row.ing_task_code ? '是' : '否' }} - - - - - - - - + + + + + @@ -403,23 +371,58 @@ {{ scope.row.is_has_workder ? '是' : '否' }} - - - {{ scope.row.is_auto ? '是' : '否' }} - - + + + + + + + + + + + + + + + + + + + + + + + {{ scope.row.is_used ? '是' : '否' }} - - + + + + + + + + + + + { this.regionList = res + // 如果 regionList 中包含 YZHJ01,则设置默认值 + if (this.regionList.some(r => r.region_code === 'YZHJ01')) { + this.query.region_code = 'YZHJ01' + this.getPointStatusAndTypeList('YZHJ01', 1) // 可选:如果你希望自动触发 change 逻辑 + } }) }, getPointStatusAndTypeList(id, flag) { diff --git a/nladmin-ui/src/views/wms/statement/structivt/index.vue b/nladmin-ui/src/views/wms/statement/structivt/index.vue index dee4b85..9855eec 100644 --- a/nladmin-ui/src/views/wms/statement/structivt/index.vue +++ b/nladmin-ui/src/views/wms/statement/structivt/index.vue @@ -57,19 +57,19 @@ - + 库存导入 + + + + + {{ dict.label.d_lock_type[scope.row.lock_type] }} + + @@ -107,10 +112,12 @@ import pagination from '@crud/Pagination' import crudSectattr from '@/views/wms/basedata/sectattr/sectattr' import { download } from '@/api/data' import { downloadFile } from '@/utils' +import UploadDialog from '@/views/wms/basedata/material/UploadDialog.vue' export default { name: 'Structivt', - components: { pagination, crudOperation, rrOperation }, + dicts: ['d_lock_type'], + components: { UploadDialog, pagination, crudOperation, rrOperation }, mixins: [presenter(), header(), crud()], cruds() { return CRUD({ @@ -128,6 +135,7 @@ export default { }, data() { return { + uploadShow: false, sects: [], permission: {}, rules: {}
* 手持IOS 服务类 @@ -46,6 +51,14 @@ public interface PdaIosOutService { PdaResponse getVehicleMaterial(JSONObject whereJson); + /** + * 获取预装区可用放空空位 + * + * @return PdaResponse + */ + List getReturnPoint(JSONObject whereJson); + + /** * 产线叫料点确认 * @@ -82,7 +95,12 @@ public interface PdaIosOutService { */ PdaResponse bindOrUnbind(JSONObject whereJson); - + /** + * 查询物料列表 + * + * @return PdaResponse + */ + TableDataInfo getMaterialList(JSONObject whereJson); /** * 载具出库确认 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java index 554a1b6..d8078ea 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.pda.ios_manage.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -10,6 +11,7 @@ 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.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; @@ -17,10 +19,13 @@ import org.nl.common.domain.vo.SelectItemVo; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; +import org.nl.config.SpringContextHolder; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.*; -import org.nl.wms.basedata_manage.service.dto.MaterialQuery; +import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper; import org.nl.wms.pda.ios_manage.service.PdaIosInService; +import org.nl.wms.pda.ios_manage.service.PdaIosOutService; import org.nl.wms.pda.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.service.ISchBasePointService; @@ -28,7 +33,6 @@ import org.nl.wms.sch_manage.service.ISchBaseRegionService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseRegion; import org.nl.wms.sch_manage.service.util.AbstractTask; -import org.nl.wms.sch_manage.service.util.tasks.BackInTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; import org.nl.wms.warehouse_management.service.IMdPbGroupplateService; @@ -46,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -74,11 +79,18 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IMdPbGroupplateService iMdPbGroupplateService; + /** + * 基础物料服务 + */ + @Autowired + private MdMeMaterialbaseMapper mdMeMaterialbaseMapper; + /** * 基础物料服务 */ @Autowired private IMdMeMaterialbaseService iMdMeMaterialbaseService; + @Resource private IStructattrService iStructattrService; /** @@ -93,6 +105,13 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; + /** + * 手持出库服务 + */ + @Autowired + private PdaIosOutService pdaIosOutService; + + /** * 库区服务 */ @@ -121,11 +140,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { */ @Autowired private IRawAssistIStorService iRawAssistIStorService; - /** - * 回库任务类 - */ - @Autowired - private BackInTask backInTask; + /** * 入库明细服务 */ @@ -140,12 +155,11 @@ public class PdaIosInServiceImpl implements PdaIosInService { private ISchBaseRegionService iSchBaseRegionService; + @Transactional @Override public JSONObject groupPlate(JSONObject whereJson) { // 物料编码 String materialId = whereJson.getString("material_id"); - //批次 - String pcsn = whereJson.getString("pcsn"); // 数量 String qty = whereJson.getString("qty"); MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("vehicle_code")); @@ -157,15 +171,14 @@ public class PdaIosInServiceImpl implements PdaIosInService { } whereJson.put("material_id", materDao.getMaterial_id()); whereJson.put("material_code", materDao.getMaterial_code()); + //批次 + String pcsn = StringUtils.isBlank(whereJson.getString("pcsn")) ? org.nl.common.utils.DateUtil.getDateTimeFormatyMd() : whereJson.getString("pcsn"); //判断该载具是否存在组盘信息 - long statusCount = iMdPbGroupplateService.count( + List groupPlateList = iMdPbGroupplateService.list( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, vehicleDao.getStoragevehicle_code()) - .lt(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("出库")) + .lt(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("入库")) ); - if (statusCount > 0) { - throw new BadRequestException("载具编码:" + vehicleDao.getStoragevehicle_code() + "已存在组盘信息,请对数据进行核实!"); - } //判断该载具编号是否已经存在库内 long count = iStructattrService.count( new LambdaQueryWrapper() @@ -174,6 +187,17 @@ public class PdaIosInServiceImpl implements PdaIosInService { if (count > 0) { throw new BadRequestException("载具编码:" + vehicleDao.getStoragevehicle_code() + "已存在库内,请对数据进行核实!"); } + if (ObjectUtils.isNotEmpty(groupPlateList)) { + //出库重新组盘 + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + .set(GroupPlate::getQty, BigDecimal.ZERO) + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .in(GroupPlate::getGroup_id, groupPlateList.stream().map(GroupPlate::getGroup_id).collect(Collectors.toSet()))); + } GroupPlate groupDao = GroupPlate.builder() .group_id(IdUtil.getStringId()) .material_id(materDao.getMaterial_id()) @@ -182,13 +206,20 @@ public class PdaIosInServiceImpl implements PdaIosInService { .qty_unit_id(unitDao.getMeasure_unit_id()) .qty_unit_name(unitDao.getUnit_name()) .qty(new BigDecimal(qty)) - .status(GROUP_PLATE_STATUS.code("组盘")) + .status(StringUtils.isBlank(whereJson.getString("groupStatus")) ? GROUP_PLATE_STATUS.code("组盘") : whereJson.getString("groupStatus")) .ext_code(whereJson.getString("ext_code")) .create_id(SecurityUtils.getCurrentUserId()) .create_name(SecurityUtils.getCurrentNickName()) .create_time(DateUtil.now()) + .remark(StringUtils.isBlank(whereJson.getString("remark")) ? "" : whereJson.getString("remark")) .build(); iMdPbGroupplateService.save(groupDao); + if (StringUtils.isNotBlank(whereJson.getString("siteCode"))) { + whereJson.put("shelfCode", whereJson.getString("vehicle_code")); + whereJson.put("mode", IOSEnum.BIND_OR_UNBIND.code("绑定")); + //确定点位则绑定 + pdaIosOutService.bindOrUnbind(whereJson); + } return whereJson; } @@ -220,11 +251,21 @@ public class PdaIosInServiceImpl implements PdaIosInService { PageQuery pageQuery = new PageQuery(); pageQuery.setPage(whereJson.getInteger("page") - 1); pageQuery.setSize(whereJson.getInteger("size")); - MaterialQuery materialQuery = new MaterialQuery(); - if (StringUtils.isNotBlank(whereJson.getString("search"))) { - materialQuery.setSearch(whereJson.getString("search").trim().toUpperCase()); + // 查询条件 + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + String search = MapUtil.getStr(whereJson, "search"); + if (ObjectUtil.isNotEmpty(search)) { + queryWrapper.likeRight(MdMeMaterialbase::getMaterial_code, search) + .or(item -> item.likeRight(MdMeMaterialbase::getMaterial_name, search)); } - Page mapPage = iMdMeMaterialbaseService.pageMaps(pageQuery.build(), materialQuery.build()); + String regionCode = MapUtil.getStr(whereJson, "region"); + if (ObjectUtil.isNotEmpty(regionCode)) { + queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + } + queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); + Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), + queryWrapper + ); return PdaResponse.build(mapPage); } @@ -306,10 +347,10 @@ public class PdaIosInServiceImpl implements PdaIosInService { whereJson.put("site_code",schBasePoint.getPoint_code()); whereJson.put("config_code", IOSConstant.BACK_IN_TASK); whereJson.put("vehicle_code", whereJson.getString("storagevehicle_code")); - whereJson.put("stor_id", sectDao.getStor_id()); + whereJson.put("stor_code", sectDao.getStor_code()); whereJson.put("sect_code", sectDao.getSect_code()); //入库分配 - divStructNoBills(whereJson); + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); return PdaResponse.requestOk(); } @@ -324,15 +365,18 @@ public class PdaIosInServiceImpl implements PdaIosInService { * pcsn 批次 * site_code 所在点位 * config_code 任务配置类型 + * is_auto_confirm 是否自动出库确认 */ - private void divStructNoBills(JSONObject whereJson) { + @Override + @Transactional + public void divStructNoBills(JSONObject whereJson) { //校验载具 MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("storagevehicle_code")); if (ObjectUtil.isEmpty(vehicleDao)) { throw new BadRequestException("不存在该载具号信息,请检查"); } //校验仓库 - BsrealStorattr storeDao = iSrealStorattrService.getById(whereJson.getString("stor_id")); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(whereJson.getString("stor_code")); if (ObjectUtil.isEmpty(storeDao)) { throw new BadRequestException("该库区未找到对应仓库信息,请检查"); } @@ -354,12 +398,14 @@ public class PdaIosInServiceImpl implements PdaIosInService { whereJson.put("point_code1", schBasePoint.getPoint_code()); //确定终点 whereJson.put("point_code2", attrDao.getStruct_code()); + whereJson.put("handle_status", BaseDataEnum.IS_YES_NOT.code("否")); //创建任务 String taskId = applyTaskMap.get(whereJson.getString("config_code")).create(whereJson); // 更新起点绑定id iSchBasePointService.update( new UpdateWrapper().lambda() .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) ); // 更新终点锁定状态 @@ -378,7 +424,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Transactional public PdaResponse confirmIn(JSONObject whereJson) { Sectattr sectDao = updateIvtUtils.checkVehicleType(whereJson.getString("sect_id"),whereJson.getString("vehicle_code")); - whereJson.put("stor_id", sectDao.getStor_id()); + whereJson.put("stor_code", sectDao.getStor_code()); whereJson.put("sect_code", sectDao.getSect_code()); //物料组盘入库 if (StringUtils.isBlank(whereJson.getString("is_empty_vehicle"))) { @@ -392,14 +438,31 @@ public class PdaIosInServiceImpl implements PdaIosInService { // 预组织出入库单据实体 Map jsonMst = organizeInsertData(whereJson); // 调用服务新增出入库单 - String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst); + String iostorinvId = iRawAssistIStorService.insertDtl(jsonMst); // 预组织出入库单据明细的分配数据 - whereJson.put("iostorinv_id", iostorinv_id); + whereJson.put("iostorinv_id", iostorinvId); Map jsonDtl = organizeDivData(whereJson); // 调用分配,默认自动分配库位 iRawAssistIStorService.divStruct(new JSONObject(jsonDtl)); // 下发任务 - sendTask(whereJson); + Map taskJson = new HashMap<>(); + taskJson.put("point_code", whereJson.getString("point_code")); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + ArrayList tableMater = new ArrayList<>(); + disDtl.forEach(item -> { + tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + taskJson.put("tableMater", tableMater); + iRawAssistIStorService.divPoint(taskJson); //更新组盘表状态 mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper() .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")) @@ -408,16 +471,15 @@ public class PdaIosInServiceImpl implements PdaIosInService { } else { //空载具入库 whereJson.put("qty", 1); - whereJson.put("pcsn", whereJson.getString("material_id")); String materialCode = "1".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空托盘") : "2".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空料箱") : StatusEnum.VEHICLE_TYPE.code("空货架"); whereJson.put("material_id", materialCode); //组盘 - groupPlate(whereJson); - // 生成空载具入库任务 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); + //生成空载具入库任务 whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); whereJson.put("storagevehicle_code", whereJson.getString("vehicle_code")); //入库分配 - divStructNoBills(whereJson); + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); } return PdaResponse.requestOk(); } @@ -489,13 +551,13 @@ public class PdaIosInServiceImpl implements PdaIosInService { // 查询库区 Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id")); // 查询仓库 - BsrealStorattr storeDao = iSrealStorattrService.getById(sectDao.getStor_id()); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(sectDao.getStor_code()); // 组织主数据 Map jsonMst = new HashMap<>(); jsonMst.put("checked", true); jsonMst.put("sect_id", sectDao.getSect_id()); - jsonMst.put("stor_id", sectDao.getStor_id()); jsonMst.put("sect_code", sectDao.getSect_code()); + jsonMst.put("stor_id", storeDao.getStor_id()); jsonMst.put("stor_code", storeDao.getStor_code()); // 组织明细数据 IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( @@ -516,37 +578,6 @@ public class PdaIosInServiceImpl implements PdaIosInService { return jsonMst; } - /** - * 下发任务 - * @param whereJson { - * storagevehicle_code:载具编码 - * point_code:点位编码 - * sect_code:库区 - * iostorinv_id: id - * } - */ - private void sendTask(JSONObject whereJson) { - // 组织主数据 - Map jsonMst = new HashMap<>(); - jsonMst.put("point_code", whereJson.getString("point_code")); - // 组织明细数据 - IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( - new QueryWrapper().lambda() - .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) - ); - // 查找分配明细 - Map map = new HashMap<>(); - map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id()); - List disDtl = iRawAssistIStorService.getDisDtl(map); - // 类型转换 - ArrayList tableMater = new ArrayList<>(); - disDtl.forEach(item -> { - tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); - }); - jsonMst.put("tableMater", tableMater); - - iRawAssistIStorService.divPoint(jsonMst); - } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java index 9f06f46..248a640 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java @@ -1,14 +1,20 @@ package org.nl.wms.pda.ios_manage.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; 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.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.domain.vo.SelectItemVo; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; @@ -16,24 +22,24 @@ import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; 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.IMdMeMaterialbaseService; -import org.nl.wms.basedata_manage.service.ISectattrService; -import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.*; +import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; +import org.nl.wms.pda.ios_manage.service.PdaIosInService; import org.nl.wms.pda.ios_manage.service.PdaIosOutService; import org.nl.wms.pda.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.util.AbstractTask; -import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask; import org.nl.wms.sch_manage.service.util.tasks.StOutTask; import org.nl.wms.warehouse_management.enums.IOSConstant; import org.nl.wms.warehouse_management.enums.IOSEnum; -import org.nl.wms.warehouse_management.service.IRawAssistIStorService; import org.nl.wms.warehouse_management.service.dao.GroupPlate; import org.nl.wms.warehouse_management.service.dao.IOStorInv; import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; @@ -42,17 +48,13 @@ import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvMapper; import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper; -import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -79,7 +81,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private ISectattrService iSectattrService; - + /** + * 基础物料服务 + */ + @Autowired + private MdMeMaterialbaseMapper mdMeMaterialbaseMapper; /** * 出入库单主表 */ @@ -90,7 +96,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private IBsrealStorattrService iSrealStorattrService; - + /** + * 载具服务 + */ + @Autowired + private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; /** * 基础物料服务 */ @@ -101,6 +111,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper; + /* + * 任务服务 + */ + @Autowired + private ISchBaseTaskService iSchBaseTaskService; /** * 点位服务 @@ -127,29 +142,10 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { private IOStorInvDisMapper ioStorInvDisMapper; /** - * 更新库存服务 + * 入库服务 */ @Autowired - private UpdateIvtUtils updateIvtUtils; - - /** - * 出库任务类 - */ - @Autowired - private StOutTask stOutTask; - - /** - * 手持任务 - */ - @Autowired - private PdaPointTask pdaPointTask; - - - /** - * 入库服务服务 - */ - @Autowired - private IRawAssistIStorService iRawAssistIStorService; + private PdaIosInService pdaIosInServiceImpl; @Override @@ -173,8 +169,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { MapOf.of("search", whereJson.getString("search"), "region_code", whereJson.getString("region_code"), "status", GROUP_PLATE_STATUS.code("入库"), - "is_has_workder", "false", - "order_by", "gro.create_time asc")); + "pointStatus", "1")); + } + //显示所有货架的点位 + if (StringUtils.isBlank(whereJson.getString("search"))) { + list = list.stream() + .collect(Collectors.groupingBy(StructattrVechielDto::getStruct_code)) + .values() + .stream() + .map(r -> r.stream() + .filter(f -> !StatusEnum.VEHICLE_TYPE.code("空货架").equals(f.getMaterial_code())) + .findFirst() + .orElse(r.get(0))) + .sorted(Comparator.comparing(StructattrVechielDto::getStruct_code)) + .collect(Collectors.toList()); + } else { + //只显示库存 + list = list.stream().filter(f -> !StatusEnum.VEHICLE_TYPE.code("空货架").equals(f.getMaterial_code())) + .sorted(Comparator.comparing(StructattrVechielDto::getStruct_code)) + .collect(Collectors.toList()); } return PdaResponse.requestParamOk(list); } @@ -197,6 +210,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { } + @Override + public List getReturnPoint(JSONObject whereJson) { + List selectList = new ArrayList<>(); + List cxPointLists = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + cxPointLists = cxPointLists.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(cxPointLists)) { + throw new BadRequestException("暂无可用放置空架的点位,请稍后再试。"); + } + cxPointLists.forEach(r -> + selectList.add(SelectItemVo.builder().text(r.getPoint_name()).value(r.getPoint_code()).build()) + ); + return selectList; + } + + @Override @Transactional public PdaResponse materialConfirm(JSONObject whereJson) { @@ -223,13 +255,15 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { iStructattrService.updateStatusByCode("0", lock_map); //创建任务 JSONObject taskForm = new JSONObject(); - taskForm.put("task_type", "STOutTask"); + taskForm.put("task_type", IOSConstant.ST_OUT_TASK); + taskForm.put("config_code", IOSConstant.ST_OUT_TASK); taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); taskForm.put("point_code1", json.getString("struct_code")); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", json.getString("storagevehicle_code")); - StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); - String taskId = stOutTask.create(taskForm); + taskForm.put("is_auto_confirm",(BaseDataEnum.IS_YES_NOT.code("是"))); + taskForm.put("handle_status",(BaseDataEnum.IS_YES_NOT.code("是"))); + String taskId = applyTaskMap.get(IOSConstant.ST_OUT_TASK).create(whereJson); //更新任务id ioStorInvDisMapper.update(new IOStorInvDis(), new LambdaUpdateWrapper() .set(IOStorInvDis::getTask_id, taskId) @@ -251,6 +285,9 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { if (ObjectUtil.isEmpty(schBasePoint)) { throw new BadRequestException("未找到目标:" + whereJson.getString("siteCode") + "的点位信息,请检查"); } + if (StringUtils.isNotBlank(schBasePoint.getVehicle_code()) || IOSEnum.POINT_STATUS.code("有货").equals(schBasePoint.getPoint_status())) { + throw new BadRequestException("该点位有货架在2分钟之后进行出库确认,请稍等"); + } //锁定货位 // JSONObject lock_map = new JSONObject(); // lock_map.put("struct_code", json.getString("struct_code")); @@ -264,8 +301,8 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { taskForm.put("point_code1", json.getString("struct_code")); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", json.getString("storagevehicle_code")); - PdaPointTask pdaPointTask = SpringContextHolder.getBean("PdaPointTask"); - pdaPointTask.create(taskForm); + taskForm.put("is_auto_confirm",(BaseDataEnum.IS_YES_NOT.code("是"))); + String taskCode = applyTaskMap.get(IOSConstant.PDA_POINT_TASK).create(taskForm); GroupPlate plateDao = mdPbGroupplateMapper.selectOne( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, json.getString("storagevehicle_code")).eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))); @@ -274,6 +311,10 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { .set(GroupPlate::getFrozen_qty, plateDao.getQty()) .eq(GroupPlate::getGroup_id, json.getString("group_id")) ); + //更新任务标识 + iSchBasePointService.update(new UpdateWrapper().lambda() + .eq(SchBasePoint::getPoint_code, whereJson.getString("siteCode")) + .set(SchBasePoint::getIng_task_code, taskCode)); return PdaResponse.requestOk(); } @@ -306,7 +347,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { if (ObjectUtil.isEmpty(sectattr)) { throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!"); } - BsrealStorattr storeDao = iSrealStorattrService.getById(sectattr.getStor_id()); + BsrealStorattr storeDao = iSrealStorattrService.findByCode(sectattr.getStor_code()); whereJson.put("stor_code", storeDao.getStor_code()); whereJson.put("sect_code", sectattr.getSect_code()); StrategyStructParam strategyStructParam = StrategyStructParam.builder() @@ -330,6 +371,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { taskForm.put("point_code1", r.getStruct_code()); taskForm.put("point_code2", whereJson.getString("siteCode")); taskForm.put("vehicle_code", r.getStoragevehicle_code()); + taskForm.put("handle_status", BaseDataEnum.IS_YES_NOT.code("否")); applyTaskMap.get(IOSConstant.VEHICLE_OUT_TASK).create(taskForm); }); //更新组盘记录表 @@ -431,36 +473,90 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { return disId; } + + @Override + public TableDataInfo getMaterialList(JSONObject whereJson) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPage(whereJson.getInteger("page") - 1); + pageQuery.setSize(100); + whereJson.put("region", "YZHJ"); + // 查询条件 + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + String search = MapUtil.getStr(whereJson, "search"); + if (ObjectUtil.isNotEmpty(search)) { + queryWrapper.likeRight(MdMeMaterialbase::getMaterial_code, search) + .or(item -> item.likeRight(MdMeMaterialbase::getMaterial_name, search)); + } + String regionCode = MapUtil.getStr(whereJson, "region"); + if (ObjectUtil.isNotEmpty(regionCode)) { + queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + } + queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); + Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), + queryWrapper + ); + return PdaResponse.build(mapPage); + } + + @Override @Transactional(rollbackFor = Exception.class) public PdaResponse bindOrUnbind(JSONObject whereJson) { String siteCode = whereJson.getString("siteCode"); String shelfCode = whereJson.getString("shelfCode"); String mode = whereJson.getString("mode"); - // 校验站点是否存在、是否可用 - SchBasePoint sitePoint = iSchBasePointService.getOne( - new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, siteCode) - .eq(SchBasePoint::getIs_used, true) - ); - if (sitePoint == null) { - throw new BadRequestException("输入的站点编号有误或被禁用,请检查!"); - } - //校验站点是否有在途输送任务 - List activeTasks = iSchBasePointService.checkEndPointTask( - null, null, StatusEnum.SORT_TYPE.code("升序"), null, siteCode, null, false - ); - if (CollectionUtils.isNotEmpty(activeTasks)) { - throw new BadRequestException("该货架正在执行输送任务,状态为锁定,请等任务完成再做绑定或解绑!"); + SchBasePoint sitePoint; + if (IOSEnum.BIND_OR_UNBIND.code("绑定").equals(mode)) { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, siteCode) + .eq(SchBasePoint::getIs_used, true) + ); + if (sitePoint == null) { + throw new BadRequestException("输入的站点编号有误或被禁用,请检查!"); + } + Set pointIds = new HashSet<>(); + pointIds.add(siteCode); + //校验是否有任务 + List activeTasks = iSchBaseTaskService.getTaskList(null, pointIds, null, null); + if (CollectionUtils.isNotEmpty(activeTasks)) { + throw new BadRequestException("检查到运输到这个点位的任务,任务号为:" + activeTasks.get(0).getTask_code() + + ",起点为:" + activeTasks.get(0).getPoint_code1() + ",终点为:" + activeTasks.get(0).getPoint_code2() + + ",载具号为:" + activeTasks.get(0).getVehicle_code() + ",请稍后操作,或在WMS任务列表中检查。"); + } + } else { + if (StringUtils.isNotBlank(shelfCode)) { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, shelfCode) + .eq(SchBasePoint::getIs_used, true) + ); + if (sitePoint == null) { + //无需解绑 + return PdaResponse.requestOk(); + } + siteCode = sitePoint.getPoint_code(); + } else { + // 校验站点是否存在、是否可用 + sitePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, siteCode) + .eq(SchBasePoint::getIs_used, true) + ); + } } LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); if (IOSEnum.BIND_OR_UNBIND.code("绑定").equals(mode)) { - doBind(sitePoint, siteCode, shelfCode, wrapper); + checkGroupPlateStatus(shelfCode, sitePoint.getRegion_code()); + doBind(siteCode, shelfCode, wrapper); } else { doUnbind(sitePoint, siteCode, wrapper); } wrapper.set(SchBasePoint::getUpdate_time, DateUtil.now()) .set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")) + .set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()); iSchBasePointService.update(wrapper); return PdaResponse.requestOk(); @@ -469,23 +565,19 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 绑定 */ - private void doBind(SchBasePoint sitePoint, String siteCode, String shelfCode, LambdaUpdateWrapper wrapper) { - // 校验站点是否已绑定 - if (StringUtils.isNotBlank(sitePoint.getVehicle_code())) { - if (sitePoint.getVehicle_code().equals(shelfCode)) { - checkGroupPlateStatus(shelfCode); - return; - } - throw new BadRequestException("当前站点已绑定货架:" + sitePoint.getVehicle_code() + ",请先解绑!"); - } - // 校验货架是否已绑定在其他站点 + private void doBind(String siteCode, String shelfCode, LambdaUpdateWrapper wrapper) { SchBasePoint boundPoint = iSchBasePointService.getOne( new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, shelfCode) ); if (boundPoint != null) { - throw new BadRequestException("当前货架:" + shelfCode + "已绑定在站点:" + boundPoint.getPoint_code() + ",请先解绑。"); + //解绑 + LambdaUpdateWrapper wrapper1 = new LambdaUpdateWrapper<>(); + wrapper1.eq(SchBasePoint::getPoint_code, boundPoint.getPoint_code()) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")); + iSchBasePointService.update(wrapper1); + //throw new BadRequestException("当前货架:" + shelfCode + "已绑定在站点:" + boundPoint.getPoint_code() + ",请扫描站点:" + boundPoint.getPoint_code() + "进行解绑,再绑定。"); } - checkGroupPlateStatus(shelfCode); wrapper.eq(SchBasePoint::getPoint_code, siteCode) .set(SchBasePoint::getVehicle_code, shelfCode) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")); @@ -494,17 +586,21 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 校验组盘状态 */ - private void checkGroupPlateStatus(String shelfCode) { + private void checkGroupPlateStatus(String shelfCode, String regionCode) { List plates = mdPbGroupplateMapper.selectList( new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, shelfCode) .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) ); if (CollectionUtils.isNotEmpty(plates)) { + LambdaUpdateWrapper update = new LambdaUpdateWrapper<>(); Set plateCodes = plates.stream().map(GroupPlate::getGroup_id).collect(Collectors.toSet()); - mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() - .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) - .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO).in(GroupPlate::getGroup_id, plateCodes)); + if (!regionCode.equals(StatusEnum.REGION_INFO.code("商用线5号线"))) { + update.set(GroupPlate::getFrozen_qty, BigDecimal.ZERO); + } + update.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + .in(GroupPlate::getGroup_id, plateCodes); + mdPbGroupplateMapper.update(null, update); } } @@ -534,18 +630,88 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { /** * 1.库存载具绑定到出库点位 * 2.更新组盘记录为出库 + * 3.type="1",出库确认;type="2",强制确认。 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public PdaResponse outStorageConfirm(JSONObject whereJson) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); + //任务校验 + SchBaseTask task = iSchBaseTaskService.getOne(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, whereJson.getString("storagevehicle_code")).lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())); + if (ObjectUtil.isNotEmpty(task)) { + throw new BadRequestException("该货架:" + whereJson.getString("storagevehicle_code") + "的运输任务,任务号为:" + task.getTask_code() + ",尚未完成,请等待任务完成,再取货确认。"); + } //获取终点 SchBasePoint pointDao = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code"))); if (ObjectUtil.isEmpty(pointDao)) { throw new BadRequestException("未找到载具所在的点位信息,请检查"); } + //预装区与商用5号线点位需自动回空 + if (pointDao.getRegion_code().equals(StatusEnum.REGION_INFO.code("商用线5号线"))) { + //物料组盘信息出库 + whereJson.put("type", "2"); + //处理组盘信息 + handleGroupPlate(whereJson); + if (StringUtils.isNotBlank(pointDao.getIng_task_code())) { + SchBaseTask schBaseTask = iSchBaseTaskService.getByCode(pointDao.getIng_task_code()); + SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, schBaseTask.getPoint_code1())); + if (schBasePoint.getRegion_code().equals(StatusEnum.REGION_INFO.code("预装线货架区")) && StringUtils.isNotBlank(whereJson.getString("isAutoReturn"))) { + String pointCode1 = whereJson.getString("startCode"); + String pointCode2 = whereJson.getString("siteCode"); + //自动获取终点回空载具 + if (BaseDataEnum.IS_YES_NOT.code("是").equals(whereJson.getString("isAutoReturn"))) { + if (StringUtils.isBlank(pointCode1)) { + SchBasePoint startPoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code")) + ); + pointCode1 = startPoint.getPoint_code(); + } + List cxPointLists = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + cxPointLists = cxPointLists.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(cxPointLists)) { + throw new BadRequestException("暂无可用放置空架的点位,请稍后再试。"); + } + pointCode2 = cxPointLists.get(0).getPoint_code(); + } + whereJson.put("pointCode", pointCode1); + whereJson.put("siteCode", pointCode2); + //生成任务 + SpringContextHolder.getBean(PdaIosOutServiceImpl.class).transferConfirm(whereJson); + } else { + //线边仓 + whereJson.put("qty", 1); + String materialCode = StatusEnum.VEHICLE_TYPE.code("空货架"); + whereJson.put("material_id", materialCode); + //组盘 + pdaIosInServiceImpl.groupPlate(whereJson); + // 生成空载具入库任务 + whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); + whereJson.put("storagevehicle_code", whereJson.getString("storagevehicle_code")); + //入库分配 + pdaIosInServiceImpl.divStructNoBills(whereJson); + } + } + } else { + handleGroupPlate(whereJson); + //载具绑定到出库点 + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code")) + .set(SchBasePoint::getIos_id, BaseDataEnum.IS_YES_NOT.code("是")) + .eq(SchBasePoint::getPoint_code, pointDao.getPoint_code()) + ); + } + return PdaResponse.requestOk(); + } + + + private void handleGroupPlate(JSONObject whereJson) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); GroupPlate groupPlate = mdPbGroupplateMapper.selectById(whereJson.getString("group_id")); if (ObjectUtil.isEmpty(groupPlate)) { throw new BadRequestException("未找到该载具的组盘信息,请检查"); @@ -573,52 +739,133 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { .eq(GroupPlate::getGroup_id, whereJson.getString("group_id")); //更新组盘记录表 mdPbGroupplateMapper.update(new GroupPlate(), updateWrapper); - //库存绑定到出库点 - iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) - .set(SchBasePoint::getVehicle_code, groupPlate.getStoragevehicle_code()) - .set(SchBasePoint::getIos_id, BaseDataEnum.IS_YES_NOT.code("是")) - .eq(SchBasePoint::getPoint_code, pointDao.getPoint_code()) - ); - return PdaResponse.requestOk(); } + /** + * 目标站点或区域传值二选一 + * 载具编号:"storagevehicle_code":"T0002", + * 点位编号:"siteCode":"", + * 区域编号:"region_code":"IN01" + */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public PdaResponse transferConfirm(JSONObject whereJson) { - if (StringUtils.isBlank(whereJson.getString("region_code")) && StringUtils.isBlank(whereJson.getString("siteCode"))) { + String regionCode = whereJson.getString("region_code"); + //起点 + String pointCode1 = whereJson.getString("pointCode"); + //终点 + String pointCode2 = whereJson.getString("siteCode"); + String vehicleCode = whereJson.getString("storagevehicle_code"); + if (StringUtils.isBlank(regionCode) && StringUtils.isBlank(pointCode2)) { throw new BadRequestException("请选择目标站点或区域!"); } - String pointCode = whereJson.getString("siteCode"); - if (StringUtils.isBlank(pointCode)) { - List pointList = iSchBasePointService.list(new LambdaQueryWrapper() - .eq(SchBasePoint::getRegion_code, whereJson.getString("region_code")) - .eq(SchBasePoint::getIs_used, 1) - .isNull(SchBasePoint::getVehicle_code) - .orderByAsc(SchBasePoint::getIn_order_seq)); - if (CollectionUtils.isEmpty(pointList)) { - throw new BadRequestException("该区域无可用空余点位!"); - } - pointCode = pointList.get(0).getPoint_code(); + //校验载具 + MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(vehicleCode); + if (ObjectUtil.isEmpty(vehicleDao)) { + throw new BadRequestException("不存在该载具号信息,请检查"); } - //确定起点 - SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code"))); - if (ObjectUtil.isEmpty(schBasePoint)) { - throw new BadRequestException("未找到载具所在的点位信息,请检查"); + if (StringUtils.isNotBlank(pointCode2)) { + SchBasePoint schBasePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, pointCode2).eq(SchBasePoint::getIs_used, true) + ); + if (schBasePoint == null) { + throw new BadRequestException("输入终点点位有误或被禁用,请检查是否手动输入输错。"); + } + } + // 确定起点 + String startPointCode; + SchBasePoint schBasePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, vehicleCode) + ); + if (StringUtils.isBlank(pointCode1)) { + if (ObjectUtil.isEmpty(schBasePoint)) { + throw new BadRequestException("未找到载具所在的点位信息,请检查"); + } + startPointCode = schBasePoint.getPoint_code(); + } else { + + SchBasePoint point = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, pointCode1).eq(SchBasePoint::getIs_used, true)); + if (point == null) { + throw new BadRequestException("起点点位:" + pointCode1 + "不存在,请检查。"); + } + //自动解绑/绑定 + if (schBasePoint != null) { + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) + ); + } + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, vehicleCode) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) + .eq(SchBasePoint::getPoint_code, pointCode1) + ); + startPointCode = pointCode1; + } + // 确定终点 + String endPointCode = pointCode2; + if (StringUtils.isBlank(endPointCode)) { + List pointList; + //特殊分配规则 + if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区"))) { + pointList = iSchBasePointService.checkEndPointTask( + StatusEnum.REGION_INFO.code("预装线货架区"), + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false); + //可放空料架位置 + pointList = pointList.stream().filter(r -> (StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(pointList)) { + //入线边仓 + whereJson.put("stor_code",StatusEnum.STORE_INFO.code("料架线边库")); + whereJson.put("sect_code","XB01"); + whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); + whereJson.put("qty", 1); + whereJson.put("site_code",startPointCode); + whereJson.put("vehicle_code",vehicleCode); + whereJson.put("is_auto_confirm",startPointCode); + //组盘 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); + //生成空载具入库任务 + whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); + //入库分配 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); + return PdaResponse.requestOk(); + } + } else { + pointList = iSchBasePointService.checkEndPointTask( + regionCode, + IOSEnum.LOCK_TYPE.code("未锁定"), + StatusEnum.SORT_TYPE.code("升序"), + null, null, "true", false + ); + if (CollectionUtils.isEmpty(pointList)) { + throw new BadRequestException("暂无可用空位,请稍后再试。"); + } + } + endPointCode = pointList.get(0).getPoint_code(); } // 生成转运任务 JSONObject task = new JSONObject(); task.put("task_type", IOSConstant.PDA_POINT_TASK); task.put("config_code", IOSConstant.PDA_POINT_TASK); - task.put("point_code1", schBasePoint.getPoint_code()); - task.put("point_code2", pointCode); - task.put("vehicle_code", whereJson.getString("storagevehicle_code")); - pdaPointTask.create(task); - // 更新起点绑定id + task.put("point_code1", startPointCode); + task.put("point_code2", endPointCode); + task.put("vehicle_code", vehicleCode); + // 创建任务 + applyTaskMap.get(IOSConstant.PDA_POINT_TASK).create(task); + // 清空起点任务标识 iSchBasePointService.update( new UpdateWrapper().lambda() .set(SchBasePoint::getIos_id, null) - .eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code()) + .set(SchBasePoint::getIng_task_code, null) + .eq(SchBasePoint::getPoint_code, startPointCode) ); return PdaResponse.requestOk(); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java index 3d624fc..d588bbe 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/controller/PdaSchPointController.java @@ -40,7 +40,6 @@ public class PdaSchPointController { } @PostMapping("/binding") - @Log("解绑") @SaIgnore public ResponseEntity binding(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(pdaSchPointService.binding(whereJson), HttpStatus.OK); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java index d478560..28179e3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/PdaSchPointService.java @@ -25,7 +25,6 @@ public interface PdaSchPointService extends IService { PdaResponse getPoint(JSONObject whereJson); /** - * 解绑 * @param whereJson { * point_code: 点位编码 * point_name: 点位名称 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java index 4ee0e0b..9beaffb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/sch_manage/service/impl/PdaSchTaskServiceImpl.java @@ -56,7 +56,7 @@ public class PdaSchTaskServiceImpl extends ServiceImpl SELECT - p.* + p.* FROM - `sch_base_point` p + `sch_base_point` p p.workshop_code = #{whereJson.workshop_code} - AND (p.point_code LIKE '%${whereJson.blurry}%' OR p.point_name LIKE '%${whereJson.blurry}%') + AND (p.point_code LIKE '%${whereJson.blurry}%' OR p.point_name LIKE '%${whereJson.blurry}%' OR + p.vehicle_code LIKE '%${whereJson.blurry}%' OR p.region_name LIKE '%${whereJson.blurry}%' OR + p.region_code LIKE '%${whereJson.blurry}%') AND p.region_code = #{whereJson.region_code} @@ -50,16 +52,16 @@ AND p.is_used = #{whereJson.is_used} - - - - AND (p.ing_task_code IS NOT NULL AND p.ing_task_code ]]> '') - - - - AND (p.ing_task_code IS NULL OR p.ing_task_code = '') - - + + + + + + + + + + ORDER BY p.region_code, p.point_code, p.point_type diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml index cf092a8..5bebd87 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBaseTaskMapper.xml @@ -103,7 +103,7 @@ - SELECT config_code,task_id,point_code1, point_code2 + SELECT config_code,task_id,vehicle_code,task_code,point_code1, point_code2 FROM sch_base_task WHERE diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index 9bef0de..7e512ab 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -6,6 +6,7 @@ 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.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -122,33 +123,33 @@ public class SchBasePointServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper(); + updateWrapper.eq(SchBasePoint::getPoint_code, entity.getPoint_code()); // 获取region_name SchBaseRegion baseRegion = regionMapper.selectById(entity.getRegion_code()); - entity.setRegion_name(baseRegion.getRegion_name()); - if (ObjectUtil.isNotEmpty(entity.getCan_vehicle_types())) { - String can_vehicle_type = String.join(",", entity.getCan_vehicle_types()); - entity.setCan_vehicle_type(can_vehicle_type); + updateWrapper.set(SchBasePoint::getRegion_code, baseRegion.getRegion_code()); + updateWrapper.set(SchBasePoint::getRegion_name, baseRegion.getRegion_name()); + if (StringUtils.isNotBlank(entity.getVehicle_code())) { + updateWrapper.set(SchBasePoint::getVehicle_code, entity.getVehicle_code()); + }else { + updateWrapper.set(SchBasePoint::getVehicle_code, null); } String pointStatus = entity.getPoint_status(); + updateWrapper.set(SchBasePoint::getPoint_status, pointStatus); + updateWrapper.set(SchBasePoint::getIs_has_workder, entity.getIng_task_code()); // 根据点位状态来判断更新内容 - if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals(IOSEnum.POINT_STATUS.code("无货"))) { - entity.setVehicle_type(""); - entity.setVehicle_code(""); + if (pointStatus.equals(IOSEnum.POINT_STATUS.code("无货"))) { + updateWrapper.set(SchBasePoint::getVehicle_type, null); + updateWrapper.set(SchBasePoint::getPoint_status, pointStatus); } - pointMapper.updateById(entity); + pointMapper.update(null, updateWrapper); } @Override @Transactional public void deleteAll(Set ids) { // 真删除 - pointMapper.deleteBatchIds(ids); + // pointMapper.deleteBatchIds(ids); } @Override diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java index 8dc4a61..0144300 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java @@ -88,34 +88,35 @@ public abstract class AbstractTask { resultForAcs.setCode(HttpStatus.HTTP_BAD_REQUEST); resultForAcs.setMessage(e.getMessage()); } - // 如果下发完毕,就修改状态 - if (resultForAcs.getCode() == HttpStatus.HTTP_OK) { - // 查询所有任务 - List taskList = taskService.list( - new QueryWrapper().lambda() - .in(SchBaseTask::getTask_code, taskDtoList.stream() - .map(AcsTaskDto::getTask_code) - .collect(Collectors.toList()) - ) - ); - - // 解析并备注 - JSONArray errArr = resultForAcs.getErrArr(); - for (SchBaseTask schBaseTask : taskList) { - schBaseTask.setTask_status(TaskStatus.ISSUED.getCode()); - // 判断是否是出错的任务 - for (int i = 0; ObjectUtil.isNotEmpty(errArr) && i < errArr.size(); i++) { - JSONObject errObj = errArr.getJSONObject(i); - String taskCode = errObj.getString("task_code"); - if (taskCode.equals(schBaseTask.getTask_code())) { - // 出错的任务就设置出错信息为备注,不是出错就设置下发 - schBaseTask.setTask_status(TaskStatus.CREATED.getCode()); - schBaseTask.setRemark(errObj.getString("message")); - break; + if (resultForAcs != null) { + // 如果下发完毕,就修改状态 + if (resultForAcs.getCode() == HttpStatus.HTTP_OK) { + // 查询所有任务 + List taskList = taskService.list( + new QueryWrapper().lambda() + .in(SchBaseTask::getTask_code, taskDtoList.stream() + .map(AcsTaskDto::getTask_code) + .collect(Collectors.toList()) + ) + ); + // 解析并备注 + JSONArray errArr = resultForAcs.getErrArr(); + for (SchBaseTask schBaseTask : taskList) { + schBaseTask.setTask_status(TaskStatus.ISSUED.getCode()); + // 判断是否是出错的任务 + for (int i = 0; ObjectUtil.isNotEmpty(errArr) && i < errArr.size(); i++) { + JSONObject errObj = errArr.getJSONObject(i); + String taskCode = errObj.getString("task_code"); + if (taskCode.equals(schBaseTask.getTask_code())) { + // 出错的任务就设置出错信息为备注,不是出错就设置下发 + schBaseTask.setTask_status(TaskStatus.CREATED.getCode()); + schBaseTask.setRemark(errObj.getString("message")); + break; + } } } + taskService.updateBatchById(taskList); } - taskService.updateBatchById(taskList); } return resultForAcs; } @@ -131,7 +132,6 @@ public abstract class AbstractTask { /** * 以下改为public会出现自动注入类出现问题 - * * @param task_code r任务号 * @param status 状态码 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java deleted file mode 100644 index bb67e17..0000000 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.nl.wms.sch_manage.service.util; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.http.HttpStatus; -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.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; -import org.nl.config.SpringContextHolder; -import org.nl.wms.gateway.dto.RcsResponse; -import org.nl.wms.gateway.service.IGateWayService; -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.tasks.StOutTask; -import org.nl.wms.warehouse_management.enums.IOSConstant; -import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -@Slf4j -@Component -@RequiredArgsConstructor -public class AutoTask { - - /** - * 任务服务 - */ - @Autowired - private ISchBaseTaskService taskService; - /** - * 通用工具类 - */ - @Autowired - private UpdateIvtUtils updateIvtUtils; - /** - * 任务工厂服务 - */ - @Autowired - private TaskFactory taskFactory; - @Resource - private IGateWayService iGateWayService; - - - private final RedissonClient redissonClient; - - //定时任务 - @SneakyThrows - public void run() { - RLock lock = redissonClient.getLock(this.getClass().getName()); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - try { - if (tryLock) { - sendTask(); - } - } catch (Exception e) { - if (tryLock) { - lock.unlock(); - } - } - } - - /** - * 定时任务:下发任务 - */ - private void sendTask() { - List taskList = taskService.list(new LambdaQueryWrapper() - .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) - .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); - if (CollectionUtils.isEmpty(taskList)) { - return; - } - List failTaskList = new ArrayList<>(); - Set issuedTaskSet = new HashSet<>(); - // 整理下发rcs参数 - for (SchBaseTask taskDao : taskList) { - List taskDtoList = new ArrayList<>(); - taskDtoList.add(updateIvtUtils.sendRcsParam(taskDao)); - RcsResponse resultForRcs = RcsResponse.requestOkMessage("", ""); - resultForRcs.setResponseDate(DateUtil.now()); - try { - // 创建下发对象 - resultForRcs = iGateWayService.renotifyRcs(taskDtoList); - } catch (Exception e) { - log.error("任务下发异常: {}", e.getMessage()); - resultForRcs.setCode(HttpStatus.HTTP_BAD_REQUEST); - resultForRcs.setDesc(e.getMessage()); - } - if (resultForRcs.getCode() == 1000) { - issuedTaskSet.add(taskDao.getTask_id()); - log.info("任务号{},载具号{}下发任务成功", taskDao.getTask_code(), taskDao.getVehicle_code()); - } else { - //获取返回的错误信息 - String error = resultForRcs.getDesc(); - //把下发失败的任务号放在集合中,统一更新备注任务下发失败 - taskDao.setRemark(resultForRcs.getResponseDate() + ":" + error); - failTaskList.add(taskDao); - log.error("任务号{},载具号{}下发任务失败,错误信息:{}", taskDao.getTask_code(), taskDao.getVehicle_code(), error); - } - } - if (CollectionUtils.isNotEmpty(issuedTaskSet)) { - // 如果下发成功,就修改状态 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(SchBaseTask::getTask_status, TaskStatus.ISSUED.getCode()); - updateWrapper.in(SchBaseTask::getTask_id, issuedTaskSet); - taskService.update(updateWrapper); - } - //失败的,更新每个不同失败的原因 - for (SchBaseTask r : failTaskList) { - LambdaUpdateWrapper failUpdateWrapper = new LambdaUpdateWrapper<>(); - failUpdateWrapper.set(SchBaseTask::getRemark, r.getRemark()); - failUpdateWrapper.eq(SchBaseTask::getTask_id, r.getTask_id()); - taskService.update(failUpdateWrapper); - } - } -} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java new file mode 100644 index 0000000..d0de7b8 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoDelayFinish.java @@ -0,0 +1,110 @@ +package org.nl.wms.sch_manage.service.util.autoTasks; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/** + * 延迟完成任务 + * + * @author gbx + * @since 2025-07-21 + */ +@Service +@Slf4j +public class AutoDelayFinish { + + private final ReentrantLock lock = new ReentrantLock(); + /** + * 点位服务 + */ + @Autowired + private ISchBasePointService iSchBasePointService; + + + //定时任务 + public void run() { + try { + this.runTask(); + } catch (Exception e) { + log.error("定时任务:AutoDelayFinish,运行异常:", e); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + /** + * 定时任务:延迟更新点位 + */ + public void runTask() { + boolean isLock = false; + try { + isLock = lock.tryLock(3, TimeUnit.SECONDS); + if (!isLock) { + log.warn("未获取到锁,跳过此次任务"); + return; + } + List taskList = iSchBasePointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("是")) + .eq(SchBasePoint::getRegion_code, StatusEnum.REGION_INFO.code("商用线5号线"))); + if (CollectionUtils.isEmpty(taskList)) { + return; + } + LocalDateTime now = LocalDateTime.now(); + List pointCodes = taskList.stream() + .filter(r -> { + try { + String updateTimeStr = r.getUpdate_time(); + if (StringUtils.isBlank(updateTimeStr)) { + return false; + } + LocalDateTime updateTime = LocalDateTime.parse(updateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return Duration.between(updateTime, now).toMinutes() >= 2; + } catch (Exception e) { + return false; + } + }) + .map(SchBasePoint::getPoint_code) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(pointCodes)) { + iSchBasePointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .in(SchBasePoint::getPoint_code, pointCodes)); + } + } catch ( + Exception ex) { + log.error("AutoDelayFinish执行异常:", ex); + } finally { + if (isLock && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java new file mode 100644 index 0000000..2d2e50e --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/autoTasks/AutoTask.java @@ -0,0 +1,135 @@ +package org.nl.wms.sch_manage.service.util.autoTasks; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; +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.apache.commons.collections4.CollectionUtils; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.gateway.dto.RcsResponse; +import org.nl.wms.gateway.service.IGateWayService; +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.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + +@Service +@Slf4j +@RequiredArgsConstructor +public class AutoTask { + + private final ReentrantLock lock = new ReentrantLock(); + + /** + * 任务服务 + */ + @Autowired + private ISchBaseTaskService taskService; + /** + * 通用工具类 + */ + @Autowired + private UpdateIvtUtils updateIvtUtils; + @Resource + private IGateWayService iGateWayService; + + + //定时任务 + + public void run() { + try { + this.sendTask(); + } catch (Exception e) { + log.error("定时任务:AutoTask,运行异常:", e); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + /** + * 定时任务:下发任务 + */ + private void sendTask() { + boolean isLock = false; + try { + isLock = lock.tryLock(3, TimeUnit.SECONDS); + if (!isLock) { + log.warn("未获取到锁,跳过此次任务"); + return; + } + List taskList = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); + if (CollectionUtils.isEmpty(taskList)) { + return; + } + List failTaskList = new ArrayList<>(); + Set issuedTaskSet = new HashSet<>(); + // 整理下发rcs参数 + for (SchBaseTask taskDao : taskList) { + List taskDtoList = new ArrayList<>(); + taskDtoList.add(updateIvtUtils.sendRcsParam(taskDao)); + RcsResponse resultForRcs = RcsResponse.requestOkMessage("", ""); + resultForRcs.setResponseDate(DateUtil.now()); + try { + // 创建下发对象 + resultForRcs = iGateWayService.renotifyRcs(taskDtoList); + } catch (Exception e) { + log.error("任务下发异常: {}", e.getMessage()); + resultForRcs.setCode(HttpStatus.HTTP_BAD_REQUEST); + resultForRcs.setDesc(e.getMessage()); + } + if (resultForRcs != null) { + if (resultForRcs.getCode() == 1000) { + issuedTaskSet.add(taskDao.getTask_id()); + log.info("任务号{},载具号{}下发任务成功", taskDao.getTask_code(), taskDao.getVehicle_code()); + } else { + //获取返回的错误信息 + String error = resultForRcs.getDesc(); + //把下发失败的任务号放在集合中,统一更新备注任务下发失败 + taskDao.setRemark(resultForRcs.getResponseDate() + ":" + error); + failTaskList.add(taskDao); + log.error("任务号{},载具号{}下发任务失败,错误信息:{}", taskDao.getTask_code(), taskDao.getVehicle_code(), error); + } + } + } + if (CollectionUtils.isNotEmpty(issuedTaskSet)) { + // 如果下发成功,就修改状态 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatus.ISSUED.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务下发成功!"); + updateWrapper.in(SchBaseTask::getTask_id, issuedTaskSet); + taskService.update(updateWrapper); + } + //失败的,更新每个不同失败的原因 + for (SchBaseTask r : failTaskList) { + LambdaUpdateWrapper failUpdateWrapper = new LambdaUpdateWrapper<>(); + failUpdateWrapper.set(SchBaseTask::getRemark, r.getRemark()); + failUpdateWrapper.eq(SchBaseTask::getTask_id, r.getTask_id()); + taskService.update(failUpdateWrapper); + } + } catch ( + Exception ex) { + log.error("AutoTask执行异常:", ex); + } finally { + if (isLock && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java index ddd902c..e03eed7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PdaPointTask.java @@ -3,11 +3,16 @@ 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.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; 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.enums.BaseDataEnum; 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; @@ -19,20 +24,33 @@ 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.IOSEnum; +import org.nl.wms.warehouse_management.service.IOutBillService; +import org.nl.wms.warehouse_management.service.dao.GroupPlate; +import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper; import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.math.BigDecimal; + /** * @Author: Liuxy - * @Description: 手持定点任务 + * @Description: 点位运输任务, 该任务完成,组盘信息默认整出 * @Date: 2025/6/6 */ @Component(value = "PdaPointTask") @TaskType("PdaPointTask") public class PdaPointTask extends AbstractTask { + @Resource + private IOutBillService outBillService; + /** + * 组盘记录mapper + */ + @Autowired + private MdPbGroupplateMapper mdPbGroupplateMapper; /** * 任务服务类 */ @@ -68,12 +86,14 @@ public class PdaPointTask extends AbstractTask { task.setVehicle_code(json.getString("vehicle_code")); task.setVehicle_type(json.getString("vehicle_type")); task.setRequest_param(json.toString()); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setAcs_trace_id(json.getString("acs_task_type")); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); taskService.save(task); - return task.getTask_id(); + return task.getTask_code(); } @Override @@ -131,10 +151,10 @@ public class PdaPointTask extends AbstractTask { if (ObjectUtil.isEmpty(taskObj)) { throw new BadRequestException("该任务不存在"); } - if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { - throw new BadRequestException("只能取消生成中的任务!"); - } - this.cancelTask(taskObj); + // if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { + // throw new BadRequestException("只能取消生成中的任务!"); + // } + this.cancelTask(taskObj); } @Override @@ -143,28 +163,21 @@ public class PdaPointTask extends AbstractTask { @Transactional public void finishTask(SchBaseTask taskObj) { + // 更新任务 + taskObj.setRemark("已完成"); + taskObj.setHandle_status(BaseDataEnum.IS_YES_NOT.code("是")); + taskService.updateById(taskObj); + //更新单据 + outBillService.taskFinish(taskObj); // 更新起点 iSchBasePointService.update(new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) - .set(SchBasePoint::getVehicle_code, null) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) - ); - iStructattrService.update( - new UpdateWrapper().lambda() - .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) - .set(Structattr::getStoragevehicle_code, null) - .set(Structattr::getTaskdtl_id, null) - .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) ); // 更新终点 - iSchBasePointService.update( - new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) - .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) - ); iStructattrService.update( new UpdateWrapper().lambda() .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) @@ -172,26 +185,40 @@ public class PdaPointTask extends AbstractTask { .set(Structattr::getTaskdtl_id, null) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) ); - // 更新任务 - taskObj.setRemark("已完成"); - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskService.updateById(taskObj); + } @Transactional public void cancelTask(SchBaseTask taskObj) { - iSchBasePointService.update(new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) - .set(SchBasePoint::getVehicle_code, null)); - iStructattrService.update(new UpdateWrapper().lambda() - .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) - .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + //更新起点 + // iSchBasePointService.update(new UpdateWrapper().lambda() + // .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + // .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + // .set(SchBasePoint::getVehicle_code, null)); + // iStructattrService.update(new UpdateWrapper().lambda() + // .eq(Structattr::getStruct_code, taskObj.getPoint_code1()) + // .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + // ); + //解冻 + GroupPlate plate = mdPbGroupplateMapper.selectOne( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, taskObj.getVehicle_code()) + .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) ); + if (ObjectUtils.isNotEmpty(plate)) { + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .eq(GroupPlate::getGroup_id, plate.getGroup_id())); + } // 更新终点 iSchBasePointService.update(new UpdateWrapper().lambda() .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getVehicle_code, null)); iStructattrService.update(new UpdateWrapper().lambda() .eq(Structattr::getStruct_code, taskObj.getPoint_code2()) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java index 711052f..a92336c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; import org.nl.config.IdUtil; @@ -68,6 +69,8 @@ public class StOutTask extends AbstractTask { task.setVehicle_type(json.getString("vehicle_type")); task.setGroup_id(json.getString("group_id")); task.setRequest_param(json.toString()); + task.setHandle_status(json.getString("vehicle_type")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setAcs_trace_id(json.getString("acs_task_type")); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java index adc2988..922aca2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.SecurityUtils; @@ -78,6 +79,8 @@ public class VehicleInTask extends AbstractTask { task.setVehicle_type(json.getString("vehicle_type")); task.setRequest_param(json.toString()); task.setAcs_trace_id(json.getString("acs_task_type")); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java index b825c2c..42cdb00 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java @@ -5,9 +5,11 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; 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; @@ -69,12 +71,14 @@ public class VehicleOutTask extends AbstractTask { task.setTask_status(TaskStatus.CREATE.getCode()); task.setConfig_code(json.getString("task_type")); task.setPoint_code1(json.getString("point_code1")); - task.setPoint_code2(json.getString("PlacedLocation")); + task.setPoint_code2(json.getString("point_code2")); task.setVehicle_code(json.getString("vehicle_code")); task.setVehicle_type(json.getString("vehicle_type")); task.setGroup_id(json.getString("group_id")); task.setRequest_param(json.toString()); task.setAcs_trace_id(json.getString("acs_task_type")); + task.setHandle_status(json.getString("handle_status")); + task.setIs_auto_confirm(StringUtils.isNotBlank(json.getString("is_auto_confirm"))?json.getInteger("is_auto_confirm"):0); task.setCreate_id(SecurityUtils.getCurrentUserId()); task.setCreate_name(SecurityUtils.getCurrentNickName()); task.setCreate_time(DateUtil.now()); @@ -155,7 +159,7 @@ public class VehicleOutTask extends AbstractTask { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setRemark("已完成"); - taskObj.setHandle_status("1"); + taskObj.setHandle_status(BaseDataEnum.IS_YES_NOT.code("是")); taskService.updateById(taskObj); outBillService.taskFinish(taskObj); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java index d40f1da..0d7c92b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java @@ -58,12 +58,27 @@ public class IOSConstant { public final static String MOVE_CONFIG_TASK = "MoveTask"; /** - * 余料回库任务类编码 + * 入库任务 + */ + public final static String ST_IN_TASK = "STInTask"; + + /** + * 出库任务 + */ + public final static String ST_OUT_TASK = "STOutTask"; + + /** + * 移库任务 + */ + public final static String MOVE_TASK = "MoveTask"; + + /** + * 余料回库 */ public final static String BACK_IN_TASK = "BackInTask"; /** - * 手持定点任务 + * 点位运输任务 */ public final static String PDA_POINT_TASK = "PdaPointTask"; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index b8f49b3..3abf856 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java @@ -38,7 +38,7 @@ public enum IOSEnum { // 锁类型 LOCK_TYPE(MapOf.of("未锁定", "0", "入库锁", "1", "出库锁", "2" - , "移入锁", "3", "移出锁", "4", "其他锁","9" + , "移入锁", "3", "移出锁", "4", "其他锁","99" )), // 点位状态 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java index fd6a40a..3d2417c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java @@ -9,7 +9,6 @@ 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.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -1213,7 +1212,7 @@ public class OutBillServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) public void taskFinish(SchBaseTask task) { - //解锁库位 + //更新起点 JSONObject finish_map = new JSONObject(); finish_map.put("struct_code", task.getPoint_code1()); finish_map.put("storagevehicle_code", null); @@ -1221,15 +1220,38 @@ public class OutBillServiceImpl extends ServiceImpl finish_map.put("inv_id", null); finish_map.put("inv_code", null); iStructattrService.updateStatusByCode("1", finish_map); - // 更新终点 - iSchBasePointService.update( - new UpdateWrapper().lambda() - .eq(SchBasePoint::getPoint_code, task.getPoint_code2()) - .set(SchBasePoint::getVehicle_code, task.getVehicle_code()) - .set(SchBasePoint::getIos_id, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) - ); - if (StringUtils.isBlank(task.getHandle_status())) { + //更新终点 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + if (BaseDataEnum.IS_YES_NOT.code("是").equals(task.getIs_auto_confirm().toString())) { + //整出 + GroupPlate plate = mdPbGroupplateMapper.selectOne( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code()) + .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + ); + if (ObjectUtils.isNotEmpty(plate)) { + mdPbGroupplateMapper.update(null, new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + .set(GroupPlate::getQty, BigDecimal.ZERO) + .set(GroupPlate::getFrozen_qty, BigDecimal.ZERO) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .set(GroupPlate::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(GroupPlate::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .eq(GroupPlate::getGroup_id, plate.getGroup_id())); + } + wrapper.set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("是")); + } else { + wrapper.set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code("否")); + } + wrapper.eq(SchBasePoint::getPoint_code, task.getPoint_code2()) + .set(SchBasePoint::getVehicle_code, task.getVehicle_code()) + .set(SchBasePoint::getIos_id, null) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")); + iSchBasePointService.update(wrapper); + if (BaseDataEnum.IS_YES_NOT.code("是").equals(task.getHandle_status())) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java index 68bc408..f8ec345 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java @@ -142,6 +142,9 @@ public class UpdateIvtUtils { throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")) + ",请在WMS任务列表中检查!"); } MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, where.getString("vehicle_code"))); + if (mdPbStoragevehicleinfo == null) { + throw new BadRequestException("该载具不存在,请检查。"); + } String acsTaskType = StatusEnum.ACS_TASK_TYPE.getR(mdPbStoragevehicleinfo.getStoragevehicle_type()); where.put("acs_task_type", acsTaskType); where.put("vehicle_type", mdPbStoragevehicleinfo.getStoragevehicle_type()); diff --git a/nladmin-ui/.env.production b/nladmin-ui/.env.production index 4ce9728..16ca0e1 100644 --- a/nladmin-ui/.env.production +++ b/nladmin-ui/.env.production @@ -2,6 +2,7 @@ ENV = 'production' # 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置 # 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http -VUE_APP_BASE_API = 'http://localhost:8011' +VUE_APP_BASE_API = 'http://172.18.51.221:8011' # 如果接口是 http 形式, wss 需要改为 ws -VUE_APP_WS_API = 'ws://localhost:8011' +VUE_APP_WS_API = 'ws://172.18.51.221:8011' + diff --git a/nladmin-ui/src/views/wms/basedata/material/index.vue b/nladmin-ui/src/views/wms/basedata/material/index.vue index 8eafb68..b697509 100644 --- a/nladmin-ui/src/views/wms/basedata/material/index.vue +++ b/nladmin-ui/src/views/wms/basedata/material/index.vue @@ -16,7 +16,7 @@ /> - + @@ -31,16 +31,16 @@ - - 导入 - + + + + + + + + + + - + - + 规 格 - + @@ -73,37 +73,37 @@ 型 号 - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - - - - - - + + + + + + + + - - + + - + @@ -195,7 +195,7 @@ const defaultForm = { is_used_time: null, is_used: null, is_delete: null, - ext_id: null, + ext_id: 'YZHJ', material_height_type: null, product_series: null } @@ -229,9 +229,9 @@ export default { material_id: [ { required: true, message: '不能为空', trigger: 'blur' } ], - material_code: [ - { required: true, message: '物料编码不能为空', trigger: 'blur' } - ], + // material_code: [ + // { required: true, message: '物料编码不能为空', trigger: 'blur' } + // ], material_name: [ { required: true, message: '物料名称不能为空', trigger: 'blur' } ], diff --git a/nladmin-ui/src/views/wms/sch/point/index.vue b/nladmin-ui/src/views/wms/sch/point/index.vue index 1225a0e..5f97c1c 100644 --- a/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/nladmin-ui/src/views/wms/sch/point/index.vue @@ -225,6 +225,12 @@ /> + + + + + + @@ -243,9 +249,6 @@ - - - - + + + + + - - - {{ dict.label.vehicle_type[scope.row.vehicle_type] }} - - + + + + + + + + + - - - - {{ scope.row.ing_task_code ? '是' : '否' }} - - - - - - - - + + + + + @@ -403,23 +371,58 @@ {{ scope.row.is_has_workder ? '是' : '否' }} - - - {{ scope.row.is_auto ? '是' : '否' }} - - + + + + + + + + + + + + + + + + + + + + + + + {{ scope.row.is_used ? '是' : '否' }} - - + + + + + + + + + + + { this.regionList = res + // 如果 regionList 中包含 YZHJ01,则设置默认值 + if (this.regionList.some(r => r.region_code === 'YZHJ01')) { + this.query.region_code = 'YZHJ01' + this.getPointStatusAndTypeList('YZHJ01', 1) // 可选:如果你希望自动触发 change 逻辑 + } }) }, getPointStatusAndTypeList(id, flag) { diff --git a/nladmin-ui/src/views/wms/statement/structivt/index.vue b/nladmin-ui/src/views/wms/statement/structivt/index.vue index dee4b85..9855eec 100644 --- a/nladmin-ui/src/views/wms/statement/structivt/index.vue +++ b/nladmin-ui/src/views/wms/statement/structivt/index.vue @@ -57,19 +57,19 @@ - + 库存导入 + + + + + {{ dict.label.d_lock_type[scope.row.lock_type] }} + + @@ -107,10 +112,12 @@ import pagination from '@crud/Pagination' import crudSectattr from '@/views/wms/basedata/sectattr/sectattr' import { download } from '@/api/data' import { downloadFile } from '@/utils' +import UploadDialog from '@/views/wms/basedata/material/UploadDialog.vue' export default { name: 'Structivt', - components: { pagination, crudOperation, rrOperation }, + dicts: ['d_lock_type'], + components: { UploadDialog, pagination, crudOperation, rrOperation }, mixins: [presenter(), header(), crud()], cruds() { return CRUD({ @@ -128,6 +135,7 @@ export default { }, data() { return { + uploadShow: false, sects: [], permission: {}, rules: {}