add:出库功能

This commit is contained in:
zhangzq
2024-05-27 15:51:53 +08:00
parent 63467f51f8
commit 3ee94f5fcb
24 changed files with 510 additions and 148 deletions

View File

@@ -24,7 +24,7 @@ public enum StatusEnum {
/**
* 单据状态
*/
FORM_STATUS(MapOf.of("生成", "10", "执行中", "20","完成", "90","取消", "100")),
FORM_STATUS(MapOf.of("生成", "10","已分配", "13", "执行中", "20","完成", "90","取消", "100")),
/**
* 出入库单据类型

View File

@@ -17,6 +17,8 @@ public class VehicleMaterQuery extends BaseQuery<MdPbVehicleMater> {
private String vehicle_code_begin;
private String vehicle_code_end;
private String vehicle_type;
private String pcsn;
private String material_id;
@Override
public void paramMapping() {

View File

@@ -3,7 +3,6 @@ package org.nl.wms.base_manage.vehicle.vehicleMater.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.mapper.MdPbVehicleMaterMapper;
import org.springframework.stereotype.Service;

View File

@@ -1,16 +1,33 @@
package org.nl.wms.decision_manage.handler.impl.base;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.wms.base_manage.vehicle.vehicleInfo.service.dto.VehicleQuery;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dto.VehicleMaterQuery;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.StIvtIostorinvdtlOut;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.IStIvtIostorinvdtlService;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/*
* @author ZZQ
@@ -18,19 +35,16 @@ import java.util.List;
* 先进先出策略
*/
@Service("fifo")
public class FIFORuleHandler extends Decisioner<StIvtStructattr,String> {
public class FIFORuleHandler extends Decisioner<StIvtStructattr, StIvtIostorinvdtl> {
/**
* 出入库明细服务
*/
@Autowired
private IStIvtIostorinvdtlService iStIvtIostorinvdtlService;
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
/**
* 载具扩展属性服务服务
*/
// @Autowired
// private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
/**
* 巷道均衡策略
@@ -43,106 +57,35 @@ public class FIFORuleHandler extends Decisioner<StIvtStructattr,String> {
* @return List<StIvtStructattr> :仓位集合
*/
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, String param) {
public List<StIvtStructattr> handler(List<StIvtStructattr> list, StIvtIostorinvdtl param) {
// 判断仓位是否为空
if (ObjectUtil.isEmpty(list)) {
throw new BadRequestException("仓位集合为空!");
}
//分配数量
int plan_qty = param.getPlan_qty().intValue();
//当前条件只有id批次
List<StructattrVechielDto> vechielDtos = iStIvtStructattrService.collectVechicle(MapOf.of("material_id", param.getMaterial_id()
, "pcsn", param.getPcsn()
, "stor_code", param.getStor_code()
, "order_by", "update_time asc")
);
List<String> need = list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList());
// 判断策略类型
JSONObject jsonParam = JSONObject.parseObject(param, JSONObject.class);
List<StIvtStructattr> disList = new ArrayList<>();
for (StructattrVechielDto structattr : vechielDtos) {
if (need.contains(structattr.getStruct_code())){
StIvtStructattr stIvtStructattr = new StIvtStructattr();
BeanUtils.copyProperties(structattr,stIvtStructattr);
disList.add(stIvtStructattr);
List<StIvtStructattr> resultList = new ArrayList<>();
switch (jsonParam.getString("ioType")) {
case "1":
// 入库策略
resultList = inHandler(list,jsonParam);
break;
case "2":
// 出库策略
// resultList = outHandler(list,jsonParam);
break;
case "3":
// 通用策略
break;
default:
throw new BadRequestException("策略类型错误!");
int cause_qty = structattr.getQty().subtract(structattr.getFrozen_qty()).intValue();
plan_qty = plan_qty - cause_qty;
if (plan_qty<=0){
break;
}
}
}
return resultList;
return disList;
}
/**
* 入库策略
* @param attrList :仓位集合
* @param jsonParammaterialId :物料标识
* @return List<StIvtStructattr> :仓位集合
*/
private List<StIvtStructattr> inHandler(List<StIvtStructattr> attrList, JSONObject jsonParam) {
return attrList;
}
/**
* 出库策略
* @param attrList :仓位物料信息
* @param jsonParamiostorinvdtlId 出入库明细标识(此方法只根据时间匹配)
* @return List<StIvtStructattr> :需出库仓位集合
*/
// private List<StIvtStructattr> outHandler(List<StIvtStructattr> attrList, JSONObject jsonParam) {
//
// // 查询对应的出入库明细
// StIvtIostorinvdtlIn dtlDao = iStIvtIostorinvdtlService.getById(jsonParam.getString("iostorinvdtlId"));
//
// // 查询传入仓位物料中的数量是否满足明细中的数量
// List<String> vehicleCodeIn = attrList.stream()
// .map(StIvtStructattr::getVehicle_code)
// .distinct()
// .collect(Collectors.toList());
//
// // 查询对应的载具物料,根据入库时间升序(先进先出规则)
// List<MdPbStoragevehicleext> extList = iMdPbStoragevehicleextService.list(
// new QueryWrapper<MdPbStoragevehicleext>().lambda()
// .in(MdPbStoragevehicleext::getStoragevehicle_code, vehicleCodeIn)
// .orderByAsc(MdPbStoragevehicleext::getInsert_time)
// );
//
// double attrQty = extList.stream()
// .map(MdPbStoragevehicleext::getQty)
// .reduce(BigDecimal.ZERO, BigDecimal::add)
// .doubleValue();
//
// if (dtlDao.getUnassign_qty().doubleValue() > attrQty) {
// // 说明不满足所需重量则全部返回
// return attrList;
// }
//
// // 需返回仓位物料集合
// List<StIvtStructattr> resultList = new ArrayList<>();
// // 满足所需数量: 根据巷道进行平均分配
// double unAssingQty = dtlDao.getUnassign_qty().doubleValue();
//
// while (unAssingQty > 0) {
//
// // 添加需返回的仓位物料
// StIvtStructattr attrDao = attrList.get(0);
// resultList.add(attrDao);
//
// // 减去未分配重量
// MdPbStoragevehicleext extDao = extList.stream()
// .filter(row -> row.getStoragevehicle_code().equals(attrDao.getVehicle_code()))
// .findFirst().orElse(null);
//
// if (ObjectUtil.isEmpty(extDao)) {
// throw new BadRequestException("未查询到载具对应的物料【"+attrDao.getVehicle_code()+"】");
// }
//
// unAssingQty = NumberUtil.sub(unAssingQty,extDao.getQty().doubleValue());
//
// // 移出此仓位物料,方便下一轮进行匹配
// attrList.remove(attrDao);
// }
//
// return resultList;
// }
}

View File

@@ -2,7 +2,10 @@ package org.nl.wms.decision_manage.handler.impl.base;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.service.dao.StStrategyConfig;
@@ -10,6 +13,7 @@ import org.nl.wms.stor_manage.io.service.in.iostor_dtl.IStIvtIostorinvdtlService
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Comparator;
import java.util.List;
@@ -27,7 +31,7 @@ public class NearbyRuleHandler extends Decisioner<StIvtStructattr, StIvtIostorin
* 出入库明细服务
*/
@Autowired
private IStIvtIostorinvdtlService iStIvtIostorinvdtlService;
private IStIvtStructattrService iStIvtStructattrService;
/**
* 载具扩展属性服务服务
@@ -46,9 +50,8 @@ public class NearbyRuleHandler extends Decisioner<StIvtStructattr, StIvtIostorin
*/
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, StIvtIostorinvdtl param) {
// 判断仓位是否为空
if (ObjectUtil.isEmpty(list)) {
throw new BadRequestException("仓位集合为空!");
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
list.sort(Comparator.comparingInt(i -> i.getRow_num()+i.getCol_num()+i.getLayer_num()+i.getBlock_num()));
//就近分配区分出库还是入库策略

View File

@@ -23,13 +23,5 @@ import java.util.Map;
public interface SchBaseTaskMapper extends BaseMapper<SchBaseTask> {
IPage<SchBaseTask> selectPageLeftJoin(IPage<SchBaseTask> pages, @Param("whereJson") SchBaseTaskQuery whereJson, @Param("collect") List<String> collect);
@Select("SELECT\n" +
"\tsch_base_task.*, md_pb_vehicleMater.*,md_me_materialbase.material_code,md_me_materialbase.material_name,md_me_materialbase.material_spec\n" +
"FROM\n" +
"\tsch_base_task\n" +
"\tLEFT JOIN md_pb_vehicleMater ON sch_base_task.vehicle_code = md_pb_vehicleMater.vehicle_code \n" +
"\tleft join md_me_materialbase on md_pb_vehicleMater.material_id = md_me_materialbase.material_id\n" +
"WHERE\n" +
"\tsch_base_task.vehicle_code = #{vehicle_code}")
List<Map> getByVehicle(String vehicle_code);
List<Map> getByVehicle(@Param("vehicles") List<String> vehicles);
}

View File

@@ -38,4 +38,26 @@
</where>
ORDER BY t.create_time DESC
</select>
<select id="getByVehicle" resultType="java.util.Map">
SELECT
md_pb_vehicleMater.*,
md_me_materialbase.material_code,
md_me_materialbase.material_name,
md_me_materialbase.material_spec,
st_ivt_structattr.stor_code,
st_ivt_structattr.struct_code,
sch_base_task.point_code1,
sch_base_task.point_code2,
sch_base_task.task_type,
sch_base_task.task_status
FROM
md_pb_vehicleMater
LEFT JOIN st_ivt_structattr ON md_pb_vehicleMater.vehicle_code = st_ivt_structattr.vehicle_code
LEFT JOIN md_me_materialbase ON md_pb_vehicleMater.material_id = md_me_materialbase.material_id
LEFT JOIN sch_base_task ON md_pb_vehicleMater.vehicle_code = sch_base_task.vehicle_code
where md_pb_vehicleMater.vehicle_code in
<foreach collection="vehicles" item="vehicle_code" open="(" close=")" separator=",">
#{vehicle_code}
</foreach>
</select>
</mapper>

View File

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.ListOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.dispatch_manage.task.service.dao.mapper.SchBaseTaskMapper;
@@ -60,7 +61,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
if (StringUtils.isEmpty(vehicle_code)){
return new ArrayList<>();
}
return this.baseMapper.getByVehicle(vehicle_code);
return this.baseMapper.getByVehicle(ListOf.of(vehicle_code.split(",")));
}
@Override

View File

@@ -26,10 +26,7 @@ import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -38,6 +35,7 @@ import java.util.stream.Stream;
/*
* @author ZZQ
* @Date 2024/5/6 17:47
* 后续可以定义规则
*/
@Service("subProcess")
public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObject> {
@@ -63,9 +61,20 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
JSONObject form = entity.getT();
JSONArray items = (JSONArray)form.get("item");
StringBuffer buffer = new StringBuffer();
if (items!=null){
//基于明细id拆分还是继续vehicle_code拆分
List<JSONObject> subList = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
JSONObject item = items.getJSONObject(i);
String[] vehicle_codes = item.getString("vehicle_code").split(",");
for (String vehicle_code : vehicle_codes) {
JSONObject sub = new JSONObject(item);
sub.put("vehicle_code",vehicle_code);
subList.add(sub);
}
}
if (subList!=null){
//子流程并行,子流程单一的时候直接串行
items.stream().map((Function<Object, CompletableFuture>) o -> CompletableFuture.runAsync(() -> {
subList.stream().map((Function<Object, CompletableFuture>) o -> CompletableFuture.runAsync(() -> {
ExecutionEntity subEntity = new ExecutionEntity();
subEntity.setParent_id(entity.getProc_inst_id());
subEntity.setForm_id(entity.getForm_id());

View File

@@ -16,11 +16,14 @@ import org.nl.wms.stor_manage.io.service.in.iostor_dtl.IStIvtIostorinvdtlService
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/*
* @author ZZQ
@@ -51,20 +54,37 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
//出入库明细
JSONObject t = entity.getT();
JSONObject item_json = t.getJSONObject("t");
StIvtIostorinvdtl iostorinvdtlIn = item_json.toJavaObject(StIvtIostorinvdtl.class);
AtomicReference<String> atomicStruct= new AtomicReference<>();
StIvtIostorinvdtl iostorinvdtl = item_json.toJavaObject(StIvtIostorinvdtl.class);
List<StIvtStructattr> list = dispense(params, iostorinvdtl);
//更新仓位,更新数据
String collect = list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(","));
stIvtIostorinvdtlInService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("struct_code",collect)
.eq("id",iostorinvdtl.getId()));
item_json.put("struct_code",collect);
return t;
}
@Transactional
public List<StIvtStructattr> dispense(List<String> params, StIvtIostorinvdtl iostorinvdtl) {
AtomicReference<List<StIvtStructattr>> structCode = new AtomicReference<>();
RedissonUtils.lock(()->{
List<StIvtStructattr> list = iStIvtStructattrService.list(new QueryWrapper<StIvtStructattr>()
.eq("vehicle_code", "")
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code(""))
.eq("stor_code",iostorinvdtlIn.getStor_code()));
.eq("stor_code", iostorinvdtl.getStor_code());
if (iostorinvdtl.getIn_storage()){
query.eq("vehicle_code","");
}else {
query.ne("vehicle_code","");
}
//如果是入库则过滤空;否则则不过滤
List<StIvtStructattr> list = iStIvtStructattrService.list(query);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
for (String param : params) {
Decisioner decisioner = decisionHandlerMap.get(param);
list = decisioner.handler(list, iostorinvdtlIn);
list = decisioner.handler(list, iostorinvdtl);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
@@ -73,19 +93,12 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("无可分配货位!");
}
String structCode = list.get(0).getStruct_code();
atomicStruct.set(structCode);
//更新仓位,更新数据
structCode.set(list);
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("vehicle_code",iostorinvdtlIn.getVehicle_code())
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code",structCode));
// .set("vehicle_code", iostorinvdtl.getVehicle_code())
.set("lock_type", StatusEnum.LOCK.code(iostorinvdtl.getIn_storage()?"":""))
.in("struct_code", list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())));
},"",2);
stIvtIostorinvdtlInService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("struct_code",atomicStruct.get())
.eq("id",iostorinvdtlIn.getId()));
item_json.put("struct_code",atomicStruct.get());
return t;
return structCode.get();
}
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.utils.MapOf;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.stor_manage.io.service.dto.StorInvOutQuery;
import org.nl.wms.stor_manage.io.service.dto.StorInvQuery;
@@ -12,6 +13,7 @@ import org.nl.wms.stor_manage.io.service.in.iostor.dao.StIvtIostorinvIn;
import org.nl.wms.stor_manage.io.service.out.iostor.IStIvtIostorinvOutService;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.StIvtIostorinvOut;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.IStIvtIostorinvdtlOutService;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -36,6 +38,8 @@ public class StIvtIostorinvOutController {
private IStIvtIostorinvOutService iStIvtIostorinvOutService;
@Autowired
private IStIvtIostorinvdtlOutService iStIvtIostorinvDtlOutService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@@ -56,5 +60,32 @@ public class StIvtIostorinvOutController {
return new ResponseEntity<>(mapList,HttpStatus.OK);
}
/**
* 出库分配
* @param dtl
* @return
*/
@PostMapping("/outDecision")
public ResponseEntity<Object> outDecision(@RequestBody JSONObject dtl) {
String struct_code = iStIvtIostorinvOutService.dispense(dtl);
return new ResponseEntity<>(struct_code,HttpStatus.OK);
}
/**
* 取消分配
* @param dtl
* @return
*/
@PostMapping("/cancelDecision")
public ResponseEntity<Object> cancelDecision(@RequestBody JSONObject dtl) {
iStIvtIostorinvOutService.canceldispense(dtl);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/divDis")
public ResponseEntity<Object> divDis(@RequestBody JSONObject dtl) {
List<Map> dis = iSchBaseTaskService.getByVehicle(dtl.getString("vehicle_code"));
return new ResponseEntity<>(TableDataInfo.build(dis),HttpStatus.OK);
}
}

View File

@@ -36,6 +36,11 @@ public class StIvtIostorinvdtl implements Serializable {
*/
private String inv_id;
/**
* 出入单标识
*/
private Boolean in_storage = Boolean.TRUE;
/**
* 源单号
*/

View File

@@ -15,8 +15,8 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("st_ivt_iostorinv_in")
public class StIvtIostorinvout implements Serializable {
@TableName("st_ivt_iostorinv_out")
public class StIvtIostorinvOut implements Serializable {
private static final long serialVersionUID = 1L;

View File

@@ -2,25 +2,31 @@ package org.nl.wms.stor_manage.io.service.out.iostor.impl;
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.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.stor_manage.io.service.in.iostor.dao.StIvtIostorinvIn;
import org.nl.wms.stor_manage.io.service.in.iostor.dao.mapper.StIvtIostorinvMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.nl.wms.stor_manage.io.service.out.iostor.IStIvtIostorinvOutService;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.StIvtIostorinvOut;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.mapper.StIvtIostorinvOutMapper;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.IStIvtIostorinvdtlOutService;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.StIvtIostorinvdtlOut;
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 org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
@@ -35,6 +41,8 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
@Autowired
private IStIvtIostorinvdtlOutService iStIvtIostorinvDtlOutService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Override
@Transactional
@@ -60,4 +68,47 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
}
this.save(mst);
}
@Override
public String dispense(JSONObject form) {
//分配更新
List<StIvtStructattr> desicion = iStIvtStructattrService.desicion(form, Boolean.FALSE);
if (CollectionUtils.isEmpty(desicion)){
throw new BadRequestException("分配失败,当前出库分配无可用货位");
}
iStIvtIostorinvDtlOutService.update(new UpdateWrapper<StIvtIostorinvdtlOut>()
.set("vehicle_code",desicion.stream().map(StIvtStructattr::getVehicle_code).collect(Collectors.joining(",")))
.eq("id",form.getString("id")));
int count = iStIvtIostorinvDtlOutService.count(new QueryWrapper<StIvtIostorinvdtlOut>()
.eq("inv_id", form.getString("inv_id")).isNull("vehicle_code"));
if (count == 0){
this.update(new UpdateWrapper<StIvtIostorinvOut>()
.set("status",StatusEnum.FORM_STATUS.code("已分配"))
.eq("id",form.getString("inv_id")));
}
return desicion.get(0).getStruct_code();
}
@Override
@Transactional
public String canceldispense(JSONObject form) {
String vehicles = form.getString("vehicle_code");
if (StringUtils.isNotEmpty(vehicles)){
String[] split = vehicles.split(",");
//更新点位锁,删除分配
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code(""))
.in("vehicle_code", Arrays.asList(split)));
iStIvtIostorinvDtlOutService.update(new UpdateWrapper<StIvtIostorinvdtlOut>()
.set("vehicle_code",null)
.eq("id",form.getString("id")));
this.update(new UpdateWrapper<StIvtIostorinvOut>()
.set("status",StatusEnum.FORM_STATUS.code("生成"))
.eq("id",form.getString("inv_id")));
}
return null;
}
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.stor_manage.io.service.out.iostor_dtl;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.StIvtIostorinvdtlOut;
@@ -21,4 +22,5 @@ public interface IStIvtIostorinvdtlOutService extends IService<StIvtIostorinvdtl
List<Map> getByInv(String inv_id);
}

View File

@@ -23,7 +23,6 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@TableName(value = "st_ivt_iostorinvdtl_out", autoResultMap = true)
public class StIvtIostorinvdtlOut implements Serializable {
private static final long serialVersionUID = 1L;
/**
@@ -109,5 +108,7 @@ public class StIvtIostorinvdtlOut implements Serializable {
private JSONObject form_data;
private Boolean in_storage = Boolean.FALSE;
}

View File

@@ -38,4 +38,5 @@ public interface StIvtIostorinvdtlOutMapper extends BaseMapper<StIvtIostorinvdtl
@Results({@Result(property = "form_data",column = "form_data",typeHandler = FastjsonTypeHandler.class)})
List<Map> findByInv(String inv_id);
}

View File

@@ -1,17 +1,32 @@
package org.nl.wms.stor_manage.io.service.out.iostor_dtl.impl;
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.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.mapper.StIvtIostorinvdtlMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.IStIvtIostorinvdtlOutService;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.StIvtIostorinvdtlOut;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.mapper.StIvtIostorinvdtlOutMapper;
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 org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
@@ -24,6 +39,8 @@ import java.util.Map;
@Service
public class StIvtIostorinvdtlOutServiceImpl extends ServiceImpl<StIvtIostorinvdtlOutMapper, StIvtIostorinvdtlOut> implements IStIvtIostorinvdtlOutService {
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Override
public void batchInsert(List<StIvtIostorinvdtlOut> dtls) {
@@ -35,6 +52,23 @@ public class StIvtIostorinvdtlOutServiceImpl extends ServiceImpl<StIvtIostorinvd
if (StringUtils.isEmpty(inv_id)){
return new ArrayList<>();
}
return this.baseMapper.findByInv(inv_id);
List<Map> byInv = this.baseMapper.findByInv(inv_id);
//查询载具所在仓位
for (Map map : byInv) {
Object vehicle_code = map.get("vehicle_code");
if (vehicle_code!=null){
List<String> vehicles = Arrays.asList(((String) vehicle_code).split(","));
List<StructattrVechielDto> vechielDtos = iStIvtStructattrService.collectVechicle(MapOf.of("material_id", map.get("material_id")
, "pcsn", map.get("pcsn")
, "stor_code", map.get("stor_code")
, "vehicles", vehicles));
String structs = vechielDtos.stream().map(StructattrVechielDto::getStruct_code).collect(Collectors.joining(","));
int qty = vechielDtos.stream().mapToInt(a->a.getQty().intValue()).sum();
map.put("struct_code",structs);
map.put("qty",qty);
}
}
return byInv;
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.stor_manage.struct.controller;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
@@ -13,6 +14,9 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* <p>
* 仓位属性表 前端控制器

View File

@@ -1,9 +1,11 @@
package org.nl.wms.stor_manage.struct.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.common.domain.entity.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import java.util.List;
import java.util.Map;
@@ -31,4 +33,14 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
Object pageQuery(StructattrQuery query, PageQuery page);
void changeActive(StIvtStructattr dto);
/**
* 手动调用出入库规则
* @param form
* @param in
* @return
*/
List<StIvtStructattr> desicion(JSONObject form, Boolean in);
List<StructattrVechielDto> collectVechicle(Map query);
}

View File

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Param;
import org.nl.common.domain.entity.PageQuery;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import java.util.List;
import java.util.Map;
@@ -20,4 +21,6 @@ import java.util.Map;
public interface StIvtStructattrMapper extends BaseMapper<StIvtStructattr> {
List<Map> getPageQuery(@Param("query") StructattrQuery query, PageQuery pageQuery);
List<StructattrVechielDto> collectVehicle(Map query);
}

View File

@@ -36,4 +36,28 @@
</if>
</where>
</select>
<select id="collectVehicle" 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,
st_ivt_structattr.*
FROM
st_ivt_structattr
LEFT JOIN md_pb_vehicleMater ON st_ivt_structattr.vehicle_code = md_pb_vehicleMater.vehicle_code
WHERE
material_id = #{material_id}
AND pcsn = #{pcsn}
AND st_ivt_structattr.stor_code = #{stor_code}
<if test="vehicles != null and vehicles.size() > 0">
AND st_ivt_structattr.vehicle_code in
<foreach collection="vehicles" item="value" index="key" open="(" close=")" separator=",">
#{value}
</foreach>
</if>
<if test="order_by != null and order_by != ''">
order by ${order_by}
</if>
</select>
</mapper>

View File

@@ -0,0 +1,176 @@
package org.nl.wms.stor_manage.struct.service.dto;
import lombok.Data;
import org.nl.common.domain.entity.BaseQuery;
import org.nl.common.domain.entity.QParam;
import org.nl.common.enums.QueryTEnum;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import java.math.BigDecimal;
/*
* @author ZZQ
* @Date 2023/5/4 19:49
*/
@Data
public class StructattrVechielDto extends MdPbVehicleMater {
private static final long serialVersionUID = 1L;
/**
* 仓位标识
*/
private String id;
/**
* 仓位编码
*/
private String struct_code;
/**
* 仓位名称
*/
private String struct_name;
/**
* 库区标识
*/
private String sect_code;
/**
* 仓库标识
*/
private String stor_code;
/**
* 容量
*/
private Integer capacity;
/**
* 宽度
*/
private Integer w;
/**
* 高度
*/
private Integer h;
/**
* 深度(长度)
*/
private Integer l;
/**
* 承受重量
*/
private Integer weight;
/**
* 起始X坐标
*/
private BigDecimal xqty;
/**
* 起始Y坐标
*/
private BigDecimal yqty;
/**
* 起始Z坐标
*/
private BigDecimal zqty;
/**
* 排
*/
private Integer row_num;
/**
* 列
*/
private Integer col_num;
/**
* 层
*/
private Integer layer_num;
/**
* 块
*/
private Integer block_num;
/**
* 超限货位关联的货位编号
*/
private String control_code;
/**
* 创建人
*/
private String create_id;
/**
* 创建人姓名
*/
private String create_name;
/**
* 创建时间
*/
private String create_time;
/**
* 是否临时仓位
*/
private Boolean is_temp;
/**
* 是否启用
*/
private Boolean is_used;
/**
* 锁定类型
*/
private String lock_type;
/**
* 是否判断高度
*/
private String is_zdepth;
/**
* 存储载具号
*/
private String vehicle_code;
/**
* 备注
*/
private String remark;
/**
* 背景图片
*/
private String back_ground_pic;
/**
* 前景色
*/
private String front_ground_color;
/**
* 背景色
*/
private String back_ground_color;
/**
* 字体显示方向
*/
private String font_direction_scode;
}

View File

@@ -1,16 +1,22 @@
package org.nl.wms.stor_manage.struct.service.impl;
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 com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
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.IdUtil;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler;
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.nl.wms.stor_manage.io.service.out.iostor_dtl.dao.StIvtIostorinvdtlOut;
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.dao.StIvtStructattr;
@@ -18,10 +24,15 @@ import org.nl.wms.stor_manage.struct.service.dao.mapper.StIvtStructattrMapper;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -40,6 +51,11 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
private IMdPbVehicleMaterService vehicleMaterService;
@Autowired
private IStIvtStructivtflowService structivtflowService;
@Autowired
private ISysParamService iSysParamService;
@Autowired
@Lazy
private DecisionHandler decisionHandler;
public static void main(String[] args) {
@@ -106,4 +122,22 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
this.updateById(dto);
}
@Override
public List<StIvtStructattr> desicion(JSONObject form, Boolean in) {
//查询出入库配置规则
Param byCode = iSysParamService.findByCode("decision_"+ in);
if (byCode ==null || StringUtils.isEmpty(byCode.getValue())){
throw new BadRequestException("未配置出入库默认规则,请在系统配置中配置");
}
List<String> decisions = Arrays.asList(byCode.getValue().split(","));
List<StIvtStructattr> dispense = decisionHandler.dispense(decisions, form.toJavaObject(StIvtIostorinvdtl.class));
return dispense;
}
@Override
public List<StructattrVechielDto> collectVechicle(Map query) {
List<StructattrVechielDto> collectVehicle = this.baseMapper.collectVehicle(query);
return collectVehicle;
}
}