rev: 分拣工单、分拣木托盘搬运校验根据计算好的数量

This commit is contained in:
2023-10-23 18:30:38 +08:00
parent ff1c809fd8
commit 22deece58f
23 changed files with 530 additions and 69 deletions

View File

@@ -302,31 +302,20 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
// todo: 特殊处理
protected int specialHandling(String regionCode, JSONObject param) {
int torus = 0; // 无业务0 分拣剩余1托1分拣剩余0托2
int torus = 0; // 无业务0分拣剩余0托1
if (regionCode.equals("FJ")) { // 判断是否够码满
// 分拣需要在这设置特殊值
// 校验是否够码满一托
JSONArray array = param.getJSONArray("list");
List<ApplyDeviceDto> list = JSONArray.parseArray(array.toJSONString(), ApplyDeviceDto.class);
PdmBdWorkorder workorder = workorderService.getDeviceDockingProductionTask(param.getString("device_code"));
// 1 获取点位相应数量
int sum = 0;
for (ApplyDeviceDto applyDeviceDto : list) {
sum += Integer.parseInt(applyDeviceDto.getQty());
}
// 2 获取库存量 surplusNumber
int surplusNumber = fjMapper.getInventoryQuantity(workorder.getMaterial_id());
// 3 现有总数 total
int total = sum + surplusNumber;
// 4 获取木托盘需要多少块 needFullNumber
String needFullNumberStr = fjMapper.getNeedFullNumber(workorder.getMaterial_id());
int needFullNumber = TaskUtils.convertMultiply(needFullNumberStr);
int surplus = total / needFullNumber;
if (surplus == 1) {
torus = 1;
} else if (surplus == 0) {
torus = 2;
}
boolean enoughCallEmpty = workorderService.isEnoughCallEmpty(param.getString("device_code"));
// PdmBdWorkorder workorder = workorderService.getDeviceDockingProductionTask(param.getString("device_code"));
// BigDecimal realQty = workorder.getReal_qty();
// BigDecimal planQty = workorder.getPlan_qty();
// if (realQty.compareTo(planQty) < 0) { // 还可以叫空盘
// torus = 0;
// } else {
// torus = 1;
// }
return enoughCallEmpty ? 0 : 1;
}
return torus;
}
@@ -596,7 +585,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getGroupInfo(baseRequest.getVehicle_code(),
baseRequest.getVehicle_type(), GroupBindMaterialStatusEnum.BOUND.getValue());
if (ObjectUtil.isEmpty(one)) {
throw new BadRequestException("载具编码为"+baseRequest.getVehicle_code()+"组盘不存在!");
throw new BadRequestException("载具编码为" + baseRequest.getVehicle_code() + "组盘不存在!");
}
String yjDeviceCode = basePoint.getParent_point_code(); // 压机设备编码
SchBasePoint devicePoint = pointService.getById(yjDeviceCode);
@@ -627,7 +616,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
vehiclematerialgroupService.updateById(one);
// 记录泥料
MesMudConsumptionDto mesMudConsumptionDto = new MesMudConsumptionDto();
mesMudConsumptionDto.setMSGID(IdUtil.getSnowflake(1,1).nextIdStr());
mesMudConsumptionDto.setMSGID(IdUtil.getSnowflake(1, 1).nextIdStr());
mesMudConsumptionDto.setPWORKSCHE_ID(productionTask.getWorkorder_code());
mesMudConsumptionDto.setOUT_FINNUM(one.getMaterial_weight());
mesMudConsumptionDto.setPRESSUNIT(devicePoint.getExt_point_code());

View File

@@ -1,8 +1,7 @@
package org.nl.wms.ext.mes.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.nl.wms.database.brick.service.dao.MdBaseBrickInfo;
import org.nl.wms.ext.acs.service.dto.BrickInfoDto;
import org.nl.wms.ext.mes.autotask.AutoSaveWaitGdyInfo;
import org.nl.wms.ext.mes.service.dto.*;
import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder;
@@ -92,4 +91,17 @@ public interface WmsToMesService {
* @param shelfInfo
*/
void saveShelfInfoBatchToMes(MesShelfInfo shelfInfo);
/**
* 根据成品物料编码获取订单号
* @param materialId
* @return
*/
IPage<MesOrderInfo> selectPageMesOrder(IPage<MesOrderInfo> pages, String materialId);
/**
* 获取所有客户信息
* @return
*/
List<CusterVo> getCusterInfo();
}

