feat: 解包下料

This commit is contained in:
2025-07-24 15:56:18 +08:00
parent 2b1b731ee5
commit e58c2ab587
25 changed files with 652 additions and 77 deletions

View File

@@ -67,4 +67,5 @@ public interface ISectattrService extends IService<Sectattr> {
*/
void changeActive(JSONObject json);
Sectattr findByCode(String code);
}

View File

@@ -230,9 +230,13 @@ public class Structattr implements Serializable {
*/
private String remark;
/**
* 放置类型
*/
private String placement_type;
/**
* 占用状态1空位 2空载具 3有料
*/
private Integer placement_type;
private Integer occupancy_state;
}

View File

@@ -2,13 +2,14 @@ package org.nl.wms.basedata_manage.service.dto;
import lombok.Data;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
/**
* @author dsh
* 2025/6/5
*/
@Data
public class MdPbStoragevehicleextDto extends MdPbStoragevehicleext{
public class MdPbStoragevehicleextDto extends GroupPlate {
/**
* 库区标识

View File

@@ -56,4 +56,8 @@ public class StrategyStructParam {
* 出入库类型
*/
private String ioType;
/**
* 载具类型
*/
private String dis_id;
}

View File

@@ -241,4 +241,12 @@ public class SectattrServiceImpl extends ServiceImpl<SectattrMapper, Sectattr> i
.eq(Structattr::getSect_id, sect_id)
);
}
@Override
public Sectattr findByCode(String code) {
LambdaQueryWrapper<Sectattr> queryWrapper = new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getSect_code, code)
.eq(Sectattr::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""));
return getOne(queryWrapper, false);
}
}

View File

@@ -0,0 +1,23 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 原料出库规则
* @Author: lyd
* @Date: 2025/7/24
*/
@Slf4j
@Component("RawOutRuleHandle")
public class RawOutRuleHandle extends Decisioner<Structattr, JSONObject> {
@Override
public List<Structattr> handler(List<Structattr> list, JSONObject param) {
return null;
}
}

View File

@@ -0,0 +1,56 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 解包入库策略
* @Author: lyd
* @Date: 2025/7/23
*/
@Service("unpacking")
@Slf4j
public class UnpackingRuleHandler extends Decisioner<Structattr, JSONObject> {
@Resource
private IStructattrService iStructattrService;
@Resource
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
@Resource
private IOStorInvDisMapper disMapper;
@Override
public List<Structattr> handler(List<Structattr> list, JSONObject param) {
IOStorInvDis dis = disMapper.selectById(param.getString("dis_id"));
MdPbStoragevehicleinfo vinfo = iMdPbStoragevehicleinfoService.getByCode(dis.getStoragevehicle_code());
if (ObjectUtil.isEmpty(vinfo)) {
throw new BadRequestException("载具号【" + dis.getStoragevehicle_code() + "】未维护信息!");
}
// 获取仓库中对应托盘类型的可出的空桶点位
List<Structattr> outPoints = iStructattrService.list(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getOccupancy_state, 2)
.eq(Structattr::getStoragevehicle_type, vinfo.getStoragevehicle_type())
.eq(Structattr::getLock_type, "0")
.eq(Structattr::getSect_code, param.getString("sect_code"))
.eq(Structattr::getStor_id, param.getString("stor_code"))
.isNotNull(Structattr::getStoragevehicle_code)
.isNull(Structattr::getTask_code));
if (outPoints.size() == 0) {
throw new BadRequestException("料桶缓存库无空桶!");
}
return outPoints;
}
}

View File

@@ -38,4 +38,16 @@ public class PdaJBController {
public ResponseEntity<Object> callMaterial(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaJBService.callMaterial(whereJson), HttpStatus.OK);
}
@PostMapping("/getWeight")
@Log("获取重量")
@SaIgnore
public ResponseEntity<Object> getWeight(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaJBService.getWeight(whereJson), HttpStatus.OK);
}
@PostMapping("/downMaterial")
@Log("解包下料")
@SaIgnore
public ResponseEntity<Object> downMaterial(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaJBService.downMaterial(whereJson), HttpStatus.OK);
}
}

