应急件库位管理开发

tags/yfai-pcn-ext-v2.3
jun 7 months ago
parent 0fe1ca2ebf
commit 176fb4505f

@ -0,0 +1,17 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesEmergencyLocation;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/17 16:22
* @Modify:
**/
public interface IMesEmergencyLocationLogService {
@ApiOperation("新增应急件库位管理记录")
void insertMesEmergencyLocationLog(MesEmergencyLocation location);
}

@ -0,0 +1,23 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesEmergencyLocationModel;
import cn.estsh.i3plus.pojo.mes.bean.MesEmergencyLocation;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/17 16:22
* @Modify:
**/
public interface IMesEmergencyLocationService {
@ApiOperation("查询应急件库位管理")
List<MesEmergencyLocation> findMesEmergencyLocationList(String organizeCode, String workCenterCode);
@ApiOperation("操作")
void doAction(MesEmergencyLocationModel mesEmergencyLocationModel);
}

@ -0,0 +1,61 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEmergencyLocationService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesEmergencyLocationModel;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/17 16:16
* @Modify:
**/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/emergencyLocation")
public class MesEmergencyLocationController {
@Autowired
private IMesEmergencyLocationService mesEmergencyLocationService;
@GetMapping("/query")
@ApiOperation(value = "查询绑定信息")
public ResultBean findMesRecyclablePackageBindingDetail(String organizeCode, String workCenterCode) {
try {
ValidatorBean.checkNotNull(workCenterCode, "产线代码不能为空");
ValidatorBean.checkNotNull(organizeCode, "工厂代码不能为空");
return ResultBean.success("查询成功").setResultList(mesEmergencyLocationService.findMesEmergencyLocationList(organizeCode, workCenterCode));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/doAction")
@ApiOperation(value = "操作")
public ResultBean doAction(@RequestBody MesEmergencyLocationModel model) {
try {
ValidatorBean.checkNotNull(model.getWorkCenterCode(), "产线代码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getType(), "操作类型不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
mesEmergencyLocationService.doAction(model);
return ResultBean.success("操作成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,38 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEmergencyLocationLogService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.MesEmergencyLocation;
import cn.estsh.i3plus.pojo.mes.bean.MesEmergencyLocationLog;
import cn.estsh.i3plus.pojo.mes.repository.MesEmergencyLocationLogRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/17 16:23
* @Modify:
**/
@Slf4j
@Service
public class MesEmergencyLocationLogServiceImpl implements IMesEmergencyLocationLogService {
@Autowired
private MesEmergencyLocationLogRepository mesEmergencyLocationLogRepository;
@Override
public void insertMesEmergencyLocationLog(MesEmergencyLocation location) {
MesEmergencyLocationLog log = new MesEmergencyLocationLog();
BeanUtils.copyProperties(location,log, MesPcnExtConstWords.BASE_BEAN_FIELDS);
log.setFid(UUID.randomUUID().toString());
ConvertBean.serviceModelInitialize(log,location.getModifyUser());
mesEmergencyLocationLogRepository.insert(log);
}
}

@ -0,0 +1,233 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEmergencyLocationLogService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEmergencyLocationService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.StringUtilExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesEmergencyLocationModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEmergencyLocation;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.repository.MesEmergencyLocationRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/17 16:23
* @Modify:
**/
@Slf4j
@Service
public class MesEmergencyLocationServiceImpl implements IMesEmergencyLocationService {
@Autowired
private MesEmergencyLocationRepository mesEmergencyLocationRepository;
@Autowired
private IMesEmergencyLocationLogService mesEmergencyLocationLogService;
@Autowired
private IMesWorkOrderExtService mesWorkOrderExtService;
@Override
public List<MesEmergencyLocation> findMesEmergencyLocationList(String organizeCode, String workCenterCode) {
if (StringUtil.isEmptyAndNull(organizeCode) || StringUtil.isEmptyAndNull(workCenterCode)) {
return null;
}
return findMesEmergencyLocationList(organizeCode, CommonEnumUtil.VALID, workCenterCode);
}
@Override
public void doAction(MesEmergencyLocationModel model) {
switch (model.getType()) {
//入库
case 10: doStockInOnline(model);break;
//出库
case 20: doStockOutOnline(model);break;
//GP12
case 30: doGpInspectionOnline(model);break;
//设置
case 40: doEmergencySinkLocationSettingOnline(model);break;
default: MesPcnException.throwMesBusiException("扫描类型【%s】不存在", model.getType());break;
}
}
private List<MesEmergencyLocation> findMesEmergencyLocationList(String organizeCode, Integer status, String workCenterCode) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getNumEqualPack(status, MesPcnExtConstWords.STATUS, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.LOCATION_NUMBER}, packBean);
return mesEmergencyLocationRepository.findByHqlWhere(packBean);
}
private void doStockInOnline(MesEmergencyLocationModel model) {
ValidatorBean.checkNotNull(model.getLocation(), "库位不能为空");
ValidatorBean.checkNotNull(model.getWorkOrderNo(), "加工单号不能为空");
//校验库位信息
MesEmergencyLocation location = getMesEmergencyLocation(model.getOrganizeCode(), model.getWorkCenterCode(), model.getLocation(), null);
checkLocation(model, location);
//校验加工单
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), model.getWorkOrderNo());
checkWorkOrderNo(model, workOrder);
//数据绑定
location.setWorkOrderNo(workOrder.getWorkOrderNo());
location.setOfflineDate(workOrder.getOfflineTime());
location.setCustPartNo(workOrder.getCustPartNo());
location.setPartName(workOrder.getPartName());
location.setInDate(TimeTool.getNowTime(true));
location.setVehicleNo(workOrder.getCarModelCode());
location.setStockType(MesExtEnumUtil.EMERGENCY_LOCATION_STOCK_TYPE.EMERGENCY_LOCATION_STOCK_TYPE_10.getValue());
location.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(location, model.getUserName());
//记录日志
mesEmergencyLocationLogService.insertMesEmergencyLocationLog(location);
mesEmergencyLocationRepository.update(location);
}
private void doStockOutOnline(MesEmergencyLocationModel model) {
ValidatorBean.checkNotNull(model.getWorkOrderNo(), "加工单号不能为空");
//校验加工单信息
MesEmergencyLocation locationWorkOrder = getMesEmergencyLocation(model);
locationWorkOrder.setOutDate(TimeTool.getNowTime(true));
locationWorkOrder.setStockType(MesExtEnumUtil.EMERGENCY_LOCATION_STOCK_TYPE.EMERGENCY_LOCATION_STOCK_TYPE_20.getValue());
ConvertBean.serviceModelUpdate(locationWorkOrder, model.getUserName());
//记录日志
mesEmergencyLocationLogService.insertMesEmergencyLocationLog(locationWorkOrder);
//数据解绑
locationWorkOrder.setWorkOrderNo(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setOfflineDate(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setCustPartNo(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setPartName(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setInDate(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setVehicleNo(MesPcnExtConstWords.EMPTY);
locationWorkOrder.setSystemSyncStatus(CommonEnumUtil.FALSE);
mesEmergencyLocationRepository.update(locationWorkOrder);
}
private void doGpInspectionOnline(MesEmergencyLocationModel model) {
ValidatorBean.checkNotNull(model.getWorkOrderNo(), "加工单号不能为空");
//校验加工单信息
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), model.getWorkOrderNo());
if (Objects.isNull(workOrder)) {
MesPcnException.throwMesBusiException("加工单【%s】信息不存在", model.getWorkOrderNo());
}
MesEmergencyLocation locationWorkOrder = getMesEmergencyLocation(model);
if (MesExtEnumUtil.EMERGENCY_LOCATION_STOCK_TYPE.EMERGENCY_LOCATION_STOCK_TYPE_30.getValue() == locationWorkOrder.getStockType()) {
locationWorkOrder.setStockType(MesExtEnumUtil.EMERGENCY_LOCATION_STOCK_TYPE.EMERGENCY_LOCATION_STOCK_TYPE_40.getValue());
} else {
locationWorkOrder.setStockType(MesExtEnumUtil.EMERGENCY_LOCATION_STOCK_TYPE.EMERGENCY_LOCATION_STOCK_TYPE_30.getValue());
}
ConvertBean.serviceModelUpdate(locationWorkOrder, model.getUserName());
//记录日志
mesEmergencyLocationLogService.insertMesEmergencyLocationLog(locationWorkOrder);
//应急件库位管理更新
mesEmergencyLocationRepository.update(locationWorkOrder);
}
private void doEmergencySinkLocationSettingOnline(MesEmergencyLocationModel model) {
ValidatorBean.checkNotNull(model.getLocationNumber(), "库位数不能为空");
ValidatorBean.checkNotNull(model.getRemindDay(), "提醒天数不能为空");
List<MesEmergencyLocation> locationList = findMesEmergencyLocationList(model.getOrganizeCode(), null, model.getWorkCenterCode());
int lastNumber = 0;
if (!CollectionUtils.isEmpty(locationList)) {
lastNumber = locationList.get(locationList.size() - MesPcnExtConstWords.ONE).getLocationNumber();
if (locationList.size() > model.getLocationNumber()) {
//禁用多于库位
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.VALID, MesPcnExtConstWords.STATUS, packBean);
DdlPreparedPack.getNumberBiggerPack(model.getLocationNumber(), MesPcnExtConstWords.LOCATION_NUMBER, packBean);
mesEmergencyLocationRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.STATUS},
new Object[]{model.getUserName(), TimeTool.getNowTime(true), CommonEnumUtil.FALSE}, packBean);
//解除小于库位
packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.FALSE, MesPcnExtConstWords.STATUS, packBean);
DdlPreparedPack.getNumberSmallerEqualPack(model.getLocationNumber(), MesPcnExtConstWords.LOCATION_NUMBER, packBean);
mesEmergencyLocationRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.STATUS},
new Object[]{model.getUserName(), TimeTool.getNowTime(true), CommonEnumUtil.VALID}, packBean);
}
}
//新增加
while (model.getLocationNumber() > lastNumber) {
MesEmergencyLocation location = new MesEmergencyLocation();
location.setOrganizeCode(model.getOrganizeCode());
location.setWorkCenterCode(model.getWorkCenterCode());
location.setStatus(CommonEnumUtil.VALID);
location.setLocationNumber(lastNumber++);
location.setLocation(model.getWorkCenterCode() + "kw" + StringUtilExt.stringFormat(String.valueOf(lastNumber), 4, true, "0"));
ConvertBean.serviceModelInitialize(location, model.getUserName());
mesEmergencyLocationRepository.insert(location);
}
}
private MesEmergencyLocation getMesEmergencyLocation(MesEmergencyLocationModel model) {
MesEmergencyLocation locationWorkOrder = getMesEmergencyLocation(model.getOrganizeCode(), null, null, model.getWorkOrderNo());
if (Objects.isNull(locationWorkOrder)) {
MesPcnException.throwMesBusiException("加工单【%s】应急件库位管理信息不存在", model.getWorkOrderNo());
}
if (!model.getWorkCenterCode().equals(locationWorkOrder.getWorkCenterCode())) {
MesPcnException.throwMesBusiException("加工单【%s】所在产线【%s】与当前产线【%s】不匹配", model.getWorkOrderNo(), locationWorkOrder.getWorkCenterCode(), model.getWorkCenterCode());
}
return locationWorkOrder;
}
private void checkLocation(MesEmergencyLocationModel model, MesEmergencyLocation location) {
//校验库位是否存在
if (Objects.isNull(location)) {
MesPcnException.throwMesBusiException("产线【%s】库位【%s】信息不存在", model.getWorkCenterCode(), model.getLocation());
}
if (!StringUtil.isEmpty(location.getWorkOrderNo())) {
MesPcnException.throwMesBusiException("产线【%s】库位【%s】已存在加工单【%s】", model.getWorkCenterCode(), model.getLocation(), location.getWorkOrderNo());
}
}
private void checkWorkOrderNo(MesEmergencyLocationModel model, MesWorkOrder workOrder) {
//校验工单
if (Objects.isNull(workOrder)) {
MesPcnException.throwMesBusiException("加工单【%s】信息不存在", model.getWorkOrderNo());
}
//已完成状态才能入库
if (Objects.isNull(workOrder.getWorkOrderStatus()) || MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue() != workOrder.getWorkOrderStatus()) {
MesPcnException.throwMesBusiException("加工单【%s】状态为【%s】不为【已完成】", model.getWorkOrderNo(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()));
}
if (!model.getWorkCenterCode().equals(workOrder.getWorkCenterCode())) {
MesPcnException.throwMesBusiException("加工单【%s】所在产线【%s】与当前产线【%s】不匹配", model.getWorkOrderNo(), workOrder.getWorkCenterCode(), model.getWorkCenterCode());
}
//校验是否已经入库
MesEmergencyLocation locationWorkOrder = getMesEmergencyLocation(model.getOrganizeCode(), null, null, model.getWorkOrderNo());
if (!Objects.isNull(locationWorkOrder)) {
MesPcnException.throwMesBusiException("加工单号已经入库,产线【%s】库位【%s】", locationWorkOrder.getWorkCenterCode(), locationWorkOrder.getLocation());
}
}
public MesEmergencyLocation getMesEmergencyLocation(String organizeCode, String workCenterCode, String location, String workOrderNo) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(location, MesPcnExtConstWords.LOCATION, packBean);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.VALID, MesPcnExtConstWords.STATUS, packBean);
return mesEmergencyLocationRepository.getByProperty(packBean);
}
}

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesStationService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
@ -38,6 +39,9 @@ public class MesProcessMethodStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
@ -53,11 +57,14 @@ public class MesProcessMethodStepService extends BaseStepService {
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//删除就绪信号
productionDispatchContextStepService.removeReadySignalContext(reqBean);
//根据设备代码获取点位信息
MesStation station = mesStationService.getMesStationByEquipmentCode(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode());
if (Objects.isNull(station) || Objects.isNull(station.getProcessMethod())){
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]站点信息未维护", cellEquipContext.getEquipmentCode()));
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(),stepResult, String.format("设备[%s]站点信息未维护", cellEquipContext.getEquipmentCode()));
}
return ((IStepService) SpringContextsUtil.getBean(MesExtEnumUtil.STATION_PROCESS_METHOD.valueOfStrategyClass(station.getProcessMethod()))).executeInState(reqBean);

@ -0,0 +1,31 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@Data
public class MesEmergencyLocationModel {
@ApiParam(name = "工厂代码")
private String organizeCode;
@ApiParam(name = "产线代码")
private String workCenterCode;
@ApiParam(name = "库位")
private String location;
@ApiParam(name = "加工单号")
private String workOrderNo;
@ApiParam(name = "库位数")
private Integer locationNumber;
@ApiParam(name = "提醒天数")
private Integer remindDay;
@ApiParam("操作类型")
private Integer type;
@ApiParam("操作人")
private String userName;
}

@ -225,6 +225,10 @@ public class MesPcnExtConstWords {
public static final String ONLINE_TIME = "onlineTime";
//下线时间
public static final String OFFLINE_TIME = "offlineTime";
//库位
public static final String LOCATION = "location";
//库位序号
public static final String LOCATION_NUMBER = "locationNumber";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
public static final String[] BASE_BEAN_FIELDS = {ID, IS_DELETED, IS_VALID, CREATE_DATE_TIME, CREATE_USER, MODIFY_DATE_TIME, MODIFY_USER, DESCRIPTION, REMARK, SYSTEM_SYNC_DATE_TIME, SYSTEM_SYNC_STATUS};

Loading…
Cancel
Save