View File

@@ -2,6 +2,7 @@ package org.nl.wms.ext.mes.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.database.material.service.dao.MdBaseMaterial;
import org.nl.wms.ext.mes.autotask.AutoSaveWaitGdyInfo;
@@ -59,4 +60,8 @@ public interface MesRequestMapper {
List<MesShelfInfo> getAllShelfInfos();
@DS("oracle")
void saveShelfInfoBatchToMes(MesShelfInfo shelfInfo);
@DS("oracle")
IPage<MesOrderInfo> findOrderInfoByMaterialId(IPage<MesOrderInfo> pages, String materialId);
@DS("oracle")
List<CusterVo> getCusterInfo();
}

View File

@@ -281,4 +281,14 @@
LEFT JOIN sch_base_point p2 ON p2.point_code = vg.source_vehicle_code
WHERE p1.region_code = 'GTPHC'
</select>
<select id="findOrderInfoByMaterialId" resultType="org.nl.wms.ext.mes.service.dto.MesOrderInfo">
SELECT * FROM "RTMG"."VIEW_POP_ORDER_RESULT_LMS" vp
WHERE 1 = 1
<if test="materialId != null and materialId != ''">
AND vp.FMATERIAL_ID = #{materialId}
</if>
</select>
<select id="getCusterInfo" resultType="org.nl.wms.ext.mes.service.dto.CusterVo">
SELECT * FROM "RTMG"."VIEW_CUSTER_LMS"
</select>
</mapper>

View File

@@ -0,0 +1,14 @@
package org.nl.wms.ext.mes.service.dto;
import lombok.Data;
/**
* @Author: lyd
* @Description: 客户信息
* @Date: 2023/10/23
*/
@Data
public class CusterVo {
private String CUSTER_NO;
private String CUSTER_NAME;
}

View File

@@ -0,0 +1,27 @@
package org.nl.wms.ext.mes.service.dto;
import lombok.Data;
/**
* @Author: lyd
* @Description: mes的订单信息DTO
* @Date: 2023/10/23
*/
@Data
public class MesOrderInfo {
/**
* 订单号
*/
private String FORDER_NO;
private String FPLANSTART_DATE;
private String FPLANFINISH_DATE;
private String FMATERIAL_ID;
private String FMATERIAL_NAME;
private String FMATSPEC;
private String FMATMODEL;
private String FSALE_NO;
private int FORDER_SUBNUM;
private String BC;
private String BZ;
private int GUADANSUM;
}

View File