View File

@@ -11,4 +11,8 @@ public interface PdaJBService {
PdaResponse getOrderList(JSONObject whereJson);
PdaResponse callMaterial(JSONObject whereJson);
PdaResponse getWeight(JSONObject whereJson);
PdaResponse downMaterial(JSONObject whereJson);
}

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
@@ -13,8 +14,10 @@ import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
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.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Sectattr;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.pda_manage.sch_manage.service.PdaJBService;
import org.nl.wms.pda_manage.sch_manage.service.mapper.PdaJBMapper;
@@ -23,15 +26,19 @@ import org.nl.wms.pm_manage.service.IPdmBdWorkorderService;
import org.nl.wms.pm_manage.service.dao.PdmBdWorkorder;
import org.nl.wms.sch_manage.service.ISchBasePointService;
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.jb.JbUpAgvTask;
import org.nl.wms.system_manage.service.dict.ISysDictService;
import org.nl.wms.system_manage.service.dict.dao.Dict;
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.IOStorInv;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,9 +47,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
* @Author: lyd
@@ -75,10 +80,18 @@ public class PdaJBServiceImpl implements PdaJBService {
private ISchBasePointService pointService;
@Resource
private JbUpAgvTask jbUpAgvTask;
@Resource
private ISysDictService dictService;
@Resource
private ISectattrService sectattrService;
@Resource
private IInBillService inBillService;
@Override
public PdaResponse getOrderList(JSONObject whereJson) {
List<PdmBdWorkorder> workorders = pdaJBMapper.getUnProductOrderList(whereJson.getString("point_code"));
String flag = whereJson.getString("flag");
List<PdmBdWorkorder> workorders = pdaJBMapper.getUnProductOrderList(
whereJson.getString("point_code"),
"1".equals(flag) ? "1" : "4");
return PdaResponse.requestParamOk(workorders);
}
@@ -95,8 +108,8 @@ public class PdaJBServiceImpl implements PdaJBService {
if (ObjectUtil.isEmpty(workorder)) {
throw new BadRequestException("工单不存在!");
}
if ("3".equals(workorder.getWorkorder_status())) {
throw new BadRequestException("该工单已经执行中,请勿重复开工!");
if (!"1".equals(workorder.getWorkorder_status())) {
throw new BadRequestException("该工单不是未生产,无法开工!");
}
// 出库的仓位
Structattr outStructAttr = structattrService.getByCode(workorder.getStruct_code());
@@ -127,7 +140,7 @@ public class PdaJBServiceImpl implements PdaJBService {
ioStorInv.setStor_code(outStructAttr.getStor_code());
ioStorInv.setStor_name(outStructAttr.getStor_name());
ioStorInv.setBill_status(IOSEnum.BILL_STATUS.code("分配完"));
ioStorInv.setBill_type("1009");
ioStorInv.setBill_type("1010");
ioStorInv.setIs_delete(BaseDataEnum.IS_YES_NOT.code(""));
ioStorInv.setIs_upload(BaseDataEnum.IS_YES_NOT.code(""));
ioStorInv.setInput_optid(currentUserId);
@@ -183,7 +196,7 @@ public class PdaJBServiceImpl implements PdaJBService {
lock_map.put("inv_code", ioStorInv.getBill_code());
lock_map.put("inv_type", ioStorInv.getBill_type());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁"));
iStructattrService.updateStatusByCode("0",lock_map);
iStructattrService.updateStatusByCode("0", lock_map);
//更新组盘表冻结数量状态
iMdPbGroupPlateService.update(new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getFrozen_qty, "1")
@@ -192,7 +205,7 @@ public class PdaJBServiceImpl implements PdaJBService {
.eq(GroupPlate::getStoragevehicle_code, outStructAttr.getStoragevehicle_code())
.eq(GroupPlate::getPcsn, groupPlate.getPcsn())
.eq(GroupPlate::getMaterial_id, materialbase.getMaterial_id())
.eq(GroupPlate::getStatus,IOSEnum.GROUP_PLATE_STATUS.code("入库")));
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
// 2、创建任务、下发
// 获取工单对应的区域的出入点
SchBasePoint inPoint = pointService.getNotTaskByRegionAndType(workorder.getRegion_code(), "3");
@@ -204,7 +217,7 @@ public class PdaJBServiceImpl implements PdaJBService {
task_form.put("task_type", "JbUpAgvTask");
task_form.put("group_id", groupPlate.getGroup_id());
task_form.put("order_id", workorder.getWorkorder_id());
task_form.put("TaskCode",CodeUtil.getNewCode("TASK_CODE"));
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("point_code1", outStructAttr.getStruct_code());
task_form.put("point_code2", inPoint.getPoint_code());
task_form.put("vehicle_code", outStructAttr.getStoragevehicle_code());
@@ -232,4 +245,157 @@ public class PdaJBServiceImpl implements PdaJBService {
pointService.updateBatchById(Arrays.asList(inPoint, outPoint));
return PdaResponse.requestOk();
}
@Override
public PdaResponse getWeight(JSONObject whereJson) {
// todo: 调用acs获取
JSONObject res = new JSONObject();
res.put("weight", "999.99");
res.put("flag", "2");
res.put("message", "重量误差过大,请注意!");
return PdaResponse.requestParamOk(res);
}
@Override
@Transactional(rollbackFor = Exception.class)
public PdaResponse downMaterial(JSONObject whereJson) {
// 用任务组的方式下发任务3条任务
log.info("解包下料,请求参数:{}", whereJson);
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
// workorder_id、area、point_code、weight、tp_code、lt_code
String area = whereJson.getString("area");
// 设备
String pointCode = whereJson.getString("point_code");
BigDecimal weight = whereJson.getBigDecimal("weight");
String tpCode = whereJson.getString("tp_code");
String ltCode = whereJson.getString("lt_code");
String workorderId = whereJson.getString("workorder_id");
PdmBdWorkorder workorder = workorderService.getById(workorderId);
if (ObjectUtil.isEmpty(workorder)) {
throw new BadRequestException("工单不存在!");
}
// 物料
MdMeMaterialbase materialbase = materialbaseService.getById(workorder.getMaterial_id());
if (ObjectUtil.isEmpty(materialbase)) {
throw new BadRequestException("物料【" + workorder.getMaterial_id() + "】不存在!");
}
// 0、创建组盘
GroupPlate groupPlate = new GroupPlate();
groupPlate.setGroup_id(IdUtil.getStringId());
groupPlate.setStoragevehicle_code(ltCode);
// 料桶类型根据工单,工单是根据点位
groupPlate.setStoragevehicle_type(workorder.getVehicle_type());
groupPlate.setMaterial_id(materialbase.getMaterial_id());
groupPlate.setPcsn(DateUtil.format(new Date(), "yyyy-MM-dd"));
groupPlate.setQty(weight);
groupPlate.setQty_unit_id("11");
groupPlate.setQty_unit_name("kg");
groupPlate.setFrozen_qty(BigDecimal.ZERO);
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
groupPlate.setCreate_id(currentUserId);
groupPlate.setCreate_name(nickName);
groupPlate.setCreate_time(now);
groupplateService.save(groupPlate);
Dict dict = dictService.getDictByCodeAndValue("storagevehicle_type", workorder.getVehicle_type());
Sectattr sect = sectattrService.findByCode(dict.getPara1());
// 组装插入主表明细表的数据
Map<String, Object> insertInvObj = buildInsertData(ltCode, workorder, materialbase, groupPlate, sect);
String invId = inBillService.insertDtl(insertInvObj);
// 组织数据,调用分配货位
JSONObject divObj = buildDivStructData(sect, invId);
inBillService.divStruct(divObj);
// 一键设置,创建任务
// 组建参数
Map<String, Object> jsonMst = buildTaskData(pointCode, workorderId, invId);
inBillService.divPoint(jsonMst);
// 工单完成
workorder.setWorkorder_status("5");
workorder.setRealproduceend_date(DateUtil.now());
workorderService.updateById(workorder);
return PdaResponse.requestOk();
}
private Map<String, Object> buildTaskData(String pointCode, String workorderId, String invId) {
Map<String, Object> jsonMst = new HashMap<>();
// ru库点
List<SchBasePoint> rkq = pointService.list(new LambdaUpdateWrapper<SchBasePoint>()
.eq(SchBasePoint::getRegion_code, "RKQ")
.eq(SchBasePoint::getParent_point_code, pointCode)
.isNull(SchBasePoint::getIng_task_code));
if (rkq.size() == 0) {
throw new BadRequestException("找不到可用的解包区入库点!");
}
jsonMst.put("point_code", rkq.get(0).getPoint_code());
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, invId)
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> disDtl = inBillService.getDisDtl(map);
// 类型转换
ArrayList<LinkedHashMap> tableMater = new ArrayList<>();
disDtl.forEach(item -> {
tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
jsonMst.put("tableMater", tableMater);
jsonMst.put("workorder_id", workorderId);
return jsonMst;
}
private JSONObject buildDivStructData(Sectattr sect, String invId) {
JSONObject divObj = new JSONObject();
divObj.put("sect_code", sect.getSect_code());
divObj.put("stor_code", sect.getStor_id());
divObj.put("checked", true);
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, invId));
if (ioStorInvDis.size() == 0) {
throw new BadRequestException("分配明细不存在!");
}
// 类型转换
ArrayList<LinkedHashMap> tables = new ArrayList<>();
ioStorInvDis.forEach(item -> {
tables.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
divObj.put("tableMater", tables);
return divObj;
}
public static Map<String, Object> buildInsertData(String ltCode, PdmBdWorkorder workorder, MdMeMaterialbase materialbase, GroupPlate groupPlate, Sectattr sect) {
Map<String, Object> insertInvObj = new HashMap();
ArrayList<HashMap> tableData = new ArrayList<>();
HashMap<String, Object> table = new HashMap<>();
tableData.add(table);
insertInvObj.put("stor_id", sect.getStor_id());
insertInvObj.put("bill_status", "10");
insertInvObj.put("total_qty", workorder.getPlan_weight());
insertInvObj.put("detail_count", 1);
insertInvObj.put("bill_type", "0011");
insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
insertInvObj.put("tableData", tableData);
table.put("group_id", groupPlate.getGroup_id());
table.put("storagevehicle_code", ltCode);
table.put("storagevehicle_type", workorder.getVehicle_type());
table.put("material_id", materialbase.getMaterial_id());
table.put("pcsn", groupPlate.getPcsn());
table.put("qty", groupPlate.getQty());
table.put("qty_unit_id", groupPlate.getQty_unit_id());
table.put("qty_unit_name", groupPlate.getQty_unit_name());
table.put("fronzen_qty", groupPlate.getFrozen_qty());
table.put("status", "01");
table.put("material_code", materialbase.getMaterial_code());
table.put("material_name", materialbase.getMaterial_name());
table.put("material_spec", materialbase.getMaterial_spec());
return insertInvObj;
}
}

View File

@@ -1,6 +1,8 @@
package org.nl.wms.pda_manage.sch_manage.service.mapper;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.pm_manage.service.dao.PdmBdWorkorder;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import java.util.List;
@@ -9,5 +11,21 @@ import java.util.List;
* @Date: 2025/7/21
*/
public interface PdaJBMapper {
List<PdmBdWorkorder> getUnProductOrderList(String pointCode);
List<PdmBdWorkorder> getUnProductOrderList(String pointCode, String workorder_status);
/**
* 查找没有任务的空桶仓位
* @param vehicleType
* @param storCode
* @return
*/
List<Structattr> getNoTaskEmptyBarrelStructs(String vehicleType, String storCode);
/**
* 获取可以用的开该机
* @param workorder
* @param pointStatus
* @return
*/
List<SchBasePoint> getCanUseCFGJ(PdmBdWorkorder workorder, String pointStatus);
}

View File

@@ -2,14 +2,39 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.pda_manage.sch_manage.service.mapper.PdaJBMapper">
<select id="getUnProductOrderList" resultType="org.nl.wms.pm_manage.service.dao.PdmBdWorkorder">
SELECT
o.*,
mm.material_code,
mm.material_name
FROM
`pdm_bd_workorder` o
LEFT JOIN md_me_materialbase mm ON mm.material_id = o.material_id
WHERE o.workorder_status = '1'
SELECT o.*,
mm.material_code,
mm.material_name
FROM `pdm_bd_workorder` o
LEFT JOIN md_me_materialbase mm ON mm.material_id = o.material_id
WHERE o.workorder_status = #{workorder_status}
AND o.point_code = #{pointCode}
</select>
<select id="getNoTaskEmptyBarrelStructs" resultType="org.nl.wms.basedata_manage.service.dao.Structattr">
</select>
<select id="getCanUseCFGJ" resultType="org.nl.wms.sch_manage.service.dao.SchBasePoint">
SELECT
p.*
FROM
`sch_base_point` p
WHERE
p.region_code = #{workorder.region_code}
AND p.point_status = #{pointStatus}
AND p.can_vehicle_type LIKE CONCAT('%', #{workorder.vehicle_type}, '%')
AND 0 = (
SELECT
COUNT(*)
FROM
sch_base_task t
WHERE
t.is_delete = '0'
AND t.task_status <![CDATA[<]]> '4'
AND (
t.point_code1 = p.point_code
OR t.point_code2 = p.point_code
OR t.point_code3 = p.point_code
OR t.point_code4 = p.point_code
))
</select>
</mapper>

View File

@@ -107,4 +107,12 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
pointType, String pointCode, String vehicleIsNull, boolean isFourPoint);
SchBasePoint getNotTaskByRegionAndType(String regionCode, String s);
/**
* 获取可用的没任务的点位
* @param parentPoint
* @param pointStatus
* @return
*/
List<SchBasePoint> getCanUseCFGJs(SchBasePoint parentPoint, String pointStatus);
}

View File

@@ -46,4 +46,6 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
IPage<SchBasePoint> selectPageLeftJoin(IPage<SchBasePoint> pages, SchBasePointQuery whereJson);
SchBasePoint getNotTaskByRegionAndType(String regionCode, String type);
List<SchBasePoint> getCanUseCFGJs(SchBasePoint parentPoint, String pointStatus);
}

View File

@@ -86,4 +86,28 @@
AND t.point_code4 = p.point_code
))
</select>
<select id="getCanUseCFGJs" resultType="org.nl.wms.sch_manage.service.dao.SchBasePoint">
SELECT
p.*
FROM
`sch_base_point` p
WHERE
p.region_code = 'DTCFGQ'
AND p.point_status = #{pointStatus}
AND p.can_vehicle_type LIKE CONCAT('%', #{parentPoint.can_vehicle_type}, '%')
AND 0 = (
SELECT
COUNT(*)
FROM
sch_base_task t
WHERE
t.is_delete = '0'
AND t.task_status <![CDATA[<]]> '4'
AND (
t.point_code1 = p.point_code
OR t.point_code2 = p.point_code
OR t.point_code3 = p.point_code
OR t.point_code4 = p.point_code
))
</select>
</mapper>

View File

@@ -172,8 +172,7 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
return this.list();
}
return pointMapper.selectList(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getRegion_code, region.getRegion_code())
.eq(SchBasePoint::getIs_has_workder, true));
.eq(SchBasePoint::getRegion_code, region.getRegion_code()));
}
@Override
@@ -292,4 +291,9 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
return this.baseMapper.getNotTaskByRegionAndType(regionCode, type);
}
@Override
public List<SchBasePoint> getCanUseCFGJs(SchBasePoint parentPoint, String pointStatus) {
return this.baseMapper.getCanUseCFGJs(parentPoint, pointStatus);
}
}

