opt:越南富佳优化

This commit is contained in:
2025-11-14 16:48:09 +08:00
parent 18c973dd8c
commit 05aa167def
17 changed files with 773 additions and 71 deletions

View File

@@ -136,10 +136,17 @@
<if test="param.material_code != null and param.material_code != ''">
AND
(mater.material_code LIKE #{param.material_code} or
mater.material_name LIKE #{param.material_code} )
(mater.material_code LIKE CONCAT('%', #{param.material_code} , '%') or
mater.material_name LIKE CONCAT('%', #{param.material_code} , '%'))
</if>
<if test="param.storagevehicle_code != null and param.storagevehicle_code != ''">
AND
ext.storagevehicle_code LIKE CONCAT('%', #{param.storagevehicle_code} , '%')
</if>
<if test="param.pcsn != null and param.pcsn != ''">
AND
ext.pcsn LIKE #{param.pcsn}

View File

@@ -1,6 +1,5 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.base;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.nl.common.exception.BadRequestException;
@@ -16,8 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
/*
* @author ZZQ
@@ -50,7 +49,7 @@ public class FIFORuleHandler extends Decisioner<StrategyStructMaterialVO, Strate
, "order_by", "gro.update_time asc, gro.qty asc")
);
if (ObjectUtils.isEmpty(vechielDtos)) {
throw new BadRequestException(LangBehavior.language("decision_manage.fifo_rule_inventory_shortage"));
throw new BadRequestException(LangBehavior.language("wms.decision_manage.fifo_rule_inventory_shortage"));
}
List<StrategyStructMaterialVO> divStruct = new ArrayList<>();
for (StructattrVechielDto vechielDto : vechielDtos) {

View File

@@ -35,9 +35,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* <p>
@@ -261,9 +262,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
"该任务申请托盘["+vehicle_code+"]为空,无法申请任务!");
}
//判断该子托盘是否存在未完成任务
Integer sub_tray_lists = iSchBaseTaskService.findUnFinishTasksBySub_tray(vehicle_code);
Assert.isFalse(sub_tray_lists>0,
"该任务申请托盘["+vehicle_code+"]已存在未完成的任务,无法申请任务!");
// Integer sub_tray_lists = iSchBaseTaskService.findUnFinishTasksBySub_tray(vehicle_code);
// Assert.isFalse(sub_tray_lists>0,
// "该任务申请托盘["+vehicle_code+"]已存在未完成的任务,无法申请任务!");
//todo 仅生成任务,不生成单据
// 校验数据
@@ -275,44 +276,39 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
throw new BadRequestException(LangBehavior.language("pda_manage.start_point_not_exist"));
}
//查询是否有执行中的点位
//找到空点位正在执行的任务
List<SchBaseTask> taskingSchBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
List<String> pointList = Optional.ofNullable(taskingSchBaseTaskList)
.orElse(Collections.emptyList())
.stream()
.flatMap(task -> Stream.of(task.getPoint_code1(), task.getPoint_code2()))
.filter(Objects::nonNull)
.collect(Collectors.toList());
//计算终点点位
List<Structattr> end_point_code_list = iStructattrService.list(new LambdaUpdateWrapper<Structattr>()
.eq(Structattr::getSect_code,"FJError")
.eq(Structattr::getIs_used, 1)
.isNull(Structattr::getStoragevehicle_code)
.notIn(CollectionUtils.isNotEmpty(pointList),Structattr::getStruct_code,pointList)
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.orderByDesc(Structattr::getUpdate_time));
.orderByDesc(Structattr::getUpdate_time)
.last("LIMIT 1"));
if(CollectionUtils.isEmpty(end_point_code_list)){
throw new BadRequestException(LangBehavior.language("pda_manage.end_point_not_exist"));
}
// 校验终点
Structattr end_point = end_point_code_list.get(0);
//查询是否有执行中的点位
//找到空点位正在执行的任务
List<SchBaseTask> taskingSchBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
.and(wp -> wp
.eq(SchBaseTask::getPoint_code1, end_point.getStruct_code())
.or()
.eq(SchBaseTask::getPoint_code2, end_point.getStruct_code())
.or()
.eq(SchBaseTask::getPoint_code1, start_point.getStruct_code())
.or()
.eq(SchBaseTask::getPoint_code2, start_point.getStruct_code())
)
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
if (CollectionUtils.isNotEmpty(taskingSchBaseTaskList)) {
throw new BadRequestException(LangBehavior.language("pda_manage.ongoing_task_at_point"));
}
start_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStructattrService.updateById(start_point);
end_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStructattrService.updateById(end_point);
start_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStructattrService.updateById(start_point);
end_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStructattrService.updateById(end_point);
// 创建任务
JSONObject task = new JSONObject();
task.put("config_code", IOSConstant.ACS_ERROR_TASK);

View File

@@ -16,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static org.nl.common.utils.ValidationUtil.assertNotBlankJson;
/**
* 手持出库管理
*
@@ -64,6 +66,26 @@ public class PdaIosOutController {
return new ResponseEntity<>(pdaIosOutService.callMaterialConfirm(whereJson), HttpStatus.OK);
}
/**
* 出库分拣提交
*/
@PostMapping("/outSortingSubmit")
@Log("出库分拣提交")
public ResponseEntity<Object> outSortingSubmit(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "out_struct_code", "out_vehicle_code","return_vehicle_code");
return new ResponseEntity<>(pdaIosOutService.outSortingSubmit(whereJson), HttpStatus.OK);
}
/**
* 出库分拣
*/
@PostMapping("/getOutAndReturnNumByReturnVehicleCode")
@Log("根据回库托盘码获取回库数量和出库数量")
public ResponseEntity<Object> getOutAndReturnNumByReturnVehicleCode(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "return_vehicle_code");
return new ResponseEntity<>(pdaIosOutService.getOutAndReturnNumByReturnVehicleCode(whereJson), HttpStatus.OK);
}
/**
* 出库确认获取物料明细

View File

@@ -23,6 +23,16 @@ public interface PdaIosOutService {
*/
PdaResponse getDtl(JSONObject whereJson);
/**
* 获取库存明细
*
* @param whereJson {
* vehicle_code 载具码
* }
* @return PdaResponse
*/
JSONObject getOutAndReturnNumByReturnVehicleCode(JSONObject whereJson);
/**
* 获取物料库存明细
@@ -58,5 +68,17 @@ public interface PdaIosOutService {
*/
JSONObject callMaterialConfirm(JSONObject whereJson);
/**
* 出库分拣提交
*
* @param whereJson {
* return_vehicle_code 载具码
* out_vehicle_code 点位编码,
* out_struct_code: 楼层
* }
* @return PdaResponse
*/
JSONObject outSortingSubmit(JSONObject whereJson);
}

View File

@@ -6,26 +6,43 @@ import cn.hutool.http.HttpStatus;
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 org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.language.LangBehavior;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.language.LangBehavior;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.*;
import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Sectattr;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.pda_manage.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda_manage.util.PdaResponse;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.tasks.MovePointTask;
import org.nl.wms.sch_manage.service.util.tasks.StOutTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.IOutBillService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.nl.wms.warehouse_manage.service.dao.IOStorInv;
import org.nl.wms.warehouse_manage.service.dao.IOStorInvDis;
@@ -34,11 +51,14 @@ import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS;
@@ -62,6 +82,16 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
*/
@Autowired
private ISchBasePointService iSchBasePointService;
@Resource
private ISectattrService iSectattrService;
/**
* 仓库实物表服务
*/
@Autowired
private IBsrealStorattrService iBsrealStorattrService;
/**
* 出入库单主表
*/
@@ -73,12 +103,21 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
*/
@Autowired
private IMdMeMaterialbaseService iMdMeMaterialbaseService;
@Resource
private IOutBillService outBillService;
/**
* 载具扩展属性服务
*/
@Resource
private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper;
@Resource
private IMdPbGroupplateService iMdPbGroupplateService;
@Autowired
private ISchBaseTaskService schBaseTaskService;
/**
* 仓位服务
*/
@@ -102,6 +141,41 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
return PdaResponse.requestParamOk(mdPbStoragevehicleextMapper.getIosDtl(whereJson));
}
@Override
public JSONObject getOutAndReturnNumByReturnVehicleCode(JSONObject whereJson) {
if(StringUtils.isBlank(whereJson.getString("return_vehicle_code"))){
throw new BadRequestException("未传入载具编码");
}
List<GroupPlate> groupPlates = iMdPbGroupplateService.list(new QueryWrapper<GroupPlate>()
.eq("storagevehicle_code", whereJson.getString("return_vehicle_code"))
.eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库")));
if(CollectionUtils.isEmpty(groupPlates)){
throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"不存在,请核对!");
}
List<Structattr> structattrList = iStructattrService.list(new LambdaUpdateWrapper<Structattr>()
.eq(Structattr::getSect_code,"FJOutboundSorting")
.eq(Structattr::getIs_used, 1)
.eq(Structattr::getStoragevehicle_code, whereJson.getString("return_vehicle_code"))
);
if(CollectionUtils.isEmpty(structattrList)){
throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"在分拣库区不存在,请核对!");
}
Map<String,String> outMap = new HashMap<>();
outMap.put("out_num",groupPlates.get(0).getFrozen_qty().toString());
outMap.put("return_num",(groupPlates.get(0).getQty().subtract(groupPlates.get(0).getFrozen_qty())).toString());
JSONObject ret = new JSONObject();
ret.put("status", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message","查询成功");
ret.put("data",outMap);
return ret;
}
@Override
public JSONObject getMaterialDtl(JSONObject whereJson) {
@@ -205,6 +279,196 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
return ret;
}
@Override
@Transactional
public JSONObject outSortingSubmit(JSONObject whereJson) {
String return_vehicle_code = whereJson.getString("return_vehicle_code");
String out_vehicle_code = whereJson.getString("out_vehicle_code");
String out_struct_code = whereJson.getString("out_struct_code");
List<Structattr> structattrList = iStructattrService.list(new LambdaUpdateWrapper<Structattr>()
.eq(Structattr::getStoragevehicle_code, return_vehicle_code)
.eq(Structattr::getSect_code,"FJOutboundSorting"));
if(CollectionUtils.isEmpty(structattrList)){
throw new BadRequestException("回库点位,请核对");
}
Structattr structattr = structattrList.get(0);
//找到空点位正在执行的任务
List<SchBaseTask> taskingSchBaseTaskList = schBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
.and(wp -> wp
.eq(SchBaseTask::getPoint_code1, out_struct_code)
.or()
.eq(SchBaseTask::getPoint_code2, out_struct_code)
.or()
.eq(SchBaseTask::getVehicle_code, out_vehicle_code)
.or()
.eq(SchBaseTask::getVehicle_code, return_vehicle_code)
)
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
if (CollectionUtils.isNotEmpty(taskingSchBaseTaskList)) {
throw new BadRequestException(LangBehavior.language("pda_manage.ongoing_task_at_point"));
}
//根据旧的托盘查找组盘表
List<GroupPlate> groupPlates = iMdPbGroupplateService.list(new QueryWrapper<GroupPlate>()
.eq("storagevehicle_code", whereJson.getString("return_vehicle_code"))
.eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库")));
if(CollectionUtils.isEmpty(groupPlates)){
throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"不存在,请核对!");
}
GroupPlate newGroupPlate = new GroupPlate();
//插入新的组盘表
BeanUtils.copyProperties(groupPlates.get(0),newGroupPlate);
newGroupPlate.setGroup_id(IdUtil.getStringId());
newGroupPlate.setStoragevehicle_code(out_vehicle_code);
newGroupPlate.setQty(newGroupPlate.getFrozen_qty());
//判断是否存在这个托盘
List<GroupPlate> outGroupPlates = iMdPbGroupplateService.list(new QueryWrapper<GroupPlate>()
.eq("storagevehicle_code", whereJson.getString("out_vehicle_code"))
.eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库")));
if(CollectionUtils.isNotEmpty(outGroupPlates)){
throw new BadRequestException("出库托盘码"+whereJson.getString("out_vehicle_code")+"重复,请核对!");
}
iMdPbGroupplateService.save(newGroupPlate);
//修改旧的组盘表的数量
GroupPlate oldGroupPlate = groupPlates.get(0);
oldGroupPlate.setQty(oldGroupPlate.getQty().subtract(oldGroupPlate.getFrozen_qty()));
oldGroupPlate.setFrozen_qty(new BigDecimal(0));
iMdPbGroupplateService.updateById(oldGroupPlate);
//1、下发一个回去任务通过接口查询回库点位
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", structattr.getStruct_code());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
JSONObject jsonTask = new JSONObject();
jsonTask.put("config_code", IOSConstant.MOVE_POINT_CONFIG_TASK);
jsonTask.put("point_code1", structattr.getStruct_code());
//计算
// 查询所有库区
// 查询所有库区
List<Sectattr> allSects = iSectattrService.list(new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getIs_delete,"0")
.eq(Sectattr::getSect_code,"FJ01")
.ne(Sectattr::getSect_code,"SSX")
.ne(Sectattr::getSect_code,"FJOutboundSorting")
.ne(Sectattr::getSect_code,"FJError")
.ne(Sectattr::getSect_code,"FJWaitingMaterial"));
if (CollectionUtils.isEmpty(allSects)) {
throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_find_available_sector"));
}
// 判断库区货位占有率
Map<Sectattr, BigDecimal> sectOccupancyRateMap = new HashMap<>();
for (Sectattr sect : allSects) {
BigDecimal occupancyRate = iStructattrService.calculateSectOccupancyRate(sect.getSect_code());
sectOccupancyRateMap.put(sect, occupancyRate);
}
JSONObject dis_form = new JSONObject();
// 选择占有率小的库区
Optional<Map.Entry<Sectattr, BigDecimal>> minEntry = sectOccupancyRateMap.entrySet().stream()
.min(Map.Entry.comparingByValue());
if (minEntry.isPresent()) {
dis_form.put("sect_id", minEntry.get().getKey().getSect_id());
dis_form.put("stor_id", minEntry.get().getKey().getStor_id());
dis_form.put("sect_code", minEntry.get().getKey().getSect_id());
dis_form.put("stor_code", minEntry.get().getKey().getStor_id());
} else {
throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_select_suitable_sector"));
}
BsrealStorattr stor = iBsrealStorattrService.findById(dis_form.getString("stor_code"));
Sectattr sect = iSectattrService.findById(dis_form.getString("sect_code"));
MdMeMaterialbase mdMeMaterialbase = iMdMeMaterialbaseService.getByCode(oldGroupPlate.getMaterial_id());
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
StrategyStructParam.builder()
.ioType(StatusEnum.STRATEGY_TYPE.code("入库"))
.sect_code(sect.getSect_code())
.stor_code(stor.getStor_code())
.material_code(mdMeMaterialbase.getMaterial_code())
.qty(oldGroupPlate.getQty())
.pcsn(oldGroupPlate.getPcsn())
.build());
Structattr struct = structattrs.get(0);
lock_map = new JSONObject();
lock_map.put("struct_code", struct.getStruct_code());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
jsonTask.put("point_code2", struct.getStruct_code());
jsonTask.put("vehicle_code", oldGroupPlate.getStoragevehicle_code());
jsonTask.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
MovePointTask movePointTask = SpringContextHolder.getBean("MovePointTask");
String task_id = movePointTask.create(jsonTask);
//2、下发出库任务需要将旧托盘
//需要修改IOS分配表看一下三张表是否都需要修改、 出库区的当前托盘码,需要加锁,需要修改分配表的库区出库点位需要更新TASKID
//需要修改IOS分配表看一下三张表是否都需要修改、 需要修改分配表的库区出库点位需要更新TASKID
List<IOStorInvDis> disList = ioStorInvDisMapper.selectList(
new QueryWrapper<IOStorInvDis>().lambda()
.eq(IOStorInvDis::getStoragevehicle_code, oldGroupPlate.getStoragevehicle_code()
)
.eq(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("生成")
)
);
if(CollectionUtils.isEmpty(disList)){
throw new BadRequestException("托盘编码为空");
}
IOStorInvDis updateDis = disList.get(0);
lock_map = new JSONObject();
lock_map.put("struct_code", out_struct_code);
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
JSONObject task_form = new JSONObject();
task_form.put("task_type", "STOutTask");
task_form.put("TaskCode",CodeUtil.getNewCode("TASK_CODE"));
task_form.put("PickingLocation", out_struct_code);
task_form.put("PlacedLocation", updateDis.getPoint_code());
task_form.put("floor_code",updateDis.getFloor_code());
task_form.put("vehicle_code", out_vehicle_code);
StOutTask stOutTask = SpringContextHolder.getBean("STOutTask");
String out_task_id = stOutTask.create(task_form);
Structattr outStructattr = iStructattrService.getByCode(out_struct_code);
updateDis.setSect_id(outStructattr.getSect_id());
updateDis.setSect_code(outStructattr.getSect_code());
updateDis.setSect_name(outStructattr.getSect_name());
updateDis.setStruct_id(outStructattr.getStruct_id());
updateDis.setStruct_code(outStructattr.getStruct_code());
updateDis.setStruct_name(outStructattr.getStruct_name());
updateDis.setTask_id(out_task_id);
updateDis.setStoragevehicle_code(out_vehicle_code);
ioStorInvDisMapper.updateById(updateDis);
JSONObject ret = new JSONObject();
ret.put("status", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message","提交成功");
ret.put("data",null);
return ret;
}
private String createOutBills(JSONObject whereJson) {
String now = DateUtil.now();
String currentUserId = SecurityUtils.getCurrentUserId();

View File

@@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.language.LangBehavior;
import org.nl.wms.basedata_manage.service.IStructattrService;
@@ -39,12 +41,22 @@ public class PdaSchPointServiceImpl implements PdaSchPointService {
public JSONObject getPoint(JSONObject whereJson) {
// 载具号
List<JSONObject> list = stIvtMoveinvdtlMapper.querydtl(whereJson);
JSONObject ret = new JSONObject();
if(CollectionUtils.isEmpty(list)){
List<Structattr> structattrList = iStructattrService.list(new LambdaUpdateWrapper<Structattr>()
.eq(Structattr::getStruct_code, whereJson.getString("struct_code")));
if (CollectionUtils.isNotEmpty(structattrList)){
JSONObject jsonObject = new JSONObject();
jsonObject.put("group_id","1");
jsonObject.put("storagevehicle_code",structattrList.get(0).getStoragevehicle_code());
list.add(jsonObject);
}
}
ret.put("data",list);
ret.put("status", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message","查询成功");
ret.put("data",list);
return ret;
return ret;
}
@Override
@Transactional
@@ -107,7 +119,7 @@ public class PdaSchPointServiceImpl implements PdaSchPointService {
throw new BadRequestException(LangBehavior.language("pda_manage.point_not_found", struct_code));
}
if(ObjectUtil.isEmpty(struct.getStoragevehicle_code())){
throw new BadRequestException(LangBehavior.language("pda_manage.point_no_vehicle_need_unbind", struct_code, vehicle_code));
throw new BadRequestException(LangBehavior.language("pda_manage.point_no_vehicle_need_unbind", struct_code, ""));
}
iStructattrService.update(

View File

@@ -179,6 +179,9 @@
<if test="query.search != null and query.search != ''">
and form_data LIKE '%${query.search}%'
</if>
<if test="query.vehicle_code != null and query.vehicle_code != ''">
and vehicle_code LIKE '%${query.vehicle_code}%'
</if>
<if test="query.form_type != null and query.form_type != ''">
and form_type = #{query.form_type}
</if>

View File

@@ -26,6 +26,7 @@ public class FormDataQuery extends BaseQuery<PmFormData> {
private String[] status;
private String start_time;
private String end_time;
private String vehicle_code;
private Map<String,String> form_query;
@Override

View File

@@ -7,14 +7,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.config.language.LangProcess;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.language.LangBehavior;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseRegion;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;

View File

@@ -57,6 +57,11 @@ public class IOSConstant {
*/
public final static String MOVE_CONFIG_TASK = "MoveTask";
/**
* 移库点位任务类编码
*/
public final static String MOVE_POINT_CONFIG_TASK = "MovePointTask";
/**
* 余料回库任务类编码
*/

View File

@@ -12,35 +12,35 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.language.LangProcess;
import org.nl.language.LangBehavior;
import org.nl.config.SpringContextHolder;
import org.nl.language.LangBehavior;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.Sectattr;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto;
import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
import org.nl.wms.pm_manage.service.IPmFormDataService;
import org.nl.wms.pm_manage.service.dao.PmFormData;
import org.nl.wms.pm_manage.service.dao.mapper.PmFormDataMapper;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.tasks.MovePointTask;
import org.nl.wms.sch_manage.service.util.tasks.StOutTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
@@ -53,10 +53,8 @@ import org.nl.wms.warehouse_manage.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvMapper;
import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateMapper;
import org.nl.wms.warehouse_manage.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_manage.service.dto.IOStorInvDtlDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -437,14 +435,19 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
lock_map.put("inv_type", ioStorInv.getBill_type());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁"));
iStructattrService.updateStatusByCode("0",lock_map);
//更新组盘表冻结数量状态
iMdPbGroupPlateService.update(new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getFrozen_qty, outAllocation.getFrozen_qty())
.set(GroupPlate::getUpdate_time, now)
.eq(GroupPlate::getStoragevehicle_code, outAllocation.getStoragevehicle_code())
.eq(GroupPlate::getPcsn, outAllocation.getPcsn())
.eq(GroupPlate::getMaterial_id, outAllocation.getMaterial_id())
.eq(GroupPlate::getStatus,IOSEnum.GROUP_PLATE_STATUS.code("入库")));
//更新库存 加冻结减可用
List<JSONObject> updateIvtList = new ArrayList<>();
JSONObject jsonIvt = new JSONObject();
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_FROZEN);
jsonIvt.put("storagevehicle_code", outAllocation.getStoragevehicle_code());
jsonIvt.put("material_id", outAllocation.getMaterial_id());
jsonIvt.put("pcsn",outAllocation.getPcsn());
jsonIvt.put("qty_unit_id", dtl.getQty_unit_id());
jsonIvt.put("qty_unit_name", dtl.getQty_unit_name());
jsonIvt.put("change_qty", outAllocation.getFrozen_qty());
updateIvtList.add(jsonIvt);
iMdPbGroupPlateService.updateIvt(updateIvtList);
//生成分配明细
ioStorInvDisMapper.insert(ioStorInvDis);
allocation_canuse_qty = allocation_canuse_qty.add(outAllocation.getFrozen_qty());
@@ -994,17 +997,61 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
task_form.put("floor_code",floor_code);
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
StOutTask stOutTask = SpringContextHolder.getBean("STOutTask");
String task_id = stOutTask.create(task_form);
iMdPbGroupPlateService.update(new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.set(GroupPlate::getUpdate_time, DateUtil.now())
.eq(GroupPlate::getStoragevehicle_code, ioStorInvDis.getStoragevehicle_code()));
//分配明细表更新任务相关数据
//通过托盘编码查询,如果冻结数<总数,则表明需要去分拣区
List<GroupPlate> groupPlates = iMdPbGroupPlateService.list(new QueryWrapper<GroupPlate>()
.eq("storagevehicle_code", ioStorInvDis.getStoragevehicle_code())
.eq("status",IOSEnum.GROUP_PLATE_STATUS.code("入库")));
if(CollectionUtils.isEmpty(groupPlates)){
throw new BadRequestException("找不到托盘"+ioStorInvDis.getStoragevehicle_code());
}
if(groupPlates.get(0).getQty().compareTo(ioStorInvDis.getPlan_qty())>0) {
ioStorInvDis.setIs_issued(BaseDataEnum.IS_YES_NOT.code(""));
}
String task_id ="";
if(BaseDataEnum.IS_YES_NOT.code("").equals(ioStorInvDis.getIs_issued())) {
StOutTask stOutTask = SpringContextHolder.getBean("STOutTask");
task_id = stOutTask.create(task_form);
}
else { //如果出库数量和托盘数量不相同,则移库到分拣区
MovePointTask movePointTask = SpringContextHolder.getBean("MovePointTask");
task_form.put("config_code", IOSConstant.MOVE_POINT_CONFIG_TASK);
task_form.put("point_code1",ioStorInvDis.getStruct_code());
//通过方法计算
//todo
List<Structattr> structattrList = iStructattrService.list(new LambdaUpdateWrapper<Structattr>()
.eq(Structattr::getSect_code,"FJOutboundSorting")
.eq(Structattr::getIs_used, 1)
.isNull(Structattr::getStoragevehicle_code)
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.orderByDesc(Structattr::getUpdate_time));
if(CollectionUtils.isEmpty(structattrList)){
throw new BadRequestException("出库分拣区库位不足,请先清理后再执行");
}
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", structattrList.get(0).getStruct_code());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
task_form.put("point_code2",structattrList.get(0).getStruct_code());
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
task_form.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
task_id = movePointTask.create(task_form);
}
IOStorInvDis dis = new IOStorInvDis();
dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_id());
//分配明细表更新任务相关数据
dis.setPoint_code(point_code);
dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成"));
dis.setTask_id(task_id);
dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code(""));
dis.setPoint_code(point_code);
dis.setFloor_code(floor_code);
ioStorInvDisMapper.updateById(dis);
}

View File

@@ -18,7 +18,6 @@ import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.config.language.LangProcess;
import org.nl.language.LangBehavior;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
@@ -872,7 +871,11 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
// 查询所有库区
List<Sectattr> allSects = iSectattrService.list(new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getIs_delete,"0")
.ne(Sectattr::getSect_code,"SSX"));
.eq(Sectattr::getSect_code,"FJ01")
.ne(Sectattr::getSect_code,"SSX")
.ne(Sectattr::getSect_code,"FJOutboundSorting")
.ne(Sectattr::getSect_code,"FJError")
.ne(Sectattr::getSect_code,"FJWaitingMaterial"));
if (CollectionUtils.isEmpty(allSects)) {
throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_find_available_sector"));
}