@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.database.brick.service.dao.MdBaseBrickInfo;
@@ -407,6 +408,16 @@ public class WmsToMesServiceImpl implements WmsToMesService {
mesRequestMapper.saveShelfInfoBatchToMes(shelfInfo);
}
@Override
public IPage<MesOrderInfo> selectPageMesOrder(IPage<MesOrderInfo> pages, String materialId) {
return mesRequestMapper.findOrderInfoByMaterialId(pages, materialId);
}
@Override
public List<CusterVo> getCusterInfo() {
return mesRequestMapper.getCusterInfo();
}
/**
* 转换
*

View File

@@ -44,6 +44,18 @@ public class PdmBdWorkorderController {
public ResponseEntity<Object> query(PdmBdWorkorderQuery query, PageQuery page){
return new ResponseEntity<>(TableDataInfo.build(pdmBdWorkorderService.queryAll(query,page)),HttpStatus.OK);
}
@GetMapping("/mesOrder")
@Log("查询订单管理")
@ApiOperation("查询订单管理")
public ResponseEntity<Object> queryMesOrder(PdmBdWorkorderQuery query, PageQuery page){
return new ResponseEntity<>(TableDataInfo.build(pdmBdWorkorderService.queryMesOrder(query,page)),HttpStatus.OK);
}
@PostMapping("/getCuster")
@Log("获取客户信息")
@ApiOperation("获取客户信息")
public ResponseEntity<Object> getCuster(){
return new ResponseEntity<>(wmsToMesService.getCusterInfo(), HttpStatus.OK);
}
@GetMapping("/materials")
@Log("查询物料基础信息")

View File

@@ -3,6 +3,7 @@ package org.nl.wms.pdm.workorder.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.ext.mes.service.dto.MesOrderInfo;
import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder;
import org.nl.wms.pdm.workorder.service.dto.PdmBdWorkorderQuery;
@@ -63,4 +64,19 @@ public interface IPdmBdWorkorderService extends IService<PdmBdWorkorder> {
* @return
*/
PdmBdWorkorder getDeviceDockingProductionTask(String deviceCode);
/**
* 获取mes订单信息
* @param query
* @param page
* @return
*/
IPage<MesOrderInfo> queryMesOrder(PdmBdWorkorderQuery query, PageQuery page);
/**
* 根据对接位获取是否可以叫空盘
* @param deviceCode
* @return
*/
boolean isEnoughCallEmpty(String deviceCode);
}

View File

@@ -146,4 +146,15 @@ public class PdmBdWorkorder implements Serializable {
@TableField(exist = false)
private String half_material_code;
@TableField(exist = false)
private String order_no;
@TableField(exist = false)
private String custer_no;
@TableField(exist = false)
private int order_subnum;
@TableField(exist = false)
private int guadansum;
@TableField(exist = false)
private String pack_method;
}

View File