View File

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.ext_manage.service.WmsToAcsService;
import org.nl.wms.ext_manage.service.util.AcsResponse;
import org.nl.wms.sch_manage.enums.TaskStatus;
@@ -142,6 +143,16 @@ public abstract class AbstractTask {
return resultForAcs;
}
/**
* 申请任务
*
* @param param
* @throws BadRequestException
*/
public void apply(JSONObject param) throws BadRequestException {
}
/**
* 反馈任务状态
* @param taskCode 任务编码

View File

@@ -0,0 +1,87 @@
package org.nl.wms.sch_manage.service.util.tasks.jb;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 解包下料
* @Author: lyd
* @Date: 2025/7/24
*/
@Slf4j
@Component("JbDownAgvTask")
public class JbDownAgvTask extends AbstractTask {
@Resource
private ISchBaseTaskService taskService;
@Override
public String create(JSONObject param) {
// 改造:多条任务
JSONArray tasks = param.getJSONArray("tasks");
List<SchBaseTask> batchTask = new ArrayList<>();
for (int i = 0; i < tasks.size(); i++) {
JSONObject json = tasks.getJSONObject(i);
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.setTask_group_id(json.getString("task_group_id"));
task.setTask_group_seq(json.getBigDecimal("task_group_seq"));
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());
batchTask.add(task);
}
taskService.saveBatch(batchTask);
return batchTask.get(2).getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
return null;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
}
@Override
public void forceFinish(String task_code) {
}
@Override
public void cancel(String task_code) {
}
@Override
public void backMes(String task_code) {
}
}