View File

@@ -928,7 +928,33 @@ var config = {
"task_code": "任务号"
},
"outbill": {
"outbound_weight":"出库重量",
"edit_out_bill":"出库单编辑",
"out_detail":"出库明细",
"quantity":"数量",
"material_list":"用料清单物料",
"manual_add_material":"手工添加物料",
"divide_allocation":"出库分配",
"outbound_details":"出库明细",
"allocation_area":"分配库区",
"allocation_all":"全部分配",
"cancel_all":"全部取消",
"auto_allocation":"自动分配",
"auto_cancel":"自动取消",
"manual_allocation":"手工分配",
"set_all":"一键设置",
"assigned_qty":"已分配重量",
"unassigned_qty":"未分配重量",
"allocation_details":"分配明细",
"to_be_allocated":"待分配",
"allocated":"已分配",
"outbound_point":"出库点",
"target_floor":"目的楼层",
"vehicle_material_details":"载具物料明细",
"allocation_success":"分配成功",
"please_select_point":"请先选择站点",
"please_select_floor":"请先选择楼层",
"set_success":"设置成功",
"warehouse_area":"库区",
"auto_allocate_location":"自动分配货位",
"allocate_location":"分配货位",
@@ -1053,6 +1079,14 @@ var config = {
"operation": "操作"
},
"common": {
"Close":"关闭",
"material_code":"物料编码",
"material_name":"物料名称",
"vehicle_code":"托盘号",
"position_code":"仓位编码",
"position_name":"仓位名称",
"storage_time":"入库时间",
"task_code":"任务号",
"status": "状态",
"unit":"单位",
"all":"全部",