@@ -16,5 +16,6 @@ public class PdmBdWorkorderQuery implements Serializable {
private String begin_time;
private String end_time;
private List<String> more_order_status;
private String materialId;
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -16,13 +17,15 @@ import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.ext.acs.service.dto.ResultForAcs;
import org.nl.wms.ext.acs.service.dto.to.wms.AcsResponse;
import org.nl.wms.ext.mes.service.WmsToMesService;
import org.nl.wms.ext.mes.service.dto.MesOrderInfo;
import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService;
import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder;
import org.nl.wms.pdm.workorder.service.dao.mapper.PdmBdWorkorderMapper;
import org.nl.wms.pdm.workorder.service.dao.vo.AcsWorkOrderVo;
import org.nl.wms.pdm.workorder.service.dto.PdmBdWorkorderQuery;
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task_manage.GeneralDefinition;
@@ -32,16 +35,16 @@ import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* @description 服务实现
* @author lyd
* @date 2023-05-05
**/
* @author lyd
* @description 服务实现
* @date 2023-05-05
**/
@Slf4j
@Service
public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper, PdmBdWorkorder> implements IPdmBdWorkorderService {
@@ -55,9 +58,13 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
private ISysNoticeService noticeService;
@Autowired
private ISchBasePointService pointService;
@Autowired
private WmsToMesService wmsToMesService;
@Autowired
private ISchBaseVehiclematerialgroupService vehiclematerialgroupService;
@Override
public IPage<PdmBdWorkorder> queryAll(PdmBdWorkorderQuery query, PageQuery page){
public IPage<PdmBdWorkorder> queryAll(PdmBdWorkorderQuery query, PageQuery page) {
IPage<PdmBdWorkorder> pages = new Page<>(page.getPage() + 1, page.getSize());
pages = pdmBdWorkorderMapper.selectPageLeftJoin(pages, query);
return pages;
@@ -78,9 +85,37 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
entity.setUpdate_id(currentUserId);
entity.setUpdate_name(nickName);
entity.setUpdate_time(now);
// 如果是分拣,就特殊处理
if (entity.getRegion_code().equals("FJ")) {
toCalculatePlannedQuantity(entity);
}
pdmBdWorkorderMapper.insert(entity);
}
/**
* 分拣工单需要计算计划数量,并封装数据
*
* @param entity
*/
private void toCalculatePlannedQuantity(PdmBdWorkorder entity) {
int orderSubnum = entity.getOrder_subnum(); // 计划量
int guadansum = entity.getGuadansum(); // 已经包装数
int residueNum = orderSubnum - guadansum; // 剩余数
int multiply = TaskUtils.convertMultiply(entity.getPack_method());
// 计算需要多少木托
int ceil = (int) Math.ceil(residueNum / multiply);
// 获取此物料在库存中有多少
int inventoryQty = vehiclematerialgroupService.getInventoryQtyByMaterialId(entity.getMaterial_id());
// 查看库存能有多少托
int inventoryCeil = (int) Math.ceil(inventoryQty / multiply);
// 工单号和客户编码存放json
JSONObject res = new JSONObject();
res.put("order_no", entity.getOrder_no());
res.put("custer_no", entity.getCuster_no());
entity.setPlan_qty(ceil > inventoryCeil ? BigDecimal.valueOf(inventoryCeil) : BigDecimal.valueOf(ceil));
entity.setExt_data(res.toJSONString());
}
@Override
public void update(PdmBdWorkorder entity) {
PdmBdWorkorder dto = pdmBdWorkorderMapper.selectById(entity.getWorkorder_id());
@@ -154,7 +189,7 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
log.error("工单下发异常:" + e.getMessage());
// 通知
noticeService.createNotice("工单下发失败: " + e.getMessage(), "工单下发失败: "
+ pdmBdWorkorder.getWorkorder_code(), NoticeTypeEnum.EXCEPTION.getCode());
+ pdmBdWorkorder.getWorkorder_code(), NoticeTypeEnum.EXCEPTION.getCode());
throw new BadRequestException("工单下发失败");
}
if (resultForAcs.getCode() != HttpStatus.HTTP_OK) {
@@ -182,4 +217,20 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
.eq(PdmBdWorkorder::getWorkorder_status, WorkOrderStatusEnum.PRODUCING.getCode());
return pdmBdWorkorderMapper.selectOne(lam);
}
@Override
public IPage<MesOrderInfo> queryMesOrder(PdmBdWorkorderQuery query, PageQuery page) {
IPage<MesOrderInfo> pages = new Page<>(page.getPage() + 1, page.getSize());
pages = wmsToMesService.selectPageMesOrder(pages, query.getMaterialId());
return pages;
}
@Override
public boolean isEnoughCallEmpty(String deviceCode) {
PdmBdWorkorder workorder = this.getDeviceDockingProductionTask(deviceCode);
BigDecimal realQty = workorder.getReal_qty();
BigDecimal planQty = workorder.getPlan_qty();
// 还可以叫空盘
return realQty.compareTo(planQty) < 0;
}
}

View File

@@ -79,4 +79,11 @@ public interface ISchBaseVehiclematerialgroupService extends IService<SchBaseVeh
* @return
*/
SchBaseVehiclematerialgroup getGroupInfo(String vehicleCode, String value);
/**
* 返回当前物料的剩余库存数
* @param materialId
* @return
*/
int getInventoryQtyByMaterialId(String materialId);
}

View File

@@ -15,4 +15,6 @@ public interface SchBaseVehiclematerialgroupMapper extends BaseMapper<SchBaseVeh
IPage<SchBaseVehiclematerialgroup> selectPageLeftJoin(IPage<SchBaseVehiclematerialgroup> pages, SchBaseVehiclematerialgroupQuery query);
SchBaseVehiclematerialgroup getGroup(JSONObject entity);
int getInventoryQtyByMaterialId(String materialId);
}

View File

@@ -49,4 +49,20 @@
</if>
AND vg.group_bind_material_status = '2'
</select>
<select id="getInventoryQtyByMaterialId" resultType="java.lang.Integer">
SELECT
IF(SUM(vg.material_qty)>0,SUM(vg.material_qty),0) AS qty
FROM
`sch_base_point` p
LEFT JOIN sch_base_vehiclematerialgroup vg ON vg.vehicle_code = p.vehicle_code
AND vg.vehicle_type = p.vehicle_type
AND vg.group_bind_material_status = '2'
WHERE
p.region_code = 'GTPHC'
AND p.point_status = '3'
AND p.vehicle_code IS NOT NULL
AND p.vehicle_code != ''
AND vg.group_id IS NOT NULL
AND vg.material_id = #{materialId}
</select>
</mapper>