View File

@@ -35,7 +35,7 @@ import javax.annotation.Resource;
*/
@Component("JbUpAgvTask")
public class JbUpAgvTask extends AbstractTask {
@Autowired
@Resource
private ISchBaseTaskService taskService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@@ -127,7 +127,7 @@ public class JbUpAgvTask extends AbstractTask {
JSONObject requestParam = JSONObject.parseObject(taskObj.getRequest_param());
String orderId = requestParam.getString("order_id");
workorderService.update(new LambdaUpdateWrapper<PdmBdWorkorder>()
.set(PdmBdWorkorder::getWorkorder_status, "5")
.set(PdmBdWorkorder::getWorkorder_status, "4")
.set(PdmBdWorkorder::getReal_qty, 1)
.set(PdmBdWorkorder::getRealproduceend_date, DateUtil.now())
.eq(PdmBdWorkorder::getWorkorder_id, orderId));

View File

@@ -89,4 +89,12 @@ public interface ISysDictService extends IService<Dict> {
* 动态枚举信息
*/
List<Map> dynamicTableEnum(String table,String label,String value);
/**
* 获取key-value的对象
* @param code
* @param value
* @return
*/
Dict getDictByCodeAndValue(String code, String value);
}

View File

@@ -48,7 +48,7 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
.like(ObjectUtil.isNotEmpty(blurry), Dict::getCode, blurry)
.or(ObjectUtil.isNotEmpty(blurry))
.like(ObjectUtil.isNotEmpty(blurry), Dict::getName, blurry)
.orderBy(true, true, Dict::getCode)
.orderBy(true, true, Dict::getCode)
.groupBy(Dict::getCode, Dict::getName));
return pages;
}
@@ -61,7 +61,8 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
String date = DateUtil.now();
List<Dict> oldDict = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>()
.eq(ObjectUtil.isNotEmpty(dict.getCode()), Dict::getCode, dict.getCode()));
if (ObjectUtil.isNotEmpty(oldDict)) throw new BadRequestException(LangProcess.msg("error_ParamExist",dict.getCode()));
if (ObjectUtil.isNotEmpty(oldDict))
throw new BadRequestException(LangProcess.msg("error_ParamExist", dict.getCode()));
dict.setDict_id(IdUtil.getSnowflake(1, 1).nextIdStr());
dict.setCreate_id(currentUserId);
dict.setCreate_name(nickName);
@@ -81,7 +82,7 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
}
List<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>().eq(Dict::getCode, dto.getCode()));
if (ObjectUtil.isNotEmpty(dictList) && !dto.getCode().equals(dict.getCode()))
throw new BadRequestException(LangProcess.msg("error_ParamExist",dto.getCode()));
throw new BadRequestException(LangProcess.msg("error_ParamExist", dto.getCode()));
String currentUserId = SecurityUtils.getCurrentUserId();
String currentNickName = SecurityUtils.getCurrentNickName();
// 根据code获取所有字典
@@ -132,7 +133,8 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
// 校验是否已经有标签
Dict one = sysDictMapper.selectOne(new LambdaQueryWrapper<Dict>().eq(Dict::getLabel, dict.getLabel())
.eq(Dict::getCode, dict.getCode()));
if (ObjectUtil.isNotEmpty(one)) throw new BadRequestException(LangProcess.msg("error_ParamExist",dict.getCode()));
if (ObjectUtil.isNotEmpty(one))
throw new BadRequestException(LangProcess.msg("error_ParamExist", dict.getCode()));
// 判断是否有空的值
List<Dict> selectOne = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>().eq(Dict::getCode, dict.getCode()));
Dict dic = selectOne.get(0);
@@ -173,7 +175,7 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
List<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>().eq(Dict::getLabel, resources.getLabel())
.eq(Dict::getCode, resources.getCode()));
if (ObjectUtil.isNotEmpty(dictList) && !resources.getLabel().equals(dict.getLabel())) {
throw new BadRequestException(LangProcess.msg("error_ParamExist",resources.getLabel()));
throw new BadRequestException(LangProcess.msg("error_ParamExist", resources.getLabel()));
}
resources.setUpdate_id(SecurityUtils.getCurrentUserId());
resources.setUpdate_name(SecurityUtils.getCurrentNickName());
@@ -197,9 +199,19 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
@Override
public List<Map> dynamicTableEnum(String table, String label, String value) {
if (StringUtils.isEmpty(table)||StringUtils.isEmpty(label)||StringUtils.isEmpty(value)){
if (StringUtils.isEmpty(table) || StringUtils.isEmpty(label) || StringUtils.isEmpty(value)) {
throw new BadRequestException("参数不能为空");
}
return this.sysDictMapper.dynamicTableEnum(table,label,value);
return this.sysDictMapper.dynamicTableEnum(table, label, value);
}
@Override
public Dict getDictByCodeAndValue(String code, String value) {
LambdaQueryWrapper<Dict> lam = new LambdaQueryWrapper<>();
lam.eq(Dict::getCode, code)
.eq(Dict::getValue, value)
.isNotNull(Dict::getLabel)
.ne(Dict::getLabel, "");
return getOne(lam, false);
}
}

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -28,8 +29,11 @@ import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleinfoMappe
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.tasks.StInTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
@@ -84,6 +88,10 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
@Resource
private MdPbGroupplateServiceImpl mdPbGroupplateService;
@Resource
private ISchBasePointService pointService;
@Resource
private JbDownAgvTask jbDownAgvTask;
@Override
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page) {
@@ -358,6 +366,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
.material_code(param.getString("material_code"))
.qty(new BigDecimal(param.getString("qty")))
.pcsn(param.getString("pcsn"))
.dis_id(map.get("iostorinvdis_id"))
.build());
Structattr struct = structattrs.get(0);
sect_id = struct.getSect_id();
@@ -525,21 +534,108 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
if (ObjectUtil.isEmpty(ioStorInvDis)){
throw new BadRequestException("该明细还没分配货位,请先分配货位");
}
IOStorInv invObj = this.getById(map.get("iostorinv_id"));
String task_id = "";
if ("0011".equals(invObj.getBill_type())) {
String structCode = map.get("struct_code");
if (ObjectUtil.isEmpty(structCode)) {
throw new BadRequestException("仓位未分配!");
}
// 获取组盘信息
GroupPlate groupPlate = mdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, ioStorInvDis.getStoragevehicle_code())
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("task_type", "STInTask");
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("PickingLocation", point_code);
task_form.put("PlacedLocation", ioStorInvDis.getStruct_code());
task_form.put("vehicle_code", map.get("storagevehicle_code"));
// GroupPlate groupPlate = mdPbGroupplateMapper.selectOne(new LambdaQueryWrapper<>(GroupPlate.class)
// .eq(GroupPlate::getStoragevehicle_code,map.get("storagevehicle_code"))
// );
// task_form.put("group_id", groupPlate.getGroup_id());
StInTask stInTask = SpringContextHolder.getBean("STInTask");
Structattr inStruct = iStructattrService.findByCode(structCode);
// 解包入库 (创建3条任务并且为一组)
SchBasePoint rkPoint = pointService.getById(point_code);
// 父点位
SchBasePoint parentPoint = pointService.getById(rkPoint.getParent_point_code());
// 2、创建任务4条任务、优先级需要获取所有的任务中的最小值并且-1默认8
// 获取工单对应的区域的出入点
SchBasePoint intoPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "2");
SchBasePoint emptyPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "5");
SchBasePoint fullPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "6");
// 获取有盖子的对应的点位
List<SchBasePoint> canUseCFGJs = pointService.getCanUseCFGJs(parentPoint, "2");
if (canUseCFGJs.size() == 0) {
throw new BadRequestException("找不到可用的拆封盖机");
}
SchBasePoint cfgjPoint = canUseCFGJs.get(0);
// 创建任务1
String taskGroupId = IdUtil.getStringId();
JSONObject task1 = new JSONObject();
task1.put("task_type", "JbDownAgvTask");
task1.put("group_id", groupPlate.getGroup_id());
task1.put("workorder_id", whereJson.get("workorder_id"));
task1.put("task_group_id", taskGroupId);
task1.put("task_group_seq", 1);
task1.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task1.put("point_code1", structCode);
task1.put("point_code2", cfgjPoint.getPoint_code());
task1.put("point_code3", cfgjPoint.getPoint_code());
task1.put("point_code4", emptyPoint.getPoint_code());
task1.put("seq", 1);
// 空托盘
task1.put("vehicle_code", inStruct.getStoragevehicle_code());
// 入库的满托盘
task1.put("vehicle_code2", map.get("storagevehicle_code"));
// 创建任务2
JSONObject task2 = new JSONObject();
task2.put("task_type", "JbDownAgvTask");
task2.put("group_id", groupPlate.getGroup_id());
task2.put("task_group_id", taskGroupId);
task2.put("task_group_seq", 2);
task2.put("workorder_id", whereJson.get("workorder_id"));
task2.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task2.put("point_code1", intoPoint.getPoint_code());
task2.put("point_code2", fullPoint.getPoint_code());
task2.put("point_code3", emptyPoint.getPoint_code());
task2.put("point_code4", intoPoint.getPoint_code());
task2.put("seq", 2);
// 空托盘
task2.put("vehicle_code", inStruct.getStoragevehicle_code());
// 入库的满托盘
task2.put("vehicle_code2", map.get("storagevehicle_code"));
// 创建任务3
JSONObject task3 = new JSONObject();
task3.put("task_type", "JbDownAgvTask");
task3.put("group_id", groupPlate.getGroup_id());
task3.put("task_group_id", taskGroupId);
task3.put("task_group_seq", 3);
task3.put("workorder_id", whereJson.get("workorder_id"));
task3.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task3.put("point_code1", fullPoint.getPoint_code());
task3.put("point_code2", cfgjPoint.getPoint_code());
task3.put("point_code3", cfgjPoint.getPoint_code());
task3.put("point_code4", structCode);
task3.put("seq", 3);
// 空托盘
task3.put("vehicle_code", inStruct.getStoragevehicle_code());
// 入库的满托盘
task3.put("vehicle_code2", map.get("storagevehicle_code"));
List<JSONObject> jsonObjects = Arrays.asList(task1, task2, task3);
JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects);
jbDownAgvTask.create(requestTaskParam);
} else {
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("task_type", "STInTask");
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("PickingLocation", point_code);
task_form.put("PlacedLocation", ioStorInvDis.getStruct_code());
task_form.put("vehicle_code", map.get("storagevehicle_code"));
// GroupPlate groupPlate = mdPbGroupplateMapper.selectOne(new LambdaQueryWrapper<>(GroupPlate.class)
// .eq(GroupPlate::getStoragevehicle_code,map.get("storagevehicle_code"))
// );
// task_form.put("group_id", groupPlate.getGroup_id());
StInTask stInTask = SpringContextHolder.getBean("STInTask");
task_id = stInTask.create(task_form);
}
String task_id = stInTask.create(task_form);
//分配明细表更新任务相关数据
IOStorInvDis dis = new IOStorInvDis();