add:株洲中钨来料入库功能

This commit is contained in:
zhengxuming
2025-07-25 17:59:28 +08:00
parent 2b1b731ee5
commit 63168a7911
22 changed files with 702 additions and 19 deletions

View File

@@ -101,6 +101,10 @@ public interface IStructattrService extends IService<Structattr> {
List<StructattrVechielDto> collectVechicle(Map query);
List<StructattrVechielDto> collectVechicleNoGroup(Map query);
/**
* 出库规则
*/

View File

@@ -17,4 +17,6 @@ public interface StructattrMapper extends BaseMapper<Structattr>{
List<StructattrVechielDto> collectVehicle(Map query);
List<StructattrVechielDto> collectVehicleNoGroup(Map query);
}

View File

@@ -56,4 +56,32 @@
</if>
</where>
</select>
<select id="collectVehicleNoGroup" resultType="org.nl.wms.basedata_manage.service.dao.StructattrVechielDto">
SELECT
ivt.*
FROM
st_ivt_structattr ivt
<where>
ivt.occupancy_state=2
<if test="stor_code != null and stor_code != ''">
AND ivt.stor_code = #{stor_code}
</if>
<if test="sect_code != null and sect_code != ''">
AND ivt.sect_code = #{sect_code}
</if>
<if test="vehicles != null and vehicles.size() > 0">
AND ivt.storagevehicle_code in
<foreach collection="vehicles" item="value" index="key" open="(" close=")" separator=",">
#{value}
</foreach>
</if>
<if test="is_lock != null and is_lock != ''">
and ivt.lock_type = '0'
</if>
<if test="order_by != null and order_by != ''">
order by ${order_by}
</if>
</where>
</select>
</mapper>

View File

@@ -56,4 +56,9 @@ public class StrategyStructParam {
* 出入库类型
*/
private String ioType;
/**
* 出入库类型
*/
private String stragegyType;
}

View File

@@ -319,6 +319,14 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
return this.baseMapper.collectVehicle(query);
}
/**
* 载具库存查询,载具不需要组盘
*/
@Override
public List<StructattrVechielDto> collectVechicleNoGroup(Map query) {
return this.baseMapper.collectVehicleNoGroup(query);
}
/**
* 出库分配
@@ -342,8 +350,8 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
List list = null;
for (String decisionerType : strategy) {
Decisioner decisioner = decisionerMap.get(decisionerType);
log.info("执行出库规格:" + decisioner.strategyConfig.getStrategy_name());
list = decisioner.handler(list, param);
log.info("执行出库规格:" + decisioner.strategyConfig.getStrategy_name());
list = decisioner.handler(list, JSONObject.toJSON(param));
if (CollectionUtils.isEmpty(list)) {
throw new BadRequestException("当前策略" + decisioner.strategyConfig.getStrategy_name() + "无可用货位,分配前数量:" + list.size());
}

View File

@@ -1,5 +1,6 @@
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;
@@ -24,7 +25,7 @@ import java.util.List;
*/
@Service("fifo")
@Slf4j
public class FIFORuleHandler extends Decisioner<StrategyStructMaterialVO, StrategyStructParam> {
public class FIFORuleHandler extends Decisioner<StrategyStructMaterialVO, JSONObject> {
/**
* 出入库明细服务
@@ -33,22 +34,22 @@ public class FIFORuleHandler extends Decisioner<StrategyStructMaterialVO, Strate
private IStructattrService iStructattrService;
@Override
public List<StrategyStructMaterialVO> handler(List<StrategyStructMaterialVO> list, StrategyStructParam param) {
public List<StrategyStructMaterialVO> handler(List<StrategyStructMaterialVO> list, JSONObject param) {
//分配数量
//当前条件只有id批次
log.info("---------执行fifo出库分配规则---------");
BigDecimal planQty = param.getQty();
BigDecimal planQty = param.getBigDecimal("qty");
List<StructattrVechielDto> vechielDtos =
iStructattrService.collectVechicle(MapOf.of("material_id", param.getMaterial_id()
, "pcsn", param.getPcsn()
, "stor_code", param.getStor_code()
, "sect_code", param.getSect_code()
iStructattrService.collectVechicle(MapOf.of("material_id", param.getString("material_id")
, "pcsn", param.getString("pcsn")
, "stor_code", param.getString("stor_code")
, "sect_code", param.getString("sect_code")
, "plan_qty", planQty
, "is_lock", "false"
, "order_by", "gro.update_time asc")
);
if (ObjectUtils.isEmpty(vechielDtos)) {
throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!");
throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!或未组盘!");
}
List<StrategyStructMaterialVO> divStruct = new ArrayList<>();
for (StructattrVechielDto vechielDto : vechielDtos) {

View File

@@ -0,0 +1,100 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.StructattrVechielDto;
import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.nl.wms.decision_manage.service.strategyConfig.enums.StragegyTypeEnum;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhengxuming
* @Date 2025-7-25 11:24:52
* 先进先出/空托盘出库策略
*/
@Service("fifoAndVehicle")
@Slf4j
public class FIFOAndVehicleHandler extends Decisioner<StrategyStructMaterialVO, JSONObject> {
/**
* 出入库明细服务
*/
@Autowired
private IStructattrService iStructattrService;
@Override
public List<StrategyStructMaterialVO> handler(List<StrategyStructMaterialVO> list, JSONObject param) {
//如果是空托盘出库任务,则执行空托盘出库
if (StragegyTypeEnum.STRAGEGY_TYPE.code("空托盘").equals(param.getString("strategyType"))) {
//查新空托盘
//当前条件只有id批次
log.info("---------执行空托盘出库分配规则---------");
BigDecimal planQty = param.getBigDecimal("qty");
List<StructattrVechielDto> vechielDtos =
iStructattrService.collectVechicleNoGroup(MapOf.of(
"stor_code", param.getString("stor_code")
, "sect_code", param.getString("sect_code")
, "is_lock", "false"
, "order_by", "ivt.update_time asc"));
if (ObjectUtils.isEmpty(vechielDtos)) {
throw new BadRequestException("库存分配失败,失败原因:没有空托盘");
}
List<StrategyStructMaterialVO> divStruct = new ArrayList<>();
for (StructattrVechielDto vechielDto : vechielDtos) {
StrategyStructMaterialVO materialVO = new StrategyStructMaterialVO();
BeanUtils.copyProperties(vechielDto, materialVO);
divStruct.add(materialVO);
}
return divStruct;
} else {
//分配数量
//当前条件只有id批次
log.info("---------执行fifo出库分配规则---------");
BigDecimal planQty = param.getBigDecimal("qty");
List<StructattrVechielDto> vechielDtos =
iStructattrService.collectVechicle(MapOf.of("material_id", param.getString("material_id")
, "pcsn", param.getString("pcsn")
, "stor_code", param.getString("stor_code")
, "sect_code", param.getString("sect_code")
, "plan_qty", planQty
, "is_lock", "false"
, "order_by", "gro.update_time asc")
);
if (ObjectUtils.isEmpty(vechielDtos)) {
throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!或未组盘!");
}
List<StrategyStructMaterialVO> divStruct = new ArrayList<>();
for (StructattrVechielDto vechielDto : vechielDtos) {
if (planQty.intValue() <= 0) {
break;
}
BigDecimal qty = vechielDto.getQty();
BigDecimal subQty = planQty.subtract(qty);
if (subQty.doubleValue() >= 0) {
vechielDto.setFrozen_qty(vechielDto.getQty());
} else {
vechielDto.setFrozen_qty(planQty);
}
planQty = subQty;
StrategyStructMaterialVO materialVO = new StrategyStructMaterialVO();
BeanUtils.copyProperties(vechielDto, materialVO);
divStruct.add(materialVO);
}
return divStruct;
}
}
}

View File

@@ -0,0 +1,42 @@
package org.nl.wms.decision_manage.service.strategyConfig.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import java.util.Map;
/**
* 任务枚举类
*
* @author zhengxuming
* @Date 2025/05/26
*/
@AllArgsConstructor
@Getter
public enum StragegyTypeEnum {
// 策略类型
STRAGEGY_TYPE(MapOf.of("1", "空托盘", "2", "正常策略"))
;
private Map<String, String> code;
public String code(String desc) {
String code = this.getCode().get(desc);
if (StringUtils.isNotEmpty(code)) {
return code;
}
throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
}
public String check(String code) {
for (Map.Entry<String, String> entry : this.getCode().entrySet())
if (entry.getValue().equals("code")) {
return entry.getValue();
}
throw new BadRequestException(this.name() + "对应类型" + code + "未定义");
}
}

View File

@@ -104,6 +104,14 @@ public class PdaIosInController {
}
@PostMapping("/zwConfirmIn")
@Log("中钨组盘入库确认")
public ResponseEntity<Object> zwConfirmIn(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "vehicle_code", "site_code");
return new ResponseEntity<>(pdaIosInService.zwConfirmIn(whereJson), HttpStatus.OK);
}
/**
* 拣选余料回库物料查询
*/

View File

@@ -105,6 +105,20 @@ public interface PdaIosInService {
*/
PdaResponse confirmIn(JSONObject whereJson);
/**
* 株洲中钨入库确认
* 步骤1入库确认
* 步骤2空托盘出库
* @param whereJson {
* vehicle_code载具编码
* sect_code库区
* }
* @return PdaResponse
*/
PdaResponse zwConfirmIn(JSONObject whereJson);
/**
* 拣选余料回库物料查询
*

View File

@@ -106,6 +106,4 @@ public interface PdaIosOutService {
PdaResponse vehicleOutConfirm(JSONObject whereJson);
}

View File

@@ -2,6 +2,7 @@ package org.nl.wms.pda_manage.ios_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -15,12 +16,19 @@ import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.domain.vo.SelectItemVo;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.*;
import org.nl.wms.basedata_manage.service.dao.*;
import org.nl.wms.basedata_manage.service.dao.mapper.SectattrMapper;
import org.nl.wms.basedata_manage.service.dto.MaterialQuery;
import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.pda_manage.ios_manage.service.PdaIosInService;
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;
@@ -28,10 +36,18 @@ import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseRegion;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.tasks.BackInTask;
import org.nl.wms.sch_manage.service.util.tasks.VehicleOutTask;
import org.nl.wms.sch_manage.service.util.tasks.zw.InBillTask;
import org.nl.wms.system_manage.service.dict.dao.Dict;
import org.nl.wms.system_manage.service.dict.dao.mapper.SysDictMapper;
import org.nl.wms.system_manage.service.logicflow.dao.StageImage;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
@@ -46,6 +62,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS;
@@ -62,12 +79,17 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Autowired
private Map<String, AbstractTask> applyTaskMap;
/**
* 组盘记录mapper
*/
@Autowired
private MdPbGroupplateMapper mdPbGroupplateMapper;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
/**
* 组盘记录服务
*/
@@ -87,6 +109,12 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Autowired
private IMdPbMeasureunitService iMdPbMeasureunitService;
/**
* 库区
*/
@Autowired
private SectattrMapper sectattrMapper;
/**
* 载具服务
*/
@@ -112,6 +140,9 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Autowired
private IBsrealStorattrService iSrealStorattrService;
@Autowired
private PdaIosOutService pdaIosOutService;
/**
* 入库服务
*/
@@ -128,6 +159,18 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Autowired
private IOStorInvDtlMapper ioStorInvDtlMapper;
/**
* 点位基础信息
*/
@Autowired
private SchBasePointMapper schBasePointMapper;
/**
*
*/
@Autowired
private SysDictMapper sysDictMapper;
/**
* 区域服务
@@ -246,6 +289,7 @@ public class PdaIosInServiceImpl implements PdaIosInService {
public JSONObject getVehicleMaterial(JSONObject whereJson) {
whereJson.put("status", GROUP_PLATE_STATUS.code("组盘"));
whereJson.put("vehicleCode", whereJson.getString("search"));
whereJson.put("noEmptyVehicle", whereJson.getString("noEmptyVehicle"));
List<JSONObject> list = mdPbGroupplateMapper.getVehicleMaterial(whereJson);
if (CollectionUtils.isEmpty(list)) {
throw new BadRequestException("此载具未组盘,请检查!");
@@ -399,6 +443,181 @@ public class PdaIosInServiceImpl implements PdaIosInService {
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse zwConfirmIn(JSONObject whereJson) {
//组盘入库
//根据组盘编号获取物料型号
whereJson.put("vehicleCode", whereJson.getString("vehicle_code"));
whereJson.put("noEmptyVehicle", "1");
String material_model = getVehicleMaterial(whereJson).getString("material_model");
if(StringUtils.isEmpty(material_model)){
throw new BadRequestException("组盘的物料未配置【物料型号】!");
}
//根据物料型号匹配字典表获取入库编码
List<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "MATERIAL_MODEL_SECT")
.eq(Dict::getPara1, material_model));
if(CollectionUtils.isEmpty(dictList)){
throw new BadRequestException("字典MATERIAL_MODEL_SECT未配置物料类型与库区的对应关系请核对");
}
String sect_code = dictList.get(0).getValue();
//根据库区编码获取库区id sect_id
List<Sectattr> sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper<Sectattr>()
.eq(Sectattr::getSect_code, sect_code));
if(CollectionUtils.isEmpty(sectattrList)){
throw new BadRequestException("库区"+sect_code+"不存在,请核对!");
}
//赋值给whereJson
whereJson.put("sect_id",sectattrList.get(0).getSect_id());
//获取起点
SchBasePoint schBasePoint = iSchBasePointService
.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.get("vehicle_code")));
if (ObjectUtil.isEmpty(schBasePoint)) {
throw new BadRequestException("未找到载具所在的点位信息,请检查该载具是否绑定点位");
}
whereJson.put("point_code",whereJson.getString("site_code"));
// 预组织出入库单据实体
Map<String, Object> jsonMstO = organizeInsertData(whereJson);
// 调用服务新增出入库单
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMstO);
// 预组织出入库单据明细的分配数据
whereJson.put("iostorinv_id", iostorinv_id);
Map<String, Object> jsonDtl = organizeDivData(whereJson);
// 调用分配,默认自动分配库位
iRawAssistIStorService.divStruct(new JSONObject(jsonDtl));
// 组织主数据
Map<String, Object> jsonMst = new HashMap<>();
jsonMst.put("point_code", whereJson.getString("point_code"));
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id"))
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> disDtl = iRawAssistIStorService.getDisDtl(map);
// 类型转换
ArrayList<LinkedHashMap> tableMater = new ArrayList<>();
disDtl.forEach(item -> {
tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
jsonMst.put("tableMater", tableMater);
String point_code2 = iRawAssistIStorService.divPointNoTask(jsonMst);
//空托盘出库
// 需要计算新的siteCode 根据方案 找region_code=YLXCQ 原料卸车区的
// 已启用的 编号最大的 空的 point_type = 1 点位
LambdaQueryWrapper<SchBasePoint> queryWrapper = new LambdaQueryWrapper<>(SchBasePoint.class)
.select(SchBasePoint::getPoint_code)
.eq(SchBasePoint::getRegion_code, "YLXCQ")
.eq(SchBasePoint::getIs_used, true)
.eq(SchBasePoint::getPoint_status, 1)
.eq(SchBasePoint::getPoint_type, "1")
.orderByDesc(SchBasePoint::getOut_empty_seq);
List<SchBasePoint> schBasePointList = schBasePointMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(schBasePointList)) {
throw new BadRequestException("原料卸车区不存在空的点位");
}
//从库区拉一个空托盘到这个点位
whereJson.put("siteCode", schBasePointList.get(0).getPoint_code());
LambdaQueryWrapper<MdMeMaterialbase> maQueryWrapper = new LambdaQueryWrapper<>();
maQueryWrapper.eq(MdMeMaterialbase::getMaterial_code, StatusEnum.VEHICLE_TYPE.code("空托盘"));
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getOne(maQueryWrapper);
if (materDao == null) {
throw new BadRequestException("未找到空载具物料信息!");
}
whereJson.put("material_id", materDao.getMaterial_id());
whereJson.put("material_code", materDao.getMaterial_code());
Sectattr sectattr = iSectattrService.getOne(new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getSect_id, whereJson.getString("sect_id"))
.eq(Sectattr::getIs_used, BaseDataEnum.IS_YES_NOT.code(""))
);
if (ObjectUtil.isEmpty(sectattr)) {
throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!");
}
BsrealStorattr storeDao = iSrealStorattrService.getById(sectattr.getStor_id());
whereJson.put("stor_code", storeDao.getStor_code());
whereJson.put("sect_code", sectattr.getSect_code());
StrategyStructParam strategyStructParam = StrategyStructParam.builder()
.ioType(whereJson.getString(StatusEnum.STRATEGY_TYPE.code("出库")))
.sect_code(whereJson.getString("sect_code"))
.stor_code(whereJson.getString("stor_code"))
.material_id(whereJson.getString("material_id"))
.material_code(whereJson.getString("material_code"))
.qty(new BigDecimal(1))
.stragegyType("1")
.build();
List<StrategyStructMaterialVO> structList = iStructattrService.outBoundSectDiv(strategyStructParam);
if (CollectionUtils.isEmpty(structList)) {
throw new BadRequestException("无可用空托盘库存!");
}
//创建任务
JSONObject taskForm = new JSONObject();
taskForm.put("task_type", IOSConstant.IN_BILL_TASK);
taskForm.put("config_code", IOSConstant.IN_BILL_TASK);
taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
taskForm.put("point_code1", whereJson.getString("site_code"));
//计算入库库位
taskForm.put("point_code2", point_code2);
//空托盘出库库位
taskForm.put("point_code3", structList.get(0).getStruct_code());
taskForm.put("point_code4", whereJson.getString("siteCode"));
taskForm.put("vehicle_code", structList.get(0).getStoragevehicle_code());
InBillTask inBillTask = SpringContextHolder.getBean("InBillTask");
String task_id = inBillTask.create(taskForm);
Set<String> vehicleCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStoragevehicle_code)
.collect(Collectors.toSet());
mdPbGroupplateMapper.update(
new GroupPlate(),
new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.in(GroupPlate::getStoragevehicle_code, vehicleCodeSet)
);
//锁定仓位
Set<String> structCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStruct_code)
.collect(Collectors.toSet());
iStructattrService.update(
new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getInv_id, null)
.set(Structattr::getInv_code, null)
.set(Structattr::getInv_type, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))
.in(Structattr::getStruct_code, structCodeSet)
);
//分配明细表更新任务相关数据
IOStorInvDis dis = new IOStorInvDis();
dis.setIostorinvdis_id(dtlDao.getIostorinvdtl_id());
dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成"));
dis.setTask_id(task_id);
dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code(""));
dis.setPoint_code(whereJson.getString("site_code"));
ioStorInvDisMapper.updateById(dis);
return PdaResponse.requestOk();
}
/**
* 组织入库插入数据
* @param whereJson {

View File

@@ -49,6 +49,14 @@ public class SchBasePointController {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/updatePointType")
@Log("修改点位类型")
public ResponseEntity<Object> updatePointType(@Validated @RequestBody SchBasePoint entity) {
schBasePointService.updatePointType(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除点位管理")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {

View File

@@ -40,6 +40,13 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
*/
void update(SchBasePoint entity);
/**
* 编辑点位类型
*
* @param entity /
*/
void updatePointType(SchBasePoint entity);
/**
* 多选删除
*

View File

@@ -144,6 +144,22 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
pointMapper.updateById(entity);
}
@Override
public void updatePointType(SchBasePoint entity) {
SchBasePoint point = pointMapper.selectById(entity.getPoint_code());
if (point == null) {
throw new BadRequestException("点位信息不存在,请核对编码=【" + entity.getPoint_code() + "】的点位在系统中是否配置!");
}
point.setPoint_type(entity.getPoint_type());
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
point.setUpdate_id(currentUserId);
point.setUpdate_name(nickName);
point.setUpdate_time(now);
pointMapper.updateById(point);
}
@Override
@Transactional
public void deleteAll(Set<String> ids) {
@@ -173,6 +189,9 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
}
return pointMapper.selectList(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getRegion_code, region.getRegion_code())
//点位类型,根据传入的值是否为空增加判断
.eq(StringUtils.isNotBlank(region.getPoint_type()), SchBasePoint::getPoint_type, region.getPoint_type())
.eq(SchBasePoint::getIs_has_workder, true));
}

View File

@@ -0,0 +1,184 @@
package org.nl.wms.sch_manage.service.util.tasks.zw;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @Author: zhengxuming
* @Description: 来料入库
* @Date: 2025年7月24日13:19:24
*/
@Component(value = "InBillTask")
@TaskType("InBillTask")
public class InBillTask extends AbstractTask {
/**
* 任务服务类
*/
@Resource
private ISchBaseTaskService taskService;
@Resource
private IInBillService rawAssistIStorService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Resource
private IOutBillService outBillService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setPoint_code3(json.getString("point_code3"));
task.setPoint_code4(json.getString("point_code4"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_code2(json.getString("vehicle_code2"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setStart_device_code2(taskDao.getPoint_code3());
acsTaskDto.setNext_device_code2(taskDao.getPoint_code4());
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type("1");
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) {
throw new BadRequestException("任务状态必须为生成才能取消任务");
}
this.cancelTask(taskObj);
}
@Override
public void backMes(String task_code) {
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj) {
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
rawAssistIStorService.taskFinish(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) {
// 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""))
.set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode())
.set(SchBaseTask::getRemark,"已取消")
.eq(SchBaseTask::getTask_id,taskObj.getTask_id())
);
//分配表清除任务
ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id,null)
.set(IOStorInvDis::getPoint_code,null)
.set(IOStorInvDis::getIs_issued,0)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成"))
.eq(IOStorInvDis::getTask_id,taskObj.getTask_id())
);
// 更新任务状态
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark("已取消");
taskService.updateById(taskObj);
}
}

View File

@@ -78,4 +78,11 @@ public class IOSConstant {
*/
public final static String VEHICLE_OUT_TASK = "VehicleOutTask";
/**
* 来料入库
* 一共需要4个点位 1、卸货区点 2、原料仓上架点 3、空托盘出库点 4、空托盘卸货区放置点
*/
public final static String IN_BILL_TASK = "InBillTask";
}

View File

@@ -46,6 +46,8 @@ public interface IInBillService extends IService<IOStorInv> {
void divPoint(Map whereJson);
String divPointNoTask(Map whereJson);
void confirm(Map whereJson);
void taskFinish(SchBaseTask task);

View File

@@ -551,6 +551,22 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
ioStorInvDisMapper.updateById(dis);
}
@Override
public String divPointNoTask(Map whereJson) {
ArrayList<HashMap> rows = (ArrayList<HashMap>) whereJson.get("tableMater");
String point_code = (String) whereJson.get("point_code");
HashMap<String, String> map = rows.get(0);
//判断是否已经分配好货位
IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinvdis_id, map.get("iostorinvdis_id"))
.and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).or().ne(IOStorInvDis::getStruct_code, "")));
if (ObjectUtil.isEmpty(ioStorInvDis)) {
throw new BadRequestException("该明细还没分配货位,请先分配货位");
}
return ioStorInvDis.getStruct_code();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void confirm(Map whereJson) {

View File

@@ -58,7 +58,8 @@
gro.*,
mater.material_id,
mater.material_code,
mater.material_name
mater.material_name,
mater.material_model
FROM
md_pb_groupplate gro
LEFT JOIN md_me_materialbase mater ON mater.material_id = gro.material_id
@@ -68,6 +69,10 @@
AND
gro.storagevehicle_code = #{params.vehicleCode}
</if>
<if test="params.noEmptyVehicle != null and params.noEmptyVehicle != ''">
AND
mater.material_name <![CDATA[ <> ]]> '空托盘'
</if>
<if test="params.status != null and params.status != ''">
AND
gro.status = #{params.status}
@@ -76,6 +81,7 @@
AND
gro.qty>0
</if>
</where>
ORDER BY gro.create_time Desc
</select>

View File

@@ -259,9 +259,12 @@ export default {
this.sects = res.content
})
const area_type = 'RKQ'
const area_type = 'YLXCQ'
crudPoint.getPointList({ 'region_code': area_type }).then(res => {
// 点位类型,因为卸货区的点位类型(出库区、入库区)会变动,因需要增加点位类型字段进行判断
// 1-入库区2-出库区
const region_type = '1'
crudPoint.getPointList({ 'region_code': area_type, 'region_type': region_type }).then(res => {
this.pointlist = res
})
},

View File

@@ -323,10 +323,12 @@ export default {
crudSectattr.getSect({ 'stor_id': this.storId }).then(res => {
this.sects = res.content
})
const area_type = 'CKQ'
crudPoint.getPointList({ 'region_code': area_type }).then(res => {
this.pointList = res
const area_type = 'YLXCQ'
// 点位类型,因为卸货区的点位类型(出库区、入库区)会变动,因需要增加点位类型字段进行判断
// 1-入库区2-出库区
const region_type = '2'
crudPoint.getPointList({ 'region_code': area_type, 'region_type': region_type }).then(res => {
this.pointlist = res
})
},
close() {