View File

@@ -129,4 +129,9 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl<SchBaseV
return selectOne;
}
@Override
public int getInventoryQtyByMaterialId(String materialId) {
return vehiclematerialgroupMapper.getInventoryQtyByMaterialId(materialId);
}
}

View File

@@ -37,6 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -362,6 +363,10 @@ public class FJMKTask extends AbstractTask {
}
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
String requestParam = taskObj.getRequest_param();
JSONObject jsonObject = JSONObject.parseObject(requestParam);
String workorderCode = jsonObject.getString("workorder_code");
PdmBdWorkorder workorder = workorderService.getByCode(workorderCode);
// 获取参数
String bzxPoint = taskObj.getPoint_code2(); // 获取终点1
String fmPoint = taskObj.getPoint_code3(); // 获取起点2
@@ -373,9 +378,15 @@ public class FJMKTask extends AbstractTask {
// 包装位: 解锁
PointUtils.setUpdateByType(bzxPointObj, taskFinishedType);
PointUtils.clearPoint(bzxPointObj);
// 覆膜位: 解锁 . 清空
PointUtils.setUpdateByType(fmPointObj, taskFinishedType);
PointUtils.clearPoint(fmPointObj);
if (ObjectUtil.isNotEmpty(fmPoint)) {
// 覆膜位: 解锁 . 清空
PointUtils.setUpdateByType(fmPointObj, taskFinishedType);
PointUtils.clearPoint(fmPointObj);
// 工单的真实数+1
workorder.setReal_qty(workorder.getReal_qty().add(BigDecimal.ONE));
TaskUtils.setWorkOrderUpdateByType(workorder, taskFinishedType);
workorderService.updateById(workorder);
}
// 分拣机械手: 清空
PointUtils.setUpdateByType(fjcPointObj, taskFinishedType);
PointUtils.clearPoint(fjcPointObj);

View File

@@ -36,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -128,6 +129,11 @@ public class FJQKTask extends AbstractTask {
// 找起点
String requestParam = task.getRequest_param();
JSONObject extGroupData = JSONObject.parseObject(requestParam);
// 判断工单是否够
boolean enoughCallEmpty = workorderService.isEnoughCallEmpty(task.getPoint_code2());
if (!enoughCallEmpty) {
throw new BadRequestException("数量不足,不呼叫空盘");
}
SchBasePoint point = findStartPoint(startRegionStr, extGroupData);
if (ObjectUtil.isEmpty(point)) {
// 消息通知
@@ -229,6 +235,10 @@ public class FJQKTask extends AbstractTask {
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 载具编码:前面需要根据任务判断,没有载具不能生成任务
String requestParam = taskObj.getRequest_param();
JSONObject jsonObject = JSONObject.parseObject(requestParam);
String workorderCode = jsonObject.getString("workorder_code");
PdmBdWorkorder workorder = workorderService.getByCode(workorderCode);
String vehicleCode = taskObj.getVehicle_code();
String vehicleType = taskObj.getVehicle_type();
String startPoint = taskObj.getPoint_code1(); // 获取终点
@@ -237,7 +247,6 @@ public class FJQKTask extends AbstractTask {
SchBasePoint endPointObj = pointService.getById(endPoint);
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.clearPoint(startPointObj);
// 终点设置值
// 记录库存并解锁
endPointObj.setIng_task_code("");
@@ -247,6 +256,10 @@ public class FJQKTask extends AbstractTask {
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
// 工单的真实数+1
workorder.setReal_qty(workorder.getReal_qty().add(BigDecimal.ONE));
TaskUtils.setWorkOrderUpdateByType(workorder, taskFinishedType);
workorderService.updateById(workorder);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());

View File

@@ -152,4 +152,4 @@ sa-token:
lucene:
index:
path: C:\lucene\index
path: D:\lucene\index