add:二楼出库流程

This commit is contained in:
2025-02-25 22:28:34 +08:00
parent c2eb2288ac
commit 39bc59067f
52 changed files with 1557 additions and 192 deletions

View File

@@ -68,6 +68,7 @@ public class TableDataInfo<T> implements Serializable {
return rspData;
}
public static TableDataInfo<Map> buildByDivForm(IPage<Map> page,String json_field) {
TableDataInfo<Map> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));

View File

@@ -28,7 +28,7 @@ public enum StatusEnum {
* 出入库单据类型
*/
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10", "inStorageTask", "调拨入库", "11", "inStorageTask", "退货入库", "12", "inStorageTask", "拣选回库", "13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask","拣选出库", "23","conveyorOutStorageTask","盘点出库", "24","outStorageTask","出库拣选", "25","toPickPlatformTask","托盘出库", "40","outStorageTask","二楼CTU出库", "81","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask", "拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运", "82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask")),
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50", "moveStorageTask", "异常位移库", "51", "moveStorageTask")),
EXT_TASK_TYPE(ForkMap.of("盘点", "60", "moveStorageTask")),
OTHER_TASK_TYPE(ForkMap.of("转运", "70", "tranforTask")),
@@ -51,7 +51,7 @@ public enum StatusEnum {
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code, IOBILL_TYPE_OUT.code, IOBILL_TYPE_MOVE.code, EXT_TASK_TYPE.code, OTHER_TASK_TYPE.code)),
ACS_TYPE(ForkMap.of(
"立库", "1", null, "AGV", "2", null, "CTU任务", "3", null
"立库", "1", null, "AGV任务", "2", null, "CTU任务", "3", null
)),
ACS_SYSTEM_TYPE(ForkMap.of(
"NDC", "1", null, "海柔CTU", "5", null, "海康CTU", "6", null
@@ -63,9 +63,21 @@ public enum StatusEnum {
LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null)),
STRATEGY_TYPE(ForkMap.of("入库", "1", null, "出库", "2", null, "出入库", "3", null)),
PRODUCT_AREA(ForkMap.of("一层车间", "A1", null, "二层车间", "A2", null, "三层车间", "A3", null)),
;
PRODUCT_AREA(ForkMap.of("一层车间", "A1", null, "二层车间", "A2", null, "三层车间", "A3", null)),
REGION_INFO(ForkMap.of("主存区拣选平台", "PICK01", null, "一楼出入库输送线", "IOConveyor", null, "二楼出入库输送线", "IOConveyor2", null, "拣选台秤重区", "WEIGH01", null,
"二楼CTU货架对接位", "CTU_POSITION", null, "二楼AGV产线对接位", "AGV_POSITION", null)),
STOCK_INFO(ForkMap.of("托盘库", "FStockPallet", null, "料箱库", "FStockId", null, "虚拟库", "FicStockId", null, "二楼ctu缓存库", "CStockId", null,
"二楼货架缓存库", "HStockId", null)),
SORT_TYPE(ForkMap.of(
"升序", "1", null, "降序", "2", null
));
/**
* L:label
* M编码

View File

@@ -96,7 +96,7 @@ public class StIvtBsrealstorattrController {
String pre = config.getString("pre");
String now = DateUtil.now();
ArrayList<StIvtStructattr> list = new ArrayList<>();
for (int x = 6; x <= ; x++) {
for (int x = 12; x <= ; x++) {
for (int y = 1; y <= ; y++) {
for (int z = 1; z <= ; z++) {
StIvtStructattr attr = new StIvtStructattr();
@@ -111,7 +111,7 @@ public class StIvtBsrealstorattrController {
attr.setCreate_id("1");
attr.setRow_num(x);
attr.setCol_num(y);
attr.setBlock_num(3);
attr.setBlock_num(12);
attr.setLayer_num(z);
attr.setCreate_time(now);
attr.setCreate_name("Admin");

View File

@@ -148,7 +148,6 @@ public class BmVehicleInfoServiceImpl extends ServiceImpl<BmVehicleInfoMapper, B
@Override
public void changeActive(JSONObject json) {
BmVehicleInfo entity = json.toJavaObject(BmVehicleInfo.class);
entity.setUpdate_time(DateUtil.now());
entity.setUpdate_name(SecurityUtils.getCurrentNickName());
@@ -161,4 +160,5 @@ public class BmVehicleInfoServiceImpl extends ServiceImpl<BmVehicleInfoMapper, B
json.put("value", CodeUtil.codeView(code));
return json;
}
}

View File

@@ -2,6 +2,7 @@ package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
@@ -61,6 +62,9 @@ public class SameBlockNumRuleHandler extends Decisioner<StIvtStructattr, JSONObj
break;
}
}
if (ObjectUtils.isEmpty(result)) {
result.addAll(blockList);
}
return result;
}

View File

@@ -1,11 +1,16 @@
package org.nl.wms.dispatch_manage.point.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
@@ -18,6 +23,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
/**
@@ -36,6 +42,7 @@ public class SchBasePointController {
@Autowired
private ISchBaseRegionService regionService;
@GetMapping
public ResponseEntity<Object> query(SchBasePointQuery whereJson, PageQuery page) {
return new ResponseEntity<>(TableDataInfo.build(pointService.page(page.build(SchBasePoint.class), whereJson.build())), HttpStatus.OK);
@@ -73,5 +80,37 @@ public class SchBasePointController {
public ResponseEntity<Object> getRegion() {
return new ResponseEntity<>(regionService.list(), HttpStatus.OK);
}
@PostMapping("/getPointStatus")
@Log("获取点位状态")
@SaIgnore
public ResponseEntity<Object> getPointStatus(@RequestBody JSONObject param) {
if (param == null || StringUtils.isEmpty(param.getString("site_code"))) {
throw new BadRequestException("请求参数不能为空");
}
List<SchBasePoint> pointList = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getCode, param.getString("site_code")).eq(SchBasePoint::getIs_used, true));
if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("输入的站点编号有误或被禁用,请检查!");
}
SchBasePoint point = pointList.get(0);
point.setRemark("00".equals(point.getLock_type()) ? "未绑定货架" : "已绑定货架");
return new ResponseEntity<>(point, HttpStatus.OK);
}
/**
* 二楼货架与地面站点绑定或解绑
*/
@PostMapping("bindOrUnbind")
@Log("二楼货架与地面站点绑定或解绑")
@SaIgnore
public ResponseEntity<TableDataInfo> bindOrUnbind(@RequestBody JSONObject param) {
if (param == null || StringUtils.isEmpty(param.getString("site_code")) || StringUtils.isEmpty(param.getString("shelf_code")) || StringUtils.isEmpty(param.getString("mode"))) {
throw new BadRequestException("请求参数不能为空");
}
pointService.bindOrUnbind(param.getString("site_code"),param.getString("shelf_code"), param.getString("mode"));
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
}

View File

@@ -1,8 +1,11 @@
package org.nl.wms.dispatch_manage.point.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import java.util.List;
/**
* <p>
* 点位基础表 服务类
@@ -13,4 +16,25 @@ import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
*/
public interface ISchBasePointService extends IService<SchBasePoint> {
/**
* 二楼货架与地面站点绑定或解绑
* @param siteCode 点位
* @param shelfCode 货架编号
* @param mode 0解绑1绑定
*/
void bindOrUnbind(String siteCode,String shelfCode,String mode);
/**
* 查询没有搬运任务的空的目标点位
*
* @param regionCode 点位类型
* @param getLockType 锁定状态
* @param sortType 点位排序规则1升序2降序
@param pointType 0空载具1满载具
* @return List<SchBasePoint>
*/
List<SchBasePoint> checkEndPointTask(String regionCode, String getLockType,String sortType,String pointType);
}

View File

@@ -1,11 +1,31 @@
package org.nl.wms.dispatch_manage.point.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.point.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.acs.service.WmsToAcsService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* <p>
* 点位基础表 服务实现类
@@ -16,5 +36,108 @@ import org.springframework.stereotype.Service;
*/
@Service
public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, SchBasePoint> implements ISchBasePointService {
@Autowired
private WmsToAcsService wmsToAcsService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
/**
* 二楼货架与地面站点绑定或解绑
*
* @param siteCode 点位
* @param shelfCode 货架编号
* @param mode 0解绑1绑定
*/
@Override
public void bindOrUnbind(String siteCode, String shelfCode, String mode) {
List<SchBasePoint> pointList = this.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getCode, siteCode).eq(SchBasePoint::getIs_used, true));
if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("输入的站点编号有误或被禁用,请检查!");
}
//检查是否为空架
List<StIvtStructattr> stIvtStructattrList = iStIvtStructattrService.list(new LambdaQueryWrapper<StIvtStructattr>()
.eq(StIvtStructattr::getIs_used, true)
.eq(StIvtStructattr::getSect_code, shelfCode));
List<StIvtStructattr> notEmptyList = stIvtStructattrList.stream().filter(r -> StringUtils.isNotBlank(r.getVehicle_code())).collect(Collectors.toList());
if (ObjectUtils.isNotEmpty(notEmptyList)) {
throw new BadRequestException("该货架的货位:" + notEmptyList.get(0).getStruct_code() + ",存在未出库的料箱:" + notEmptyList.get(0).getVehicle_code() + ",请检查!");
}
LambdaUpdateWrapper<SchBasePoint> wrapper = new LambdaUpdateWrapper<SchBasePoint>()
.eq(SchBasePoint::getCode, siteCode);
if ("1".equals(mode)) {
if (StringUtils.isNotBlank(pointList.get(0).getVehicle_code())) {
throw new BadRequestException("当前站点已绑定货架,货架编号:" + pointList.get(0).getVehicle_code() + ",请检查或解绑!");
}
wrapper.set(SchBasePoint::getVehicle_code, shelfCode)
.set(SchBasePoint::getPoint_type, 0)
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"));
} else if ("0".equals(mode)) {
wrapper.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"));
}
wrapper.set(SchBasePoint::getUpdate_time, DateUtil.now())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName());
this.update(wrapper);
//绑定状态同步至ACS
wmsToAcsService.bindPodAndBerth(siteCode, shelfCode, mode, "bindPodAndBerth");
}
/**
* 查询没有搬运任务的空的目标点位
*
* @param regionCode 点位类型
* @param getLockType 锁定状态
* @param sortType 点位排序规则1升序2降序
* @param pointType 0空载具1满载具
* @return List<SchBasePoint>
*/
@Override
public List<SchBasePoint> checkEndPointTask(String regionCode, String getLockType, String sortType, String
pointType) {
Set<String> pointSets;
List<SchBaseTask> taskList;
List<SchBasePoint> returList = new ArrayList<>();
LambdaQueryWrapper<SchBasePoint> queryWrapper = new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getIs_used, true)
.eq(SchBasePoint::getRegion_code, regionCode);
if (StringUtils.isNotEmpty(getLockType)) {
queryWrapper.eq(SchBasePoint::getLock_type, getLockType);
}
if (StringUtils.isNotEmpty(pointType)) {
queryWrapper.eq(SchBasePoint::getPoint_type, pointType);
}
if (StatusEnum.SORT_TYPE.code("升序").equals(sortType)) {
queryWrapper.orderByAsc(SchBasePoint::getCode);
} else if (StatusEnum.SORT_TYPE.code("降序").equals(sortType)) {
queryWrapper.orderByDesc(SchBasePoint::getCode);
} else {
queryWrapper.orderByAsc(SchBasePoint::getCode);
}
List<SchBasePoint> ivtList = this.list(queryWrapper);
Set<String> pointIds = ivtList.stream()
.map(SchBasePoint::getCode)
.collect(Collectors.toSet());
if (ObjectUtils.isEmpty(pointIds)) {
return returList;
}
//点位任务
taskList = iSchBaseTaskService.getTaskList(pointIds, pointIds, null, null);
pointSets = taskList.stream()
.flatMap(task -> Stream.of(
task.getPoint_code1(),
task.getPoint_code2()
))
.filter(point -> point != null && !point.trim().isEmpty())
.collect(Collectors.toSet());
//符合条件的库存点位过滤掉已存在任务的点位
return ivtList.stream()
.filter(p -> !pointSets.contains(p.getCode()) && p.getLock_type().equals(getLockType))
.collect(Collectors.toList());
}
}

View File

@@ -120,7 +120,7 @@ public class GroupDickInStorageTask extends AbstractTask {
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//跟新库存
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2());
}

View File

@@ -84,7 +84,7 @@ public class InStorageTask extends AbstractTask {
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//跟新库存
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2());
}

View File

@@ -105,8 +105,8 @@ public class MoveStorageTask extends AbstractTask {
data.put("status",StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = taskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE,schBaseTask.getPoint_code2());
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2());
}

View File

@@ -184,7 +184,7 @@ public class OutStorageTask extends AbstractTask {
data.put("status",StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = taskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE,schBaseTask.getPoint_code2());
}
@Override

View File

@@ -146,7 +146,7 @@ public class PalletInStorageTask extends AbstractTask {
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//跟新库存
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2());
}

View File

@@ -117,7 +117,7 @@ public class PalletOutStorageTask extends AbstractTask {
data.put("status",StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = taskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE,schBaseTask.getPoint_code2());
}
@Override

View File

@@ -94,7 +94,7 @@ public class PickStorageTask extends AbstractTask {
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//跟新库存
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2());
}

View File

@@ -0,0 +1,120 @@
package org.nl.wms.dispatch_manage.task.handler.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.record.service.IStIvtStructivtflowService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author gbx
* &#064;Date 2025/2/17 13:30
* 二楼出库AGV搬运
*/
@Service("secondFloorAgvTransfer")
@Slf4j
public class SecondFloorAgvTransferTask extends AbstractTask {
@Autowired
private IStIvtStructivtflowService structIvtFlowService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Override
public JSONObject createTask(JSONObject from) {
SchBaseTask task = new SchBaseTask();
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setProduct_area(StatusEnum.PRODUCT_AREA.code("二层车间"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type(StatusEnum.ACS_TYPE.code("AGV任务"));
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(StatusEnum.IOBILL_TYPE_OUT.code("二楼出库AGV搬运"));
task.setVehicle_code(from.getString("vehicleCode"));
task.setPoint_code1(from.getString("pointCode1"));
task.setPoint_code2(from.getString("pointCode2"));
task.setPoint_code3(from.getString("pointCode3"));
task.setGroup_code(from.getString("group_code"));
iSchBaseTaskService.create(task);
//更新任务号
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code, task.getTask_code())
.set(MdPbVehicleMater::getRemark,"该料箱正在出库到产线站点"+from.getString("pointCode2")+"-"+from.getString("pointCode3"))
.eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code())
.eq(MdPbVehicleMater::getIs_delete, false));
return (JSONObject) JSON.toJSON(task);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finish(JSONObject data) {
data.put("status", StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//起点位解锁
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"))
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getUpdate_time, DateUtil.now())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
.eq(SchBasePoint::getCode, schBaseTask.getPoint_code1()));
//终点点位绑定货架,Point_type为满架
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getPoint_type, "1")
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("出库锁"))
.set(SchBasePoint::getVehicle_code, schBaseTask.getPoint_code3())
.set(SchBasePoint::getUpdate_time, DateUtil.now())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
.eq(SchBasePoint::getCode, schBaseTask.getPoint_code2()));
}
@Override
public void updateStatus(JSONObject data) {
this.updateTask(data);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancel(JSONObject data) {
try {
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iSchBaseTaskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getTask_step, "1")
.eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库"))
.in(SchBaseTask::getGroup_code, schBaseTask.getGroup_code()));
this.updateTask(data);
} catch (Exception e) {
throw new BadRequestException("取消任务失败,失败原因:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,107 @@
package org.nl.wms.dispatch_manage.task.handler.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.record.service.IStIvtStructivtflowService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author gbx
* &#064;Date 2025/2/17 13:30
* 二楼空架AGV搬运任务
*/
@Service("secondFloorEmptyShelves")
@Slf4j
public class SecondFloorEmptyShelfTask extends AbstractTask {
@Autowired
private IStIvtStructivtflowService structIvtFlowService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Override
public JSONObject createTask(JSONObject from) {
SchBaseTask task = new SchBaseTask();
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setProduct_area(StatusEnum.PRODUCT_AREA.code("二层车间"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type(StatusEnum.ACS_TYPE.code("AGV任务"));
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(StatusEnum.IOBILL_TYPE_OUT.code("二楼空架AGV搬运"));
task.setVehicle_code(from.getString("vehicleCode"));
task.setPoint_code1(from.getString("pointCode1"));
task.setPoint_code2(from.getString("pointCode2"));
task.setGroup_code(from.getString("group_code"));
iSchBaseTaskService.create(task);
//更新任务号
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code, task.getTask_code())
.eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code())
.eq(MdPbVehicleMater::getIs_delete, false));
return (JSONObject) JSON.toJSON(task);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finish(JSONObject data) {
data.put("status", StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//起点解锁
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"))
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getUpdate_time, DateUtil.now())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
.eq(SchBasePoint::getCode, schBaseTask.getPoint_code1()));
//货架绑定
iSchBasePointService.bindOrUnbind(schBaseTask.getPoint_code2(), schBaseTask.getVehicle_code(), "1");
}
@Override
public void updateStatus(JSONObject data) {
this.updateTask(data);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancel(JSONObject data) {
try {
this.updateTask(data);
} catch (Exception e) {
throw new BadRequestException("取消任务失败,失败原因:" + e.getMessage());
}
}
}

View File

@@ -55,46 +55,32 @@ public class SecondFloorInStorageTask extends AbstractTask {
@Autowired
private IBmVehicleInfoService iBmVehicleInfoService;
@Autowired
private IMdPbVehicleMaterService vehicleMaterService;
@Autowired
private IStIvtStructivtflowService structivtflowService;
private IStIvtStructivtflowService structIvtFlowService;
@Override
//@Transactional
public JSONObject createTask(JSONObject from) {
SchBaseTask task = new SchBaseTask();
for (String vehicle_code : from.keySet()) {
String start_point = from.getString(vehicle_code);
if (StringUtils.isEmpty(start_point)) {
for (String vehicleCode : from.keySet()) {
String startPoint = from.getString(vehicleCode);
if (StringUtils.isEmpty(startPoint)) {
throw new BadRequestException("申请任务失败:任务起点不能为空!");
}
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.getOne(new QueryWrapper<BmVehicleInfo>()
.eq("vehicle_code", vehicle_code));
if (vehicleInfo == null) {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "信息不存在");
}
List<MdPbVehicleMater> item = iMdPbVehicleMaterService.list(new LambdaQueryWrapper<MdPbVehicleMater>().eq(MdPbVehicleMater::getVehicle_code, vehicle_code));
if (CollectionUtils.isEmpty(item)) {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "载具物料信息信息不存在");
}
String struct_code = getStructCode(vehicle_code);
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)) {
throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
task.setVehicle_type(checkVehicleInfo(vehicleCode));
String endPoint = getEndPoint(vehicleCode);
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setProduct_area(StatusEnum.PRODUCT_AREA.code("二层车间"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type(StatusEnum.ACS_TYPE.code("CTU任务"));
task.setAgv_system_type(StatusEnum.ACS_SYSTEM_TYPE.code("海康CTU"));
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(StatusEnum.IOBILL_TYPE_IN.code("二楼CTU入库"));
task.setVehicle_code(vehicle_code);
task.setPoint_code1(start_point);
task.setPoint_code2(struct_code);
task.setVehicle_code(vehicleCode);
task.setPoint_code1(startPoint);
task.setPoint_code2(endPoint);
iSchBaseTaskService.create(task);
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code, task.getTask_code())
@@ -104,12 +90,35 @@ public class SecondFloorInStorageTask extends AbstractTask {
return (JSONObject) JSON.toJSON(task);
}
// @Transactional(propagation= Propagation.REQUIRES_NEW)
public String getStructCode(String vehicle_code) {
/**
* 载具信息校验
*/
protected String checkVehicleInfo(String vehicleCode) {
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.getOne(new QueryWrapper<BmVehicleInfo>()
.eq("vehicle_code", vehicleCode));
if (vehicleInfo == null) {
throw new BadRequestException("申请任务失败:载具" + vehicleCode + "信息不存在");
}
if (vehicleInfo.getH() == null) {
throw new BadRequestException("申请任务失败:载具" + vehicleCode + "高度等级信息不能为空");
}
List<MdPbVehicleMater> item = iMdPbVehicleMaterService.list(new LambdaQueryWrapper<MdPbVehicleMater>().eq(MdPbVehicleMater::getVehicle_code, vehicleCode));
if (CollectionUtils.isEmpty(item)) {
throw new BadRequestException("申请任务失败:载具" + vehicleCode + "载具物料信息信息不存在");
}
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicleCode)
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)) {
throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
return vehicleInfo.getH().toString();
}
public String getEndPoint(String vehicle_code) {
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code("无锁"))
.eq("stor_code", "CStockId");
.eq("stor_code", StatusEnum.STOCK_INFO.code("二楼ctu缓存库"));
query.isNull("vehicle_code");
List<StIvtStructattr> list = iStIvtStructattrService.list(query);
List<StIvtStructattr> structList = sameBlockNumRuleHandler.handler(list, null);
@@ -138,7 +147,7 @@ public class SecondFloorInStorageTask extends AbstractTask {
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public void finish(JSONObject data) {
data.put("status", StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
@@ -152,7 +161,7 @@ public class SecondFloorInStorageTask extends AbstractTask {
.eq("struct_code", schBaseTask.getPoint_code2());
iStIvtStructattrService.update(wrapper);
//更新出入库记录
List<MdPbVehicleMater> vehicleMaterList = vehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.eq("vehicle_code", schBaseTask.getVehicle_code())
.eq("is_delete", false));
if (ObjectUtil.isEmpty(vehicleMaterList)) {
@@ -177,7 +186,7 @@ public class SecondFloorInStorageTask extends AbstractTask {
record.setStor_code(attr.getStor_code());
record.setVehicle_form_data(vehicleMater.getForm_data());
record.setGrowth(true);
structivtflowService.save(record);
structIvtFlowService.save(record);
}
@Override
@@ -186,7 +195,17 @@ public class SecondFloorInStorageTask extends AbstractTask {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancel(JSONObject data) {
try {
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.update(new LambdaUpdateWrapper<StIvtStructattr>()
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁"))
.set(StIvtStructattr::getVehicle_code, null)
.eq(StIvtStructattr::getStruct_code, schBaseTask.getPoint_code2()));
this.updateTask(data);
} catch (Exception e) {
throw new BadRequestException("取消任务失败,失败原因:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,247 @@
package org.nl.wms.dispatch_manage.task.handler.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.record.service.IStIvtStructivtflowService;
import org.nl.wms.stor_manage.record.service.dao.StIvtStructivtflow;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* @author gbx
* &#064;Date 2025/2/12 13:30
* 二楼出库任务
*/
@Service("secondFloorOutStorage")
@Slf4j
public class SecondFloorOutStorageTask extends AbstractTask {
@Autowired
private IStIvtStructivtflowService structIvtFlowService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private SecondFloorInStorageTask secondFloorInStorageTask;
@Override
public JSONObject createTask(JSONObject from) {
SchBaseTask task = new SchBaseTask();
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setProduct_area(StatusEnum.PRODUCT_AREA.code("二层车间"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type(StatusEnum.ACS_TYPE.code("CTU任务"));
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setAgv_system_type(StatusEnum.ACS_SYSTEM_TYPE.code("海康CTU"));
task.setTask_type(StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库"));
task.setVehicle_code(from.getString("vehicleCode"));
task.setPoint_code1(from.getString("pointCode1"));
task.setPoint_code2(from.getString("pointCode2"));
task.setPoint_code3(from.getString("pointCode3"));
task.setPoint_code4(from.getString("pointCode4"));
task.setGroup_code(from.getString("groupCode"));
task.setVehicle_type(from.getString("vehicle_type"));
task.setSource_form_id(from.getString("source_form_id"));
iSchBaseTaskService.create(task);
//更新任务号
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code, task.getTask_code())
.set(MdPbVehicleMater::getRemark,"该料箱正在出库到站点"+from.getString("pointCode2")+"-"+from.getString("pointCode3"))
.eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code())
.eq(MdPbVehicleMater::getIs_delete, false));
return (JSONObject) JSON.toJSON(task);
}
/**
* @param billCode 单据编号
* @param siteCode 产线站点编号
* @param pointCode2 CTU站点编号
* @param vehicleCode 载具编号
* @param sourceFormId 载具物料ID
* @param inStructCode 货架仓位
*/
@Transactional(rollbackFor = Exception.class)
public JSONObject handleBills(String billCode, String siteCode, String pointCode2, String vehicleCode, String sourceFormId, String inStructCode) throws BadRequestException {
try {
// 创建任务
JSONObject taskJsonObject = new JSONObject();
//校验载具信息
taskJsonObject.put("vehicle_type", secondFloorInStorageTask.checkVehicleInfo(vehicleCode));
// 分配料架起点
List<StructattrVechielDto> starIvtList = iStIvtStructattrService.getStructFromBillCode(Arrays.asList(billCode.split(",")), vehicleCode);
if (ObjectUtils.isEmpty(starIvtList)) {
log.error("CTU出库任务该单据载具:{}的物料在CTU库查找不到仓位信息请检查", vehicleCode);
throw new BadRequestException("CTU出库任务该单据载具:" + vehicleCode + "的物料在CTU库查找不到仓位信息请检查");
}
StructattrVechielDto structattrVechielDto = starIvtList.get(0);
if (StringUtils.isBlank(structattrVechielDto.getStruct_code()) || Objects.equals(structattrVechielDto.getQty(), BigDecimal.ZERO)) {
return null;
}
//载具物料表更新物料状态正在出库
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", structattrVechielDto.getQty())
.eq("id", structattrVechielDto.getVm_id()));
//出库仓位锁住
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code("出库锁"))
.set("update_time", DateUtil.now())
.set("update_name", SecurityUtils.getCurrentNickName())
.in("struct_code", structattrVechielDto.getStruct_code()));
//入库仓位锁住
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code("入库锁"))
.set("update_time", DateUtil.now())
.set("update_name", SecurityUtils.getCurrentNickName())
.eq("struct_code", inStructCode));
taskJsonObject.put("pointCode1", structattrVechielDto.getStruct_code());
taskJsonObject.put("pointCode2", pointCode2);
taskJsonObject.put("pointCode3", inStructCode);
taskJsonObject.put("pointCode4", siteCode);
taskJsonObject.put("vehicleCode", vehicleCode);
taskJsonObject.put("source_form_id", sourceFormId);
return this.createTask(taskJsonObject);
} catch (BadRequestException e) {
log.error("CTU出库任务失败载具号{}", vehicleCode, e);
throw new BadRequestException(e.getMessage());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finish(JSONObject data) {
data.put("status", StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//更新起点仓位
String now = DateUtil.now();
UpdateWrapper<StIvtStructattr> wrapper1 = new UpdateWrapper<StIvtStructattr>()
.set("update_time", now)
.set("lock_type", StatusEnum.LOCK.code("无锁"))
.set("vehicle_code", null)
.eq("struct_code", schBaseTask.getPoint_code1());
iStIvtStructattrService.update(wrapper1);
//更新终点仓位
UpdateWrapper<StIvtStructattr> wrapper2 = new UpdateWrapper<StIvtStructattr>()
.set("update_time", now)
.set("lock_type", StatusEnum.LOCK.code("无锁"))
.set("vehicle_code", schBaseTask.getVehicle_code())
.eq("struct_code", schBaseTask.getPoint_code3());
iStIvtStructattrService.update(wrapper2);
//更新料架仓位
// UpdateWrapper<StIvtStructattr> wrapper2 = new UpdateWrapper<StIvtStructattr>()
// .set("update_time", now)
// .set("lock_type", StatusEnum.LOCK.code("无锁"))
// .set("vehicle_code", schBaseTask.getVehicle_code())
// .eq("struct_code", schBaseTask.getPoint_code3());
// iStIvtStructattrService.update(wrapper2);
//更新出入库记录
List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.eq("vehicle_code", schBaseTask.getVehicle_code())
.eq("is_delete", false));
if (ObjectUtil.isEmpty(vehicleMaterList)) {
throw new BadRequestException("任务完成失败,到载具物料信息: " + schBaseTask.getVehicle_code());
}
//扣库存
MdPbVehicleMater vehicleMater = vehicleMaterList.get(0);
// iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
// .set(MdPbVehicleMater::getFrozen_qty, 0)
// .set(MdPbVehicleMater::getIs_delete, true)
// .set(MdPbVehicleMater::getQty, 0)
// .eq(MdPbVehicleMater::getId, vehicleMater.getId()));
StIvtStructattr attr = iStIvtStructattrService.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", schBaseTask.getPoint_code1()).select("stor_code"));
StIvtStructivtflow record = new StIvtStructivtflow();
record.setId(IdUtil.getStringId());
record.setUpdate_time(now);
record.setVehicle_code(schBaseTask.getVehicle_code());
record.setMaterial_id(vehicleMater.getMaterial_id());
record.setPcsn(vehicleMater.getPcsn());
record.setQty(vehicleMater.getQty());
record.setChange_qty(vehicleMater.getQty());
record.setTask_type(StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库"));
record.setFrozen_qty(vehicleMater.getFrozen_qty());
record.setSource_form_type(vehicleMater.getSource_form_type());
record.setSource_form_id(vehicleMater.getSource_form_id());
record.setUnit_id(vehicleMater.getUnit_id());
record.setStruct_code(schBaseTask.getPoint_code2());
record.setStor_code(attr.getStor_code());
record.setVehicle_form_data(vehicleMater.getForm_data());
record.setGrowth(true);
structIvtFlowService.save(record);
}
@Override
public void updateStatus(JSONObject data) {
this.updateTask(data);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancel(JSONObject data) {
try {
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
//起点解锁
iStIvtStructattrService.update(new LambdaUpdateWrapper<StIvtStructattr>()
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁"))
.eq(StIvtStructattr::getStruct_code, schBaseTask.getPoint_code1()));
//终点解锁
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"))
.eq(SchBasePoint::getCode, schBaseTask.getPoint_code2()));
//入库仓位解锁
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code("无锁"))
.set("vehicle_code", null)
.set("update_time", DateUtil.now())
.set("update_name", SecurityUtils.getCurrentNickName())
.eq("struct_code", schBaseTask.getPoint_code3()));
//载具物料解锁
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getFrozen_qty, 0)
.eq(MdPbVehicleMater::getId, schBaseTask.getSource_form_id()));
this.updateTask(data);
} catch (Exception e) {
throw new BadRequestException("取消任务失败,失败原因:" + e.getMessage());
}
}
}

View File

@@ -121,7 +121,7 @@ public class ToPickPlatformTask extends AbstractTask {
data.put("status", StatusEnum.FORM_STATUS.code("完成"));
this.updateTask(data);
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE);
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE,schBaseTask.getPoint_code2());
}
@Override

View File

@@ -1,5 +1,6 @@
package org.nl.wms.dispatch_manage.task.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
@@ -64,7 +65,10 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
JSONObject errorTask(JSONObject param,String type);
JSONObject getIoSourceFormData(String vehicle_code, String pcsn);
List<Map> getIoSourceFormData(String vehicle_code, String pcsn);
/**
* 获取点位任务数量
*/
List<SchBaseTask> getTaskList(Set<String> pointCodes1, Set<String> pointCodes2, Set<String> pointCodes3, Set<String> pointCodes4);
}

View File

@@ -142,6 +142,10 @@ public class SchBaseTask implements Serializable {
/**
* 自定义参数
*/
@TableField(exist = false)
private String agv_system_type;
/**
* 载具高度类型
*/
private String vehicle_type;
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.dispatch_manage.task.service.dao.mapper;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -12,6 +13,7 @@ import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* <p>
@@ -26,5 +28,8 @@ public interface SchBaseTaskMapper extends BaseMapper<SchBaseTask> {
List<Map> getByVehicle(@Param("vehicles") List<String> vehicles);
JSONObject getIoSourceFormData(@Param("vehicle_code") String vehicle_code, @Param("pcsn") String pcsn);
List<Map> getIoSourceFormData(@Param("vehicle_code") String vehicle_code, @Param("pcsn") String pcsn);
List<SchBaseTask> getTaskList(Set<String> pointCodes1, Set<String> pointCodes2, Set<String> pointCodes3, Set<String> pointCodes4);
}

View File

@@ -41,7 +41,7 @@
</where>
ORDER BY t.create_time DESC
</select>
<select id="getIoSourceFormData" resultType="com.alibaba.fastjson.JSONObject">
<select id="getIoSourceFormData" resultType="java.util.Map">
SELECT
st_ivt_iostorinvdtl.source_form_data
FROM
@@ -75,4 +75,29 @@
#{vehicle_id}
</foreach>
</select>
<select id="getTaskList" resultType="org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask">
SELECT task_type,id,point_code1, point_code2
FROM SCH_BASE_TASK
WHERE
<trim prefix="(" suffix=")" prefixOverrides="OR">
<if test="pointCodes1 != null and pointCodes1.size() > 0">
OR point_code1 IN
<foreach item="code" collection="pointCodes1" open="(" separator="," close=")"> #{code} </foreach>
</if>
<if test="pointCodes2 != null and pointCodes2.size() > 0">
OR point_code2 IN
<foreach item="code" collection="pointCodes2" open="(" separator="," close=")"> #{code} </foreach>
</if>
<if test="pointCodes3 != null and pointCodes3.size() > 0">
OR point_code3 IN
<foreach item="code" collection="pointCodes3" open="(" separator="," close=")"> #{code} </foreach>
</if>
<if test="pointCodes4 != null and pointCodes4.size() > 0">
OR point_code4 IN
<foreach item="code" collection="pointCodes4" open="(" separator="," close=")"> #{code} </foreach>
</if>
</trim>
AND (status <![CDATA[ < ]]> '80')
AND (is_delete = '0')
</select>
</mapper>

View File

@@ -120,7 +120,6 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
Assert.notNull(entity.getStatus(), "任务状态不能为空!");
entity.setId(IdUtil.getStringId());
entity.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
entity.setCreate_name(nickName);
@@ -188,18 +187,22 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
);
if (ObjectUtils.isNotEmpty(vehicleMaterList)) {
//查找未完成的出库单与明细
JSONObject formData = this.getIoSourceFormData(task.getVehicle_code(), vehicleMaterList.get(0).getPcsn());
if (formData != null) {
String formDataId = formData.getJSONObject("source_form_data").getString("id");
String qty = formData.getJSONObject("source_form_data").getString("qty");
if (StringUtils.isNotBlank(formDataId) && StringUtils.isNotBlank(qty)) {
//查找非二楼任务的未完成的出库单与明细
if (StringUtils.isBlank(vehicleMaterList.get(0).getPrd_ppbom_no())) {
List<Map> formData = this.getIoSourceFormData(task.getVehicle_code(), vehicleMaterList.get(0).getPcsn());
if (ObjectUtils.isNotEmpty(formData)) {
Map<String, JSONObject> formDataMap = formData.get(0);
JSONObject formDataId = formDataMap.get("source_form_data");
String id = formDataId.getString("id");
String qty = formDataId.getString("qty");
if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(qty)) {
iPmFormDataService.update(new LambdaUpdateWrapper<PmFormData>()
.set(PmFormData::getQty, qty)
.eq(PmFormData::getId, formDataId));
}
}
}
}
handleFinishTask(param, task);
} else {
this.update(new UpdateWrapper<SchBaseTask>()
@@ -277,7 +280,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
return null;
}
public JSONObject getIoSourceFormData(String vehicle_code, String pcsn) {
public List<Map> getIoSourceFormData(String vehicle_code, String pcsn) {
return this.baseMapper.getIoSourceFormData(vehicle_code, pcsn);
}
@@ -376,4 +379,13 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
result.put("point_code2", new_struct_code);
return result;
}
/**
* 获取点位任务数量
*/
@Override
public List<SchBaseTask> getTaskList(Set<String> pointCodes1, Set<String> pointCodes2, Set<String> pointCodes3, Set<String> pointCodes4) {
return baseMapper.getTaskList(pointCodes1, pointCodes2, pointCodes3, pointCodes4);
}
}

View File

@@ -8,6 +8,7 @@ import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorOutStorageTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.external_system.acs.service.AcsToWmsService;
import org.nl.wms.external_system.dto.InteracteDto;

View File

@@ -59,8 +59,17 @@ public class WmsToAcsService{
.trace_id(MDC.get("trace_id"))
.type(type)
.data(arr).build();
TableDataInfo tableDataInfo = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto));
return tableDataInfo;
}
public TableDataInfo bindPodAndBerth(String podCode,String positionCode,String indBind,String type){
InteracteDto dto = InteracteDto.builder().service("wmsToAcsService")
.trace_id(MDC.get("trace_id"))
.type(type)
.data(MapOf.of("podCode", podCode, "positionCode", positionCode, "indBind", indBind))
.build();
TableDataInfo result = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto));
return result;
}
}

View File

@@ -0,0 +1,53 @@
package org.nl.wms.flow_manage.flow.service.classprocessimpl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.javaparser.utils.Log;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/*
* @author ZZQ
* @Date 2024/5/6 14:34
* 回传服务
*/
@Service
@Slf4j
public class CtuProcessHandler implements ClassProcess {
@Autowired
IPmFormDataService iPmFormDataService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
/**
* 回执单回传
*/
@Override
public JSONObject process(JSONObject from, JSONObject param) {
JSONObject vehicleMater = from.getJSONObject("vehicleMater");
JSONObject sourceFormData = from.getJSONObject("source_form_data");
String billCode = sourceFormData.getString("code");
try {
//更新物料载具信息的出库单据号
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("prd_ppbom_no", billCode)
.eq("id", vehicleMater.getString("id")));
} catch (Exception ex) {
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id"));
updateWrapper.set(PmFormData::getRemark, "更新物料载具信息的出库单据号失败,原因为:" + ex.getMessage());
iPmFormDataService.update(updateWrapper);
Log.error(ex.getMessage());
}
return from;
}
}

View File

@@ -77,10 +77,10 @@ public class StorageChangesProcessHandler implements ClassProcess {
String end_struct_code = valueMap.get("end_struct_code");
BigDecimal change_qty = StringUtils.isEmpty(valueMap.get("change_qty"))?null:new BigDecimal(valueMap.get("change_qty"));
if (StringUtils.isNotEmpty(start_struct_code)){
iStIvtStructattrService.changeStruct(start_struct_code,vehicle_code,param.getString("task_type"), change_qty,Boolean.FALSE);
iStIvtStructattrService.changeStruct(start_struct_code,vehicle_code,param.getString("task_type"), change_qty,Boolean.FALSE,null);
}
if (StringUtils.isNotEmpty(end_struct_code)){
iStIvtStructattrService.changeStruct(end_struct_code,vehicle_code,param.getString("task_type"), change_qty,change_qty.intValue()<0?Boolean.FALSE:Boolean.TRUE);
iStIvtStructattrService.changeStruct(end_struct_code,vehicle_code,param.getString("task_type"), change_qty,change_qty.intValue()<0?Boolean.FALSE:Boolean.TRUE,null);
}
}
return from;

View File

@@ -129,6 +129,10 @@ public class MdPbVehicleMater implements Serializable {
* 流程实例
*/
private String proc_inst_id;
/**
* 用料单号
*/
private String prd_ppbom_no;
/**
* 是否需要拣选(针对托盘)
*/

View File

@@ -1,18 +1,26 @@
package org.nl.wms.md_manage.vehicleMater.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.md_manage.vehicleMater.service.dao.mapper.MdPbVehicleMaterMapper;
import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
/**
* <p>
@@ -42,6 +50,9 @@ public class MdPbVehicleMaterServiceImpl extends ServiceImpl<MdPbVehicleMaterMap
return this.baseMapper.getVehicleMaters(vehicle_code);
}
@Override
public Map<String, String> getVehicleCode2Id(String material_id,String... vehicle_code) {
if (vehicle_code!=null){

View File

@@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
@@ -20,7 +19,6 @@ import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService;
import org.nl.wms.md_manage.group_dick.service.dao.MdGruopDick;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired;
@@ -73,7 +71,11 @@ public class IOStorageController {
.eq("lock_type", StatusEnum.LOCK.code("无锁"))
.eq("vehicle_code", vehicle_code);
List<StIvtStructattr> list = iStIvtStructattrService.list(query);
if (ObjectUtils.isNotEmpty(list)) {
//todo 二楼出库调通后注释
long storageCount = list.stream().filter(r -> r.getStor_code().equals(StatusEnum.STOCK_INFO.code("FStockPallet")) ||
r.getStor_code().equals(StatusEnum.STOCK_INFO.code("料箱库")) ||
r.getStor_code().equals(StatusEnum.STOCK_INFO.code("虚拟库"))).count();
if (storageCount > 0) {
throw new BadRequestException(String.format("出库确认失败:当前载具号在立库的库位中未出库:%s中请核查库存记录!", list.get(0).getStruct_code()));
}
}, StatusEnum.STRATEGY_TYPE.code("出库") + vehicle_code, 5);

View File

@@ -3,7 +3,8 @@ package org.nl.wms.pda_manage.iostorage;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
@@ -14,7 +15,6 @@ import org.nl.common.utils.ListOf;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.pda_manage.iostorage.server.dto.PdaFormOutMst;
import org.nl.wms.pda_manage.iostorage.server.dto.PdaMaterOutMst;
import org.nl.wms.pda_manage.iostorage.sevice.PdaIOService;
@@ -83,6 +83,32 @@ public class PdaOutController {
return new ResponseEntity<>(TableDataInfo.build(iPmFormDataService.queryTree(query, page)), HttpStatus.OK);
}
@GetMapping("getCtuOrderList")
@Log("查询二楼生产出库单据")
@SaIgnore
public ResponseEntity<TableDataInfo<PmFormDataDto>> getCtuOrderList(FormDataQuery query, PageQuery page) {
if (query == null || StringUtils.isBlank(query.getBill_code()) || StringUtils.isBlank(query.getSite_code())) {
throw new BadRequestException("查询失败,产线编号或用料单据号有误,请检查!");
}
page.setPage(1);
page.setSize(100);
page.setPage(page.getPage() - 1);
page.setSort("create_time,desc");
//query.setStatus(new String[]{StatusEnum.FORM_STATUS.code("生成"),StatusEnum.FORM_STATUS.code("执行中")});
Page<PmFormDataDto> list = iPmFormDataService.queryCtuOrderList(query, page);
TableDataInfo<PmFormDataDto> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(cn.hutool.http.HttpStatus.HTTP_OK));
rspData.setMsg("查询成功");
rspData.setContent(list.getRecords());
//给前端作去重
if (ObjectUtils.isNotEmpty(list.getRecords())) {
rspData.setData(list.getRecords().get(0).getPrd_ppbom_no());
}
rspData.setTotalElements(list.getTotal());
return new ResponseEntity<>(rspData, HttpStatus.OK);
}
@PostMapping("orderConfirm")
@Log("查询单据数据")
@SaIgnore
@@ -95,10 +121,10 @@ public class PdaOutController {
}
/**
*
* 一楼单据出库确认
*/
@PostMapping("confirm")
@Log("出库确认")
@Log("一楼单据出库确认")
@SaIgnore
public ResponseEntity<TableDataInfo> confirm(@RequestBody PdaFormOutMst pdaFormOutMst) {
RedissonUtils.lock(() -> {
@@ -107,6 +133,38 @@ public class PdaOutController {
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
/**
* 二楼生产出库单据确认
*/
@PostMapping("ctuOutConfirm")
@Log("二楼生产出库单据确认")
@SaIgnore
public ResponseEntity<TableDataInfo> ctuOutConfirm(@RequestBody PdaFormOutMst pdaFormOutMst) {
RedissonUtils.lock(() -> {
pdaIOService.ctuOutConfirm(pdaFormOutMst);
}, pdaFormOutMst.getBill_code(), null);
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
/**
* 二楼产线站点人工从货架取货确认
*/
@PostMapping("takeConfirm")
@Log("二楼产线站点人工从货架取货出库确认")
@SaIgnore
public ResponseEntity<TableDataInfo> takeConfirm(@RequestBody JSONObject param) {
if (param == null || StringUtils.isEmpty(param.getString("site_code"))) {
throw new BadRequestException("请求参数不能为空");
}
RedissonUtils.lock(() -> {
pdaIOService.takeConfirm(param);
}, "takeConfirm", null);
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
@PostMapping("materConfirm")
@Log("物料出库确认")
@SaIgnore

View File

@@ -133,6 +133,15 @@ public class PdaFormOutMst implements Serializable {
*/
private JSONObject form_data;
/**
* 单据编号
*/
private String bill_code;
/**
* 产线站点编号
*/
private String site_code;
/**
* 关联上级表单id
*/

View File

@@ -6,10 +6,13 @@ import com.alibaba.fastjson.JSONArray;
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.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.*;
@@ -19,8 +22,15 @@ import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.base_manage.material.service.impl.MdMeMaterialbaseServiceImpl;
import org.nl.wms.base_manage.measure.service.dao.BmMeasureUnit;
import org.nl.wms.base_manage.measure.service.impl.BmMeasureUnitServiceImpl;
import org.nl.wms.base_manage.sect.service.IStIvtSectattrService;
import org.nl.wms.base_manage.sect.service.dao.StIvtSectattr;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorOutStorageTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.erp.dto.ErpQuery;
import org.nl.wms.external_system.erp.dto.ErpSec;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
@@ -42,6 +52,7 @@ import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl;
import org.nl.wms.system_manage.service.quartz.task.ApplyShelfScheduleService;
import org.nl.wms.system_manage.service.quartz.task.SyncErpBillsScheduleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -49,15 +60,12 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class PdaIOService {
@Autowired
@@ -84,17 +92,26 @@ public class PdaIOService {
private StIvtBsrealstorattrServiceImpl stIvtBsrealstorattrServiceImpl;
@Autowired
private MdMeMaterialbaseServiceImpl mdMeMaterialbaseServiceImpl;
@Resource
@Autowired
private PmFormDataMapper pmFormDataMapper;
@Autowired
private IPmFormDataService iPmFormDataService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private SecondFloorOutStorageTask secondFloorOutStorageTask;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ApplyShelfScheduleService applyShelfScheduleService;
/**
* 手持物料出库不回传
*
* @param pdaFormOutMst
*/
public void PdaMaterOutStorage(PdaMaterOutMst pdaFormOutMst) {
@@ -152,8 +169,161 @@ public class PdaIOService {
iStIvtIostorinvService.save(mst);
this.pdaTaskOpen(mst);
}
/**
* 二楼生产出库单据确认
*/
public void ctuOutConfirm(PdaFormOutMst pdaFormOutMst) {
String billCode = pdaFormOutMst.getBill_code();
String siteCode = pdaFormOutMst.getSite_code();
JSONArray jsonArray = new JSONArray();
if (StringUtils.isBlank(billCode) || StringUtils.isBlank(siteCode) || ObjectUtils.isEmpty(pdaFormOutMst.getChildren())) {
throw new BadRequestException("出库失败,请求参数不能为空");
}
// 可以用货架列表
List<SchBasePoint> endPointList = iSchBasePointService.list(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getIs_used, true)
.eq(SchBasePoint::getLock_type, StatusEnum.LOCK.code("无锁"))
.eq(SchBasePoint::getRegion_code, StatusEnum.REGION_INFO.code("二楼CTU货架对接位"))
.isNotNull(SchBasePoint::getVehicle_code));
if (ObjectUtils.isEmpty(endPointList)) {
log.error("CTU出库任务该单据{}出库时,地面货架站点暂无可用货架,请检查现场情况", billCode);
throw new BadRequestException("地面货架站点暂无可用货架,请检查现场情况");
}
for (int i = 0; i < pdaFormOutMst.getChildren().size(); i++) {
try {
// 可以货架的库位
List<StIvtStructattr> stIvtStructattrList = iStIvtStructattrService.list(new LambdaQueryWrapper<StIvtStructattr>()
.eq(StIvtStructattr::getIs_used, true)
.eq(StIvtStructattr::getSect_code, endPointList.get(0).getVehicle_code())
.eq(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁"))
.eq(StIvtStructattr::getStor_code, StatusEnum.STOCK_INFO.code("二楼货架缓存库"))
.isNull(StIvtStructattr::getVehicle_code)
.orderByAsc(StIvtStructattr::getLayer_num));
if (ObjectUtils.isEmpty(stIvtStructattrList)) {
log.error("CTU出库任务该单据{}出库时,地面货架站点货架的货位已放满,请检查现场情况", billCode);
throw new BadRequestException("地面货架站点货架的货位已放满,请检查现场情况");
}
// CTU分配终点
List<SchBasePoint> targetPointList = endPointList.stream().filter(r -> r.getVehicle_code().equals(stIvtStructattrList.get(0).getSect_code())).collect(Collectors.toList());
if (targetPointList.size() > 1) {
log.error("CTU出库任务该单据{}出库时,地面货架站点货架的货位存在相同货架编号,请检查现场情况", billCode);
throw new BadRequestException("地面货架站点货架的货位存在相同货架编号,请检查现场情况");
}
if (StringUtils.isBlank(pdaFormOutMst.getChildren().get(i).getVehicle_code())) {
throw new BadRequestException("出库失败,料箱码不能为空");
}
JSONObject jsonObject = secondFloorOutStorageTask.handleBills(billCode, siteCode, targetPointList.get(0).getCode(), pdaFormOutMst.getChildren().get(i).getVehicle_code(), pdaFormOutMst.getChildren().get(i).getId(), stIvtStructattrList.get(0).getStruct_code());
jsonArray.add(jsonObject);
} catch (BadRequestException e) {
log.error("单据号:{}的第{}行明细,物料号为:{},出库异常:", billCode, i, pdaFormOutMst.getChildren().get(i).getMaterial_code(), e);
//载具物料表更新物料状态出库异常
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getRemark, "出库异常:" + e.getMessage())
.eq(MdPbVehicleMater::getId, pdaFormOutMst.getChildren().get(i).getId()));
}
}
if (ObjectUtils.isNotEmpty(jsonArray)) {
//终点锁住
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getLock_type, StatusEnum.LOCK.code("出库锁"))
.eq(SchBasePoint::getCode, endPointList.get(0).getCode()));
List<String> taskIdList = jsonArray.stream().map(r -> ((JSONObject) r).getString("id")).collect(Collectors.toList());
//todo 终点货位锁定
//任务分组
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getGroup_code, pdaFormOutMst.getSite_code() + "_" + IdUtil.getStringId() + "_" + jsonArray.size()).
in(SchBaseTask::getId, taskIdList));
}
}
/**
* 二楼产线站点人工从货架取货确认
*/
@Transactional(rollbackFor = Exception.class)
public void takeConfirm(JSONObject param) {
List<SchBasePoint> pointList = iSchBasePointService.list(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getIs_used, true)
.eq(SchBasePoint::getCode, param.getString("site_code")));
if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("输入的站点编号有误或被禁用,请检查!");
}
if (StringUtils.isNotBlank(pointList.get(0).getVehicle_code())) {
//货架解绑
// iSchBasePointService.bindOrUnbind(param.getString("site_code"), pointList.get(0).getVehicle_code(), "0");
List<StIvtStructattr> stIvtStructattrList = iStIvtStructattrService.list(new LambdaQueryWrapper<StIvtStructattr>()
.eq(StIvtStructattr::getSect_code, pointList.get(0).getVehicle_code())
.isNotNull(StIvtStructattr::getVehicle_code));
List<String> vehicleCodeList = stIvtStructattrList.stream()
.map(StIvtStructattr::getVehicle_code)
.collect(Collectors.toList());
//清除载具物料组盘信息
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty",0)
.set("qty",0)
.set("remark","该料箱的物料已从产线取走")
.in("vehicle_code",vehicleCodeList));
//清除货架库位
iStIvtStructattrService.update(new LambdaUpdateWrapper<StIvtStructattr>()
.set(StIvtStructattr::getVehicle_code, null)
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁"))
.set(StIvtStructattr::getUpdate_name, DateUtil.now())
.set(StIvtStructattr::getUpdate_name, SecurityUtils.getCurrentNickName())
.eq(StIvtStructattr::getSect_code, pointList.get(0).getVehicle_code())
.eq(StIvtStructattr::getStor_code, StatusEnum.STOCK_INFO.code("二楼货架缓存库")));
//标记为空架
iSchBasePointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getPoint_type, 0)
.eq(SchBasePoint::getCode, pointList.get(0).getCode()));
//生成补空架任务
applyShelfScheduleService.taskPublish(param.getString("site_code"), null, pointList.get(0).getVehicle_code(), false);
}
}
/**
* 二楼生产出库单据确认
*/
public void ctuOutConfirm1(PdaFormOutMst pdaFormOutMst) {
// StIvtIostorinv mst = new StIvtIostorinv();
// {
// mst.setId(IdUtil.getStringId());
// mst.setCreate_name(SecurityUtils.getCurrentNickName());
// mst.setCreate_time(DateUtil.now());
// mst.setCode(CodeUtil.getNewCode("IO_CODE"));
// mst.setStatus(StatusEnum.FORM_STATUS.code("已分配"));
// mst.setProduct_area("A2");
// mst.setBill_type(StatusEnum.IOBILL_TYPE_OUT.code("生产出库"));
// mst.setIn_storage(false);
// mst.setProduct_area(pdaFormOutMst.getProduct_area());
// mst.setForm_data(new JSONObject(MapOf.of("shipper", null, "product_area", pdaFormOutMst.getProduct_area())));
// }
// StIvtIostorinvdtl ivtDtl = new StIvtIostorinvdtl();
// {
// ivtDtl.setMaterial_id(vechielDto.getMaterial_id());
// ivtDtl.setForm_data(new JSONObject());
// ivtDtl.setQty(structattrVechielDto.getQty());
// ivtDtl.setPcsn(structattrVechielDto.getPcsn());
// ivtDtl.setStor_code("HStockId");
// ivtDtl.setId(IdUtil.getStringId());
// ivtDtl.setVehicle_code(structattrVechielDto.getVehicle_code());
// ivtDtl.setVehicle_id(vechielDto.getVm_id());
// ivtDtl.setInv_id(mst.getId());
// ivtDtl.setStatus(StatusEnum.FORM_STATUS.code("生成"));
// ivtDtl.setSource_form_data(new JSONObject());
// }
// iStIvtIostorinvdtlService.save(ivtDtl);
// iStIvtIostorinvService.save(mst);
//this.pdaTaskOpen(mst);
}
/**
* 手持单据出库
*
* @param pdaFormOutMst
*/
public void PpdaOrderOutStorage(PdaFormOutMst pdaFormOutMst) {

View File

@@ -2,24 +2,26 @@ package org.nl.wms.pda_manage.palletio.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.pda_manage.palletio.service.PalletIostorinvService;
import org.nl.wms.pda_manage.palletio.service.dto.LabelValueVo;
import org.nl.wms.stor_manage.io.service.dto.StorInvQuery;
import org.nl.wms.stor_manage.io.service.iostor.IStIvtIostorinvService;
import org.nl.wms.stor_manage.io.service.iostor.dao.StIvtIostorinv;
import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@@ -43,9 +45,12 @@ public class PalletStIvtIostorinvController {
, "二楼左侧靠托盘库", "2127", "三楼出库点", "3110");
@Autowired
private PalletIostorinvService palletIostorinvService;
@Autowired
private ISchBasePointService pointService;
/**
* 手持托盘入库
*
* @param form
* @return
*/
@@ -88,5 +93,32 @@ public class PalletStIvtIostorinvController {
return new ResponseEntity<>(result, HttpStatus.OK);
}
/**
* 二楼站点扫码
*/
@PostMapping("queryTargetPoint")
@SaIgnore
@Log("二楼站点扫码")
public ResponseEntity<Object> queryTargetPoint(@RequestBody JSONObject form) {
if (form == null || StringUtils.isEmpty(form.getString("site_code"))) {
throw new BadRequestException("请求参数不能为空");
}
List<SchBasePoint> pointList = pointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getCode, form.getString("site_code")).eq(SchBasePoint::getIs_used, true));
if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("输入的站点编号有误或被禁用,请检查!");
}
SchBasePoint point = pointList.get(0);
if (!StatusEnum.LOCK.code("无锁").equals(point.getLock_type())) {
throw new BadRequestException("当前站点已绑定货架,请检查或解绑!");
}
JSONObject result = new JSONObject();
result.put("code", "200");
result.put("status", "200");
result.put("msg", "查询成功!");
result.put("message", "查询成功!");
result.put("site_code", point.getCode());
return new ResponseEntity<>(result, HttpStatus.OK);
}
}

View File

@@ -37,6 +37,8 @@ public interface IPmFormDataService extends IService<PmFormData> {
Page<PmFormDataDto> queryTree(FormDataQuery query, PageQuery page);
Page<PmFormDataDto> queryCtuOrderList(FormDataQuery query, PageQuery page);
/**
* 查询ERP同步数据及库存
* @param code

View File

@@ -26,6 +26,8 @@ public interface PmFormDataMapper extends BaseMapper<PmFormData> {
List<PmFormDataDto> queryTree(@Param("query")FormDataQuery query);
List<PmFormDataDto> queryTree2(@Param("query") FormDataQuery query);
List<PmFormDataDto> queryCtuOrderList(@Param("query") FormDataQuery query);
List<PmFormDataDto> selectChilds(List<String> parents);

View File

@@ -176,7 +176,28 @@
#{parent_id}
</foreach>
</select>
<select id="queryCtuOrderList" resultType="org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto">
SELECT
v.*,
m.material_code,
m.material_name,
m.material_spec,
m.single_weight,
u.unit_name
FROM
md_pb_vehiclemater v
LEFT JOIN
md_me_materialbase m ON v.material_id = m.material_id
LEFT JOIN
bm_measure_unit u ON v.unit_id = u.unit_id
<where>
v.is_delete = '0'
<if test="query.bill_code != null and query.bill_code != ''">
AND v.prd_ppbom_no = #{query.bill_code}
</if>
</where>
ORDER BY v.create_time DESC
</select>
<select id="queryOrderStockId" resultType="org.nl.wms.pda_manage.iostorage.server.dto.ReceiveBillData">
SELECT d.unit_id,
d.id AS dId,

View File

@@ -16,6 +16,8 @@ import java.util.Map;
public class FormDataQuery extends BaseQuery<PmFormData> {
private String form_type;
private String code;
private String bill_code;
private String site_code;
private String search;
private String parent_id;
private String mater;

View File

@@ -63,6 +63,11 @@ public class PmFormDataDto implements Serializable {
* 业务单据状态
*/
private String status;
/**
* 物料状态
*/
private String material_status;
/**
* 业务单据状态
*/
@@ -103,6 +108,11 @@ public class PmFormDataDto implements Serializable {
* 数量
*/
private BigDecimal qty;
/**
* 冻结数量
*/
private BigDecimal frozen_qty;
/**
* 库存数量
*/
@@ -141,7 +151,10 @@ public class PmFormDataDto implements Serializable {
* 载具组盘id
*/
private String vehicle_id;
/**
* 出库单据号
*/
private String prd_ppbom_no;
/**
* 自定义表单字段

View File

@@ -269,9 +269,9 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
public com.baomidou.mybatisplus.extension.plugins.pagination.Page<PmFormDataDto> queryTree(FormDataQuery query, PageQuery pageQuery) {
Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize());
page.setOrderBy("id DESC");
List<PmFormDataDto> pmFormDataDtos = this.baseMapper.queryTree2(query);
if (!CollectionUtils.isEmpty(pmFormDataDtos)) {
handleFormDatas(pmFormDataDtos);
List<PmFormDataDto> pmFormDataList = this.baseMapper.queryTree2(query);
if (!CollectionUtils.isEmpty(pmFormDataList)) {
handleFormDatas(pmFormDataList);
} else {
//根据单据编号查询Erp单据
List<SyncFormMapping> list = iSyncFormMappingService.list(new LambdaQueryWrapper<SyncFormMapping>().eq(SyncFormMapping::getForm_type, query.getForm_type()));
@@ -290,10 +290,33 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
}
}
com.baomidou.mybatisplus.extension.plugins.pagination.Page<PmFormDataDto> dtoPage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPages(), page.getPageSize(), page.getTotal());
dtoPage.setRecords(pmFormDataDtos);
dtoPage.setRecords(pmFormDataList);
return dtoPage;
}
@Override
public com.baomidou.mybatisplus.extension.plugins.pagination.Page<PmFormDataDto> queryCtuOrderList(FormDataQuery query, PageQuery pageQuery) {
Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize());
List<PmFormDataDto> pmFormDataList = this.baseMapper.queryCtuOrderList(query);
pmFormDataList.forEach(r -> {
if (r.getQty().compareTo(BigDecimal.ZERO)<=0) {
r.setStatus("3");
r.setMaterial_status("已出库");
} else if (r.getFrozen_qty().compareTo(BigDecimal.ZERO) > 0) {
r.setStatus("2");
r.setMaterial_status("正在出库");
} else {
r.setStatus("1");
r.setMaterial_status("未出库");
}
});
com.baomidou.mybatisplus.extension.plugins.pagination.Page<PmFormDataDto> dtoPage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPages(), page.getPageSize(), page.getTotal());
dtoPage.setRecords(pmFormDataList);
return dtoPage;
}
private void handleFormDatas(List<PmFormDataDto> pmFormDataDtos) {
List<String> parents = pmFormDataDtos.stream().map(PmFormDataDto::getId).collect(Collectors.toList());
List<PmFormDataDto> childs = this.baseMapper.selectChilds(parents);

View File

@@ -34,7 +34,7 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
, String vehicle_code
, String task_type
, BigDecimal change_qty
, Boolean growth);
, Boolean growth,String point_code2);
void deleteAll(Long[] ids);
Object pageQuery(StructattrQuery query, PageQuery page);
@@ -53,7 +53,12 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
List<StructattrVechielDto> structVehicle(Map query);
List<StructattrVechielDto> getStructFromBillCode(List<String> billCodeList, String vehicleCode);
TableDataInfo<Map> getStructIvt(StructattrQuery query, PageQuery page);
List<StructAssignQty> getStructIvtAssign(List<String> materials, String stor_code);
}

View File

@@ -26,6 +26,8 @@ public interface StIvtStructattrMapper extends BaseMapper<StIvtStructattr> {
List<StructattrVechielDto> collectVehicle(Map query);
List<StructattrVechielDto> structVehicle(Map query);
List<StructattrVechielDto> getStructFromBillCode(List<String> billCodeList, String vehicleCode);
List<Map> getStructIvt(@Param("query")StructattrQuery query, PageQuery pageQuery);

View File

@@ -97,6 +97,22 @@
order by ${order_by}
</if>
</select>
<select id="getStructFromBillCode" resultType="org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto">
SELECT md_pb_vehicleMater.qty,
md_pb_vehicleMater.frozen_qty,
md_pb_vehicleMater.material_id,
md_pb_vehicleMater.pcsn,
md_pb_vehicleMater.id as vm_id,
st_ivt_structattr.*
FROM md_pb_vehicleMater
LEFT JOIN st_ivt_structattr ON st_ivt_structattr.vehicle_code = md_pb_vehicleMater.vehicle_code
WHERE md_pb_vehicleMater.vehicle_code = #{vehicleCode}
and st_ivt_structattr.stor_code = 'CStockId'
and md_pb_vehicleMater.prd_ppbom_no in
<foreach collection="billCodeList" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
<select id="structVehicle" resultType="org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto">
SELECT md_pb_vehicleMater.qty,
md_pb_vehicleMater.frozen_qty,

View File

@@ -78,7 +78,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
}
@Override
public void changeStruct(String struct_code, String vehicle_code, String task_type, BigDecimal change_qty, Boolean growth) {
public void changeStruct(String struct_code, String vehicle_code, String task_type, BigDecimal change_qty, Boolean growth, String point_code2) {
String now = DateUtil.now();
UpdateWrapper<StIvtStructattr> wrapper = new UpdateWrapper<StIvtStructattr>()
.set("update_time", now)
@@ -100,19 +100,19 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
List<StIvtStructivtflow> records = new ArrayList<>();
StIvtStructattr attr = this.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", struct_code).select("stor_code"));
//更新冻结数量
for (MdPbVehicleMater vehicleMater : vehicleMaters) {
String vehicleCode = vehicleMater.getVehicle_code();
BigDecimal subtract = vehicleMater.getQty().subtract(vehicleMater.getFrozen_qty());
//100-出50 = 50
UpdateWrapper<MdPbVehicleMater> update = new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", 0)
.set("qty", subtract)//50
.set("proc_inst_id", null)
.set("update_time", now)
.eq("id", vehicleMater.getId());
if (vehicleCode.contains("T") && subtract.intValue()>0){
//托盘和料箱拣选更新物料数量
if (subtract.intValue() > 0) {
//托盘拣选
if (vehicleCode.contains("T")) {
String groupId = vehicleMater.getGroup_id();
MdGruopDick mst = iMdGruopDickService.getById(groupId);
if (mst != null) {
@@ -125,6 +125,13 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
update.set("need_pick", true);
update.set("remark", "托盘" + vehicleMater.getVehicle_code() + "为人工拣选,请先拣选" + vehicleMater.getFrozen_qty() + ",在直接回库!");
}
update.set("qty", subtract);//50
} else {
//托盘整出需要扣库存,除了二楼料箱整出不扣库存,其他都扣库存
if (!("2114").equals(point_code2)) {
update.set("qty", subtract);
}
}
vehicleMaterService.update(update);
StIvtStructivtflow record = new StIvtStructivtflow();
record.setId(IdUtil.getStringId());
@@ -144,7 +151,6 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
record.setVehicle_form_data(vehicleMater.getForm_data());
record.setGrowth(growth);
records.add(record);
}
if (!CollectionUtils.isEmpty(records)){
structivtflowService.saveBatch(records);
@@ -198,12 +204,14 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
return collectVehicle;
}
@Override
public List<StructattrVechielDto> structVehicle(Map query) {
List<StructattrVechielDto> structVehicle = this.baseMapper.structVehicle(query);
return structVehicle;
}
@Override
public TableDataInfo<Map> getStructIvt(StructattrQuery query, PageQuery pageQuery) {
if (StringUtils.isNotBlank(query.getMaterial()) || StringUtils.isNotBlank(query.getPcsn())) {
@@ -281,4 +289,9 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
List<StructAssignQty> mst_detail = this.baseMapper.getStructIvtAssign(materials, stor_code);
return mst_detail;
}
@Override
public List<StructattrVechielDto> getStructFromBillCode(List<String> billCodeList, String vehicleCode) {
return this.baseMapper.getStructFromBillCode(billCodeList, vehicleCode);
}
}

View File

@@ -0,0 +1,119 @@
package org.nl.wms.system_manage.service.quartz.task;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.BaseCode;
import org.nl.common.utils.IdUtil;
import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorEmptyShelfTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.external_system.acs.service.WmsToAcsService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
/*
* @author ZZQ
* @Date 2023/3/22 17:14
*/
@Service
@Slf4j
public class ApplyShelfScheduleService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private WmsToAcsService wmsToAcsService;
@Autowired
private SecondFloorEmptyShelfTask secondFloorEmptyShelfTask;
private final String THIS_CLASS = ApplyShelfScheduleService.class.getName();
public void run() {
try {
MDC.put("requestMethod", "TaskScheduleService#run");
MDC.put("requestIp", "127.0.0.1");
MDC.put("requestTime", DateUtil.now());
LuceneAppender.traceIdTL.set(BaseCode.intToChars(IdUtil.getLongId()));
this.taskPublish(null, null, null, true);
} finally {
LuceneAppender.traceIdTL.remove();
}
}
/**
* 空架搬运任务
*
* @param pointCode1 起点
* @param pointCode2 终点
* @param vehicleCode1 载具号
* @param isAuto 是否自动生成
*/
@SneakyThrows
public void taskPublish(String pointCode1, String pointCode2, String vehicleCode1, boolean isAuto) {
RLock lock = redissonClient.getLock(THIS_CLASS);
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
String startPointCode = pointCode1;
String endPointCode = pointCode2;
String vehicleCode = vehicleCode1;
if (isAuto) {
List<SchBasePoint> cxPointLists = iSchBasePointService.checkEndPointTask(
StatusEnum.REGION_INFO.code("二楼AGV产线对接位"),
StatusEnum.LOCK.code("出库锁"),
StatusEnum.SORT_TYPE.code("升序"), "0");
if (ObjectUtils.isNotEmpty(cxPointLists)) {
startPointCode = cxPointLists.get(0).getCode();
vehicleCode = cxPointLists.get(0).getVehicle_code();
List<SchBasePoint> ctuPointList = iSchBasePointService.checkEndPointTask(
StatusEnum.REGION_INFO.code("二楼CTU货架对接位"),
StatusEnum.LOCK.code("无锁"),
StatusEnum.SORT_TYPE.code("升序"), null
);
if (ObjectUtils.isNotEmpty(ctuPointList)) {
endPointCode = ctuPointList.get(0).getCode();
}
}
} else {
endPointCode = iSchBasePointService.checkEndPointTask(
StatusEnum.REGION_INFO.code("二楼CTU货架对接位"),
StatusEnum.LOCK.code("无锁"),
StatusEnum.SORT_TYPE.code("升序"), null
).get(0).getCode();
}
if (StringUtils.isNotBlank(startPointCode) && StringUtils.isNotBlank(endPointCode)) {
JSONObject task = new JSONObject();
task.put("pointCode1", startPointCode);
task.put("pointCode2", endPointCode);
task.put("vehicleCode", vehicleCode);
secondFloorEmptyShelfTask.createTask(task);
}
}
} catch (Exception ex) {
log.error("定时任务执行异常:" + ex.getMessage());
ex.printStackTrace();
} finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}

View File

@@ -1,10 +1,13 @@
package org.nl.wms.system_manage.service.quartz.task;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.TableDataInfo;
@@ -12,6 +15,7 @@ import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.BaseCode;
import org.nl.common.utils.IdUtil;
import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorAgvTransferTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.acs.service.WmsToAcsService;
@@ -33,12 +37,15 @@ import java.util.stream.Collectors;
@Slf4j
public class TaskScheduleService {
private ReentrantLock lock = new ReentrantLock();
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private WmsToAcsService wmsToAcsService;
@Autowired
private SecondFloorAgvTransferTask secondFloorAgvTransferTask;
public void run() {
try {
@@ -50,29 +57,22 @@ public class TaskScheduleService {
} finally {
LuceneAppender.traceIdTL.remove();
}
}
public void taskPublish(){
boolean islock = lock.tryLock();
try {
if (islock) {
//定时任务查询所有自动下发acs的任务
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("is_send", true)
.eq("status", StatusEnum.FORM_STATUS.code("生成")));
if (!CollectionUtils.isEmpty(list)) {
//确认调度系统
list.forEach(task -> {
if (task.getAcs_type().equals(StatusEnum.ACS_TYPE.code("CTU任务"))) {
task.setAgv_system_type(StatusEnum.ACS_SYSTEM_TYPE.code("海康CTU"));
} else {
task.setAgv_system_type(StatusEnum.ACS_SYSTEM_TYPE.code("NDC"));
}
});
List<String> taskCodes = list.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
//定时任务查询所有自动下发acs的任务与CTU出库完成的任务
List<SchBaseTask> taskList = iSchBaseTaskService.list(
new LambdaQueryWrapper<SchBaseTask>()
.or(r -> r.eq(SchBaseTask::getIs_send, true).eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("生成")))
.or(r -> r.eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成")).eq(SchBaseTask::getTask_step, "1")).eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库")));
List<SchBaseTask> createTaskList = taskList.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成"))).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(createTaskList)) {
List<String> taskCodes = createTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
log.info("---执行定时222任务:-----taskPublish-----" + taskCodes);
TableDataInfo response = wmsToAcsService.interationToExt(list, "createTask");
TableDataInfo response = wmsToAcsService.interationToExt(createTaskList, "createTask");
if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) {
JSONArray results = (JSONArray) JSON.toJSON(response.getData());
if (!CollectionUtils.isEmpty(results)) {
@@ -92,6 +92,28 @@ public class TaskScheduleService {
.in("task_code", taskCodes));
}
}
List<SchBaseTask> finishTaskList = taskList.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(finishTaskList)) {
finishTaskList.stream().collect(Collectors.groupingBy(SchBaseTask::getGroup_code)).forEach((g, t) -> {
String targetCode = g.split("_")[0];
int targetSize = Integer.parseInt(g.substring(g.lastIndexOf("_") + 1));
//任务组任务全部完成
if (targetSize == t.size()) {
//创建agv任务
JSONObject taskJsonObject = new JSONObject();
taskJsonObject.put("pointCode1", t.get(0).getPoint_code2());
taskJsonObject.put("pointCode2", targetCode);
taskJsonObject.put("pointCode3", t.get(0).getPoint_code3().substring(0, t.get(0).getPoint_code3().indexOf("-")));
taskJsonObject.put("group_code", g);
taskJsonObject.put("vehicleCode", t.stream().map(SchBaseTask::getVehicle_code).collect(Collectors.joining(",")));
secondFloorAgvTransferTask.createTask(taskJsonObject);
//更新agv任务已创建
iSchBaseTaskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getTask_step, "2")
.in(SchBaseTask::getId, t.stream().map(SchBaseTask::getId).collect(Collectors.toList())));
}
});
}
}
}catch (Exception ex){
log.error("定时任务执行异常:"+ex.getMessage());

View File

@@ -136,7 +136,7 @@
style="width: 370px;"
>
<el-option
v-for="item in dict.d_lock_type"
v-for="item in statusEnum.LOCK"
:label="item.label"
:value="item.value"
/>
@@ -197,7 +197,11 @@
<el-table-column prop="group_code" label="点位组编码" min-width="120" show-overflow-tooltip/>
<el-table-column prop="point_location" label="位置" min-width="120" show-overflow-tooltip/>
<el-table-column prop="point_type_name" label="点位类型"/>
<el-table-column prop="lock_type_name" label="锁定类型"/>
<el-table-column prop="lock_type" label="锁定类型" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ statusEnum.label.LOCK[scope.row.lock_type] }}
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级"/>
<el-table-column prop="vehicle_code" label="载具编码" min-width="120" show-overflow-tooltip/>
<el-table-column prop="form_data" label="表单数据" min-width="120" show-overflow-tooltip/>
@@ -263,6 +267,7 @@ const defaultForm = {
export default {
name: 'Point',
dicts: ['storagevehicle_type', 'd_lock_type', 'SCH_TASK_TYPE_DTL', 'point_location', 'product_area'],
statusEnums: ['LOCK'],
components: {pagination, crudOperation, rrOperation, udOperation},
mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() {

View File

@@ -9,24 +9,24 @@
label-width="80px"
label-suffix=":"
>
<el-form-item label="模型名称">
<el-form-item label="物料或载具编号" label-width="120px">
<el-input
v-model="query.search"
clearable
style="width: 250px"
size="mini"
placeholder="请输入模型名称"
placeholder="请输入物料或载具编号"
prefix-icon="el-icon-search"
class="filter-item"
/>
</el-form-item>
<el-form-item label="流程实例">
<el-form-item label="流程ID">
<el-input
v-model="query.proc_inst_id"
clearable
style="width: 250px"
size="mini"
placeholder="请输入流程实例"
placeholder="请输入流程实例ID"
prefix-icon="el-icon-search"
class="filter-item"
/>
@@ -42,6 +42,22 @@
class="filter-item"
/>
</el-form-item>
<el-form-item label="单据状态" prop="status">
<el-select
v-model="query.status"
clearable
size="mini"
placeholder="请选择"
class="filter-item"
style="width: 180px;"
>
<el-option
v-for="item in statusEnum.FLOW_STATUS"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<rrOperation />
</el-form>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->

View File

@@ -92,7 +92,7 @@
<el-table-column prop="form_type" label="单据类型" show-overflow-tooltip width="120" />
<el-table-column prop="material_id" label="物料id" show-overflow-tooltip width="120" />
<el-table-column prop="material_name" label="物料名称" show-overflow-tooltip width="120" />
<el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />
<el-table-column prop="material_code" label="物料编号" show-overflow-tooltip width="120" />
<el-table-column prop="pcsn" label="批次" show-overflow-tooltip width="120" />
<el-table-column prop="qty" label="物料数量" show-overflow-tooltip />
<el-table-column prop="assign_qty" label="拣选数量" show-overflow-tooltip />
@@ -137,7 +137,7 @@
:header-cell-style="{background:'#f5f7fa',color:'#606266'}"
>
<el-table-column prop="material_name" label="物料名称" show-overflow-tooltip width="120" />
<el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />
<el-table-column prop="material_code" label="物料编号" show-overflow-tooltip width="120" />
<el-table-column prop="pcsn" label="批次" show-overflow-tooltip width="90" />
<el-table-column prop="qty" label="物料数量" show-overflow-tooltip width="150" />
<el-table-column show-overflow-tooltip prop="unit_id" label="单位" width="120">

View File

@@ -11,21 +11,30 @@
label-width="90px"
label-suffix=":"
>
<el-form-item label="单据类型">
<el-select
v-model="query.form_type"
filterable
<el-form-item label="载具编号" label-width="120px">
<el-input
v-model="query.search"
clearable
style="width: 250px"
size="mini"
placeholder="请选择/搜索"
placeholder="请输入载具编号"
prefix-icon="el-icon-search"
class="filter-item"
disabled
@change="crud.toQuery()"
/>
</el-form-item>
<el-form-item label="单据状态" prop="status">
<el-select
v-model="query.status"
clearable
size="mini"
placeholder="请选择"
class="filter-item"
style="width: 180px;"
>
<el-option
v-for="item in fromTypes"
:key="item.value"
:value="item.value"
v-for="item in statusEnum.FORM_STATUS"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
@@ -195,7 +204,7 @@ const defaultForm = {
biz_id: null,
boz_code: null,
biz_date: null,
form_type: null,
search: null,
status: null,
create_time: null,
create_name: null,