Merge remote-tracking branch 'origin/dev' into dev

tags/yfai-pcn-ext-v1.0
administrator 1 year ago
commit 67f554dcaa

@ -0,0 +1,38 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description : MES
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/7 14:34
* @Modify:
**/
public interface IMesBoxingErrorProofingService {
@ApiOperation(value = "查询包装明细")
ListPager<MesPackageDetail> queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager);
@ApiOperation(value = "扫描")
MesPackage doScan(MesPackageDetail mesPackageDetail);
@ApiOperation(value = "保存包装明细")
void saveMesPackageDetails(List<MesPackageDetail> mesPackage, String userName);
@ApiOperation(value = "更新包装表")
void updateMesPackage(MesPackage mesPackage);
@ApiOperation(value = "更新包装明细")
void updateMesPackageDetails(MesPackageDetail mesPackage);
@ApiOperation(value = "解锁")
void unLock(String organizeCode, String userName, String pwd);
}

@ -0,0 +1,18 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesEnumDetail;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/9 19:18
* @Modify:
**/
public interface IMesEnumDetailService{
List<MesEnumDetail> findMesEnumDetail(MesEnumDetail mesEnumDetail);
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.annotations.ApiOperation;
import java.util.List;
@ -10,4 +11,7 @@ public interface IMesProduceSnExtService {
@ApiOperation(value = "根据零件条码查询零件条码信息")
List<MesProduceSn> getProduceSnList(String organizeCode, List<String> productSnList);
@ApiOperation(value = "根据零件条码ID修改条码状态,工位")
void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList);
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -67,6 +68,18 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文发送允许加工指令执行结果")
void deleteSendProcessCmdContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文产出零件号")
List<MesEquipVariableCollectContext> getProductionPartNoContext(StationRequestBean reqBean);
@ApiOperation(value = "验证上下文产出零件号是否存在")
Boolean checkProductionPartNoIsExistContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文产出零件号", notes = "[JSON]List<MesEquipVariableCollectContext>")
Boolean saveProductionPartNoContext(StationRequestBean reqBean, List<MesEquipVariableCollectContext> productionPartNoList);
@ApiOperation(value = "删除上下文产出零件号")
void deleteProductionPartNoContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文头道模具号")
MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean);
@ -112,6 +125,18 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文模具号")
void deleteMouldNoContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文生产扫/读信息:加工单")
List<MesEquipVariableCollectContext> getScanWorkOrderNoContext(StationRequestBean reqBean);
@ApiOperation(value = "验证上下文扫/读信息:加工单是否存在")
Boolean checkScanWorkOrderNoIsExistContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文扫/读信息:加工单", notes = "[JSON]List<MesEquipVariableCollectContext>")
Boolean saveScanWorkOrderNoContext(StationRequestBean reqBean, List<MesEquipVariableCollectContext> productSnList);
@ApiOperation(value = "删除上下文扫/读信息:加工单")
void deleteScanWorkOrderNoContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文生产扫/读信息:主条码")
List<MesEquipVariableCollectContext> getScanProductSnContext(StationRequestBean reqBean);
@ -172,17 +197,20 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文产品加工规则信息集合")
void deleteProdRuleDataContext(StationRequestBean reqBean);
@ApiOperation(value = "获取生产线的当前班组班次信息")
MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "获取上下文班次班组信息")
List<StationKvBean> getProdShiftDataContext(StationRequestBean reqBean, String workCenterCode);
List<StationKvBean> getProdShiftDataContext(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "验证上下文班次班组信息是否存在")
Boolean checkProdShiftDataIsExistContext(StationRequestBean reqBean, String workCenterCode);
Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "保存上下文班次班组信息", notes = "[JSON]List<StationKvBean>")
Boolean saveProdShiftDataContext(StationRequestBean reqBean, String workCenterCode, List<StationKvBean> prodShiftDatList);
Boolean saveProdShiftDataContext(String orgainzeCode, String workCenterCode, List<StationKvBean> prodShiftDatList);
@ApiOperation(value = "删除上下文班次班组信息")
void deleteProdShiftDataContext(StationRequestBean reqBean, String workCenterCode);
void deleteProdShiftDataContext(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "获取上下文工位加工数统计信息")
List<StationKvBean> getProductionStatisticsContext(StationRequestBean reqBean);
@ -190,9 +218,30 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "保存上下文工位加工数统计信息", notes = "[JSON]List<StationKvBean>")
Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List<StationKvBean> prodShiftDatList);
@ApiOperation(value = "新增上下文工位加工数统计信息")
Boolean addProductionStatisticsContext(StationRequestBean reqBean, int count);
@ApiOperation(value = "删除上下文工位加工数统计信息")
void deleteProductionStatisticsContext(StationRequestBean reqBean);
@ApiOperation(value = "获取手动选择的腔数及工单信息上下文")
List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean);
@ApiOperation(value = "保存手动选择的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]")
Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList);
@ApiOperation(value = "删除手动选择的腔数及工单信息上下文")
void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean);
@ApiOperation(value = "获取料桶原材料数据集合")
List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean);
@ApiOperation(value = "保存料桶原材料数据集合", notes = "[JSON]List<MesRawPartCharging>")
Boolean saveMesRawPartChargingDataContext(StationRequestBean reqBean, List<MesRawPartCharging> mesRawPartChargingList);
@ApiOperation(value = "删除料桶原材料数据集合")
void deleteMesRawPartChargingDataContext(StationRequestBean reqBean);
@ -220,4 +269,5 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文产出条码数据信息集合")
void deleteOutProduceSnDataContext(StationRequestBean reqBean);
}

@ -21,6 +21,9 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】")
Boolean saveProductionProcessContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "删除生产过程上下文对象")
void deleteProductionProcessContext(StationRequestBean reqBean);
@ApiOperation(value = "获取生产过程上下文对象")
MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean);

@ -0,0 +1,17 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public interface IMesWorkOrderExtService {
@ApiOperation(value = "根据生产工单号集合 查询生产工单数据")
List<MesWorkOrder> getWorkOrderList(String organizeCode, List<String> workOrderNoList);
@ApiOperation(value = "根据生产工单号集合 查询生产工单数据")
Map<String, MesWorkOrder> getWorkOrderMap(String organizeCode, List<String> workOrderNoList);
}

@ -0,0 +1,145 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesBoxingErrorProofingService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
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.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Api(tags = "装箱防错")
@RequestMapping(MesCommonConstant.MES_YANFEN + "/boxing-error-proofing")
@Slf4j
public class MesBoxingErrorProofingController {
@Autowired
private IMesBoxingErrorProofingService mesBoxingErrorProofingService;
@GetMapping("/mes-package-details/query")
@ApiOperation(value = "查询包装明细")
public ResultBean queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager) {
try {
ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空");
mesPackage.setOrganizeCode(AuthUtil.getOrganizeCode());
ListPager<MesPackageDetail> partInspectionListPager = mesBoxingErrorProofingService.queryMesPackageDetailByPager(mesPackage, pager);
return ResultBean.success("查询成功").setListPager(partInspectionListPager);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/do-scan")
@ApiOperation(value = "扫描")
public ResultBean doScan(MesPackageDetail mesPackageDetail) {
try {
ValidatorBean.checkNotNull(mesPackageDetail.getPackageNo(), "箱条码不能为空");
mesPackageDetail.setOrganizeCode(AuthUtil.getOrganizeCode());
ConvertBean.serviceModelInitialize(mesPackageDetail, AuthUtil.getSessionUser().getUserName());
MesPackage mesPackage = mesBoxingErrorProofingService.doScan(mesPackageDetail);
return ResultBean.success("扫描成功").setResultObject(mesPackage);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/mes-package-details/saveAll")
@ApiOperation(value = "保存包装明细")
public ResultBean saveMesPackageDetails(@RequestBody List<MesPackageDetail> mesPackageDetailList) {
try {
//属性校验
mesPackageDetailList.forEach(mesPackageDetail -> {
ValidatorBean.checkNotNull(mesPackageDetail.getPackageNo(), "箱条码不能为空");
});
String userName = AuthUtil.getSessionUser().getUserName();
mesBoxingErrorProofingService.saveMesPackageDetails(mesPackageDetailList, userName);
return ResultBean.success("保存成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PutMapping("/mes-package/update")
@ApiOperation(value = "更新包装表")
public ResultBean updateMesPackage(MesPackage mesPackage) {
try {
//属性校验
ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空");
ValidatorBean.checkNotNull(mesPackage.getIsSealed(), "是否封箱不能为空");
mesPackage.setOrganizeCode(AuthUtil.getOrganizeCode());
ConvertBean.serviceModelUpdate(mesPackage, AuthUtil.getSessionUser().getUserName());
mesBoxingErrorProofingService.updateMesPackage(mesPackage);
return ResultBean.success("保存成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PutMapping("/mes-package-details/update")
@ApiOperation(value = "更新包装明细")
public ResultBean updateMesPackageDetails(MesPackageDetail mesPackage) {
try {
//属性校验
ValidatorBean.checkNotNull(mesPackage.getPackageNo(), "箱条码不能为空");
ValidatorBean.checkNotNull(mesPackage.getSerialNumber(), "替换条码不能为空");
ValidatorBean.checkNotNull(mesPackage.getOldSerialNumber(), "替换源条码不能为空");
ConvertBean.serviceModelUpdate(mesPackage, AuthUtil.getSessionUser().getUserName());
mesBoxingErrorProofingService.updateMesPackageDetails(mesPackage);
return ResultBean.success("保存成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/unLock")
@ApiOperation(value = "解锁")
public ResultBean unLock(String pwd) {
try {
//属性校验
ValidatorBean.checkNotNull(pwd, "密码不能为空");
mesBoxingErrorProofingService.unLock(AuthUtil.getOrganizeCode(), AuthUtil.getSessionUser().getUserName(), pwd);
return ResultBean.success("解锁成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,47 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEnumDetailService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.bean.MesEnumDetail;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/9 19:27
* @Modify:
**/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesEnumDetail")
public class MesEnumDetailController {
@Autowired
private IMesEnumDetailService mesEnumDetailService;
@GetMapping("/find")
@ApiOperation(value = "查询包装明细")
public ResultBean findMesEnumDetail(MesEnumDetail mesEnumDetail) {
try {
ValidatorBean.checkNotNull(mesEnumDetail.getEnumCode(), "枚举代码不能为空");
mesEnumDetail.setOrganizeCode(AuthUtil.getOrganizeCode());
List<MesEnumDetail> mesEnumDetailList = mesEnumDetailService.findMesEnumDetail(mesEnumDetail);
return ResultBean.success("查询成功").setResultList(mesEnumDetailList);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -1,20 +1,29 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdShiftRecordService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdShiftRecord;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
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 com.google.common.base.Objects;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* @Description:
* @Author: gsz
@ -27,6 +36,8 @@ public class MesProdShiftRecordController {
@Autowired
private IMesProdShiftRecordService mesProdShiftRecordService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@GetMapping("/query-pager")
@ApiOperation(value = "查询开关班记录")
public ResultBean queryMesProdShiftRecordByPager(MesProdShiftRecord mesProdShiftRecord, Pager pager) {
@ -54,6 +65,11 @@ public class MesProdShiftRecordController {
mesProdShiftRecordService.insertMesProdShiftRecord(item, AuthUtil.getOrganizeCode());
List<StationKvBean> getProdShiftData = getProdShiftData(item);
mesProductionDispatchContextStepService.saveProdShiftDataContext(item.getOrganizeCode(), item.getWorkCenterCode(), getProdShiftData);
return ResultBean.success("保存开关班记录成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
@ -73,6 +89,11 @@ public class MesProdShiftRecordController {
ValidatorBean.checkNotNull(item.getShiftGroup(), "shiftGroup不能为空");
mesProdShiftRecordService.saveMesProdShiftRecord(item, AuthUtil.getOrganizeCode());
if (Objects.equal(MesExtEnumUtil.WORK_STATUS.END.getValue(), item.getWorkStatus())) {
mesProductionDispatchContextStepService.deleteProdShiftDataContext(item.getOrganizeCode(), item.getWorkCenterCode());
}
return ResultBean.success("保存开关班记录成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
@ -95,4 +116,12 @@ public class MesProdShiftRecordController {
return ResultBean.fail(e);
}
}
//封装展示组件班组班次内容
private List<StationKvBean> getProdShiftData(MesProdShiftRecord record) {
return StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(),
new StationKvBean("shiftGroup", "班组", record.getShiftGroup()),
new StationKvBean("shiftCode", "班次", record.getShiftCode()));
}
}

@ -39,7 +39,7 @@ public class MesWorkCenterController {
try {
return ResultBean.success("查询成功").setResultList(workCenterService.queryMesWorkCenterList(workCenter));
return ResultBean.success("查询DefectActionService成功").setResultList(workCenterService.queryMesWorkCenterList(workCenter));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {

@ -3,9 +3,11 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
@ -15,7 +17,10 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
@ -52,7 +57,6 @@ public class MesWorkOrderController {
public ResultBean queryWorkOrderByPager(MesWorkOrder workOrder, Pager pager) {
try {
return ResultBean.success("查询成功").setListPager(workOrderService.queryMesWorkOrderListByPager(workOrder, pager));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);

@ -0,0 +1,417 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesBoxingErrorProofingService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.CheckTool;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description : MES
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/7 14:33
* @Modify:
**/
@Service
@Slf4j
public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingService {
@Autowired
private MesPackageRepository mesPackageRDao;
@Autowired
private MesPartRepository partRDao;
@Autowired
private MesPackingDefineRepository mesPackingDefineRDao;
@Autowired
private MesPackingDefineDetailsRepository mesPackingDefineDetailsRDao;
@Autowired
private MesPackageDetailRepository mesPackageDetailRDao;
@Autowired
private IMesConfigService configService;
@Autowired
private MesPackageResultRepository mesPackageResultRDao;
@Override
public ListPager<MesPackageDetail> queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackage.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackage.getPackageNo(), "packageNo", packBean);
pager = PagerHelper.getPager(pager, mesPackageDetailRDao.findByHqlWhereCount(packBean));
List<MesPackageDetail> resultList = mesPackageDetailRDao.findByHqlWherePage(packBean, pager);
return new ListPager<>(resultList, pager);
}
@Override
public MesPackage doScan(MesPackageDetail mesPackageDetail) {
//扫描的是包装
if (mesPackageDetail.getIsScanPackageBoolean()) {
checkNotNull(mesPackageDetail);
MesPackage mesPackage = getMesPackage(mesPackageDetail.getOrganizeCode(), mesPackageDetail.getPackageNo());
if (Objects.nonNull(mesPackage)) {
return mesPackage;
}
//获取包装定义
MesPackingDefine packingDefine = getMesPackingDefine(mesPackageDetail);
//解析获取信息保存
if (StringUtils.isEmpty(packingDefine.getSplitChar())) {
MesPcnException.throwMesBusiException("箱类别代号【%s】分隔符不能为空", packingDefine.getPackCode());
}
String[] split = mesPackageDetail.getPackageNo().split("\\" + packingDefine.getSplitChar());
//获取序列号
checkSerial(packingDefine, split);
//工厂校验
checkOrganizeCode(mesPackageDetail, packingDefine, split);
//获取物料信息是否存在
MesPart mesPart = getMesPart(mesPackageDetail, packingDefine, split);
//获取数量信息是否存在
Double qty = getQty(packingDefine, split);
MesPackage packages = getMesPackage(mesPackageDetail, mesPart, qty, packingDefine);
return mesPackageRDao.insert(packages);
} else {
checkNotNull(mesPackageDetail);
//校验过程条码是否存在
if (StringUtils.isEmpty(mesPackageDetail.getSerialNumber())) {
MesPcnException.throwMesBusiException("过程条码不允许为空");
}
//校验包装条码信息
MesPackage mesPackage = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode());
//校验是否重复扫描
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), "serialNumber", ddlPackBean);
if (mesPackageDetailRDao.isExitByHql(ddlPackBean)) {
MesPcnException.throwMesBusiException("零件条码【%s】已存在该箱不允许重复扫描", mesPackageDetail.getSerialNumber());
}
//校验是否已关闭
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) {
MesPcnException.throwMesBusiException("箱条码已封箱,不允许扫描零件条码");
}
//获取包装定义明细
ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackage.getPackageSn(), "packCode", ddlPackBean);
List<MesPackingDefineDetails> defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(defineDetails)) {
MesPcnException.throwMesBusiException("箱类别代号【%s】包装定义明细未维护", mesPackage.getPackageSn());
}
//校验是否包含
String partNo = getPartNo(mesPackageDetail, mesPackage, defineDetails);
//物料信息
MesPart mesPart = getPart(mesPackageDetail.getOrganizeCode(), partNo);
//包装规格明细
MesPackageDetail saveMesPackageDetail = getPackageDetail(mesPackageDetail, mesPart);
if (mesPackageDetail.getIsMemoryBoolean()) {
//保存包装明细
mesPackageDetailRDao.insert(saveMesPackageDetail);
//更新包装表
updateMesPackage(mesPackage, mesPackageDetail.getModifyUser(), 1d, false);
}
mesPackage.setMesPackageDetail(saveMesPackageDetail);
return mesPackage;
}
}
@Override
public void saveMesPackageDetails(List<MesPackageDetail> mesPackageDetailList, String userName) {
MesPackageDetail packageDetail = mesPackageDetailList.iterator().next();
int qty = mesPackageDetailList.size();
//校验包装条码信息
MesPackage mesPackage = getMesPackageAndCheck(packageDetail.getPackageNo(), packageDetail.getOrganizeCode());
//去掉重复零件条码
checkSerialNumber(mesPackageDetailList, packageDetail, userName);
//保存包装明细
mesPackageDetailRDao.saveAll(mesPackageDetailList);
//更新包装表
updateMesPackage(mesPackage, userName, qty, false);
}
@Override
public void updateMesPackage(MesPackage mesPackage) {
String userName = mesPackage.getModifyUser();
if (Objects.isNull(CommonEnumUtil.TRUE_OR_FALSE.valueOfDescription(mesPackage.getIsSealed()))) {
MesPcnException.throwMesBusiException("是否封箱不能为空");
}
//查询包装条码信息
MesPackage mesPackageDb = getMesPackageAndCheck(mesPackage.getPackageNo(), mesPackage.getOrganizeCode());
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackage.getIsSealed()) {
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】状态为已关箱请勿重复操作", mesPackage.getPackageNo());
}
//关箱
updateMesPackage(mesPackageDb, mesPackage.getModifyUser(), 0d, true);
} else if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackage.getIsSealed()) {
if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】状态不为已关箱不需要拆箱", mesPackage.getPackageNo());
}
//拆箱
unboxing(mesPackage, userName, mesPackageDb);
}
}
@Override
public void updateMesPackageDetails(MesPackageDetail mesPackageDetail) {
//查询包装条码信息
MesPackage mesPackageDb = getMesPackageAndCheck(mesPackageDetail.getPackageNo(), mesPackageDetail.getOrganizeCode());
if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == mesPackageDb.getIsSealed()) {
MesPcnException.throwMesBusiException("包装条码【%s】不为已关箱状态不允许操作替换条码", mesPackageDetail.getPackageNo());
}
//校验是否重复扫描
List<MesPackageDetail> mesPackageDetails = getMesPackageDetailList(mesPackageDetail);
for (MesPackageDetail packageDetail : mesPackageDetails) {
//替换条码是否已经存在
if (packageDetail.getSerialNumber().equals(mesPackageDetail.getSerialNumber())) {
MesPcnException.throwMesBusiException("零件条码【%s】已存在存在", mesPackageDetail.getSerialNumber());
}
//替换条码
if (packageDetail.getSerialNumber().equals(mesPackageDetail.getOldSerialNumber())) {
packageDetail.setSerialNumber(mesPackageDetail.getSerialNumber());
packageDetail.setOldSerialNumber(mesPackageDetail.getOldSerialNumber());
ConvertBean.serviceModelUpdate(packageDetail, mesPackageDetail.getModifyUser());
}
}
mesPackageDetailRDao.saveAll(mesPackageDetails);
}
private List<MesPackageDetail> getMesPackageDetailList(MesPackageDetail mesPackageDetail) {
String[] serialNumberList = new String[]{mesPackageDetail.getSerialNumber(), mesPackageDetail.getOldSerialNumber()};
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
DdlPreparedPack.getInPackArray(serialNumberList, "serialNumber", ddlPackBean);
List<MesPackageDetail> mesPackageDetails = mesPackageDetailRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesPackageDetails)) {
MesPcnException.throwMesBusiException("零件条码【%s】不存在", mesPackageDetail.getOldSerialNumber());
}
return mesPackageDetails;
}
@Override
public void unLock(String organizeCode, String userName, String pwd) {
String cfgValue = configService.getCfgValue(organizeCode, MesCommonConstant.BOXING_ERROR_PROOFING_PWD);
if (!Objects.equals(cfgValue, pwd)) {
MesPcnException.throwMesBusiException("解锁失败密码错误");
}
}
private void unboxing(MesPackage mesPackage, String userName, MesPackage mesPackageDb) {
//更新包装表
mesPackageDb.setQty(0d);
mesPackageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelUpdate(mesPackageDb, userName);
mesPackageRDao.update(mesPackageDb);
//软删包装明细
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackage.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackage.getPackageNo(), "packageNo", ddlPackBean);
mesPackageDetailRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "isDeleted"},
new Object[]{userName, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()},
ddlPackBean);
}
private MesPackage getMesPackageAndCheck(String packageNo, String organizeCode) {
MesPackage mesPackageDb = getMesPackage(organizeCode, packageNo);
if (Objects.isNull(mesPackageDb)) {
MesPcnException.throwMesBusiException("包装条码【%s】信息不存在", packageNo);
}
return mesPackageDb;
}
private void checkSerialNumber(List<MesPackageDetail> mesPackageDetailList, MesPackageDetail packageDetail, String userName) {
List<MesPackageDetail> mesPackageDetails = getMesPackageDetailList(packageDetail.getOrganizeCode(), packageDetail.getPackageNo());
if (!CollectionUtils.isEmpty(mesPackageDetails)) {
List<String> serialNumberList = mesPackageDetails.stream().map(MesPackageDetail::getSerialNumber).collect(Collectors.toList());
for (MesPackageDetail mesPackageDetail : mesPackageDetailList) {
if (serialNumberList.contains(mesPackageDetail.getSerialNumber())) {
mesPackageDetailList.remove(mesPackageDetail);
}
ConvertBean.serviceModelInitialize(mesPackageDetail, userName);
}
}
}
private void updateMesPackage(MesPackage mesPackage, String userName, double qty, boolean close) {
mesPackage.setQty(MathOperation.add(mesPackage.getQty(), qty));
if (mesPackage.getPackSpecQty() <= mesPackage.getQty() || close) {
mesPackage.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesPackage.setLotNo(TimeTool.getToday());
//数据写入接口表回传wms
saveMesPackageResult(mesPackage, userName);
}
ConvertBean.serviceModelUpdate(mesPackage, userName);
mesPackageRDao.update(mesPackage);
}
private void saveMesPackageResult(MesPackage mesPackage, String userName) {
MesPackageResult mesPackageResult;
List<MesPackageResult> mesPackageResultList = new ArrayList<>();
List<MesPackageDetail> mesPackageDetailList = getMesPackageDetailList(mesPackage.getOrganizeCode(), mesPackage.getPackageNo());
for (MesPackageDetail mesPackageDetail : mesPackageDetailList) {
mesPackageResult = new MesPackageResult(mesPackageDetail, mesPackage.getQty());
ConvertBean.serviceModelInitialize(mesPackageResult, userName);
mesPackageResultList.add(mesPackageResult);
}
mesPackageResultRDao.saveAll(mesPackageResultList);
}
private List<MesPackageDetail> getMesPackageDetailList(String organizeCode, String packageNo) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packageNo, "packageNo", ddlPackBean);
List<MesPackageDetail> mesPackageDetails = mesPackageDetailRDao.findByHqlWhere(ddlPackBean);
return mesPackageDetails;
}
private MesPackageDetail getPackageDetail(MesPackageDetail mesPackageDetail, MesPart mesPart) {
MesPackageDetail saveMesPackageDetail = new MesPackageDetail();
saveMesPackageDetail.setPackageNo(mesPackageDetail.getPackageNo());
saveMesPackageDetail.setSerialNumber(mesPackageDetail.getSerialNumber());
saveMesPackageDetail.setPartNo(mesPart.getPartNo());
saveMesPackageDetail.setPartName(mesPart.getPartName());
saveMesPackageDetail.setQty(1d);
saveMesPackageDetail.setOrganizeCode(mesPackageDetail.getOrganizeCode());
ConvertBean.serviceModelInitialize(saveMesPackageDetail, mesPackageDetail.getCreateUser());
return saveMesPackageDetail;
}
private String getPartNo(MesPackageDetail mesPackageDetail, MesPackage mesPackage, List<MesPackingDefineDetails> defineDetails) {
String packageBarcodeRule;
String partNo = null;
for (MesPackingDefineDetails defineDetail : defineDetails) {
//条码规则为空
if (StringUtils.isEmpty(defineDetail.getPackageBarcodeRule())) {
MesPcnException.throwMesBusiException("箱类别代号【%s】零件号【%s】条码规则未维护", mesPackage.getPackageSn(), defineDetail.getPartNo());
}
packageBarcodeRule = defineDetail.getPackageBarcodeRule().replace("*", "");
//包含箱条码
if (mesPackageDetail.getSerialNumber().contains(packageBarcodeRule)) {
partNo = defineDetail.getPartNo();
break;
}
}
if (Objects.isNull(partNo)) {
MesPcnException.throwMesBusiException("零件条码【%s】未匹配到符合条码规则的数据", mesPackage.getSerialNumber());
}
return partNo;
}
private void checkNotNull(MesPackageDetail mesPackageDetail) {
if (StringUtils.isEmpty(mesPackageDetail.getPackageNo())) {
MesPcnException.throwMesBusiException("包装编码不能为空");
}
if (StringUtils.isEmpty(mesPackageDetail.getScanType())) {
MesPcnException.throwMesBusiException("客户条码规则不能为空");
}
}
private void checkSerial(MesPackingDefine packingDefine, String[] split) {
if (StringUtils.isEmpty(packingDefine.getSerialIdIndex()) || packingDefine.getSerialIdIndex() > split.length
|| StringUtils.isEmpty(split[packingDefine.getSerialIdIndex() - 1])) {
MesPcnException.throwMesBusiException("序列号所在位置不存在");
}
String serialNo = split[packingDefine.getSerialIdIndex() - 1];
}
private void checkOrganizeCode(MesPackageDetail mesPackageDetail, MesPackingDefine packingDefine, String[] split) {
if (StringUtils.isEmpty(packingDefine.getOrganizeIndex()) || packingDefine.getOrganizeIndex() > split.length
|| StringUtils.isEmpty(split[packingDefine.getOrganizeIndex() - 1])) {
MesPcnException.throwMesBusiException("工厂所在位置不存在");
}
String organizeCode = split[packingDefine.getOrganizeIndex() - 1];
if (!Objects.equals(organizeCode, mesPackageDetail.getOrganizeCode())) {
MesPcnException.throwMesBusiException("箱条码工厂【%s】和当前工厂【%s】不匹配", organizeCode, mesPackageDetail.getOrganizeCode());
}
}
private MesPart getMesPart(MesPackageDetail mesPackageDetail, MesPackingDefine packingDefine, String[] split) {
if (StringUtils.isEmpty(packingDefine.getPartNoIndex()) || packingDefine.getPartNoIndex() > split.length
|| StringUtils.isEmpty(split[packingDefine.getPartNoIndex() - 1])) {
MesPcnException.throwMesBusiException("物料号所在位置不存在");
}
MesPart mesPart = getPart(mesPackageDetail.getOrganizeCode(), split[packingDefine.getPartNoIndex() - 1]);
return mesPart;
}
private MesPart getPart(String organizeCode, String partNo) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean);
MesPart mesPart = partRDao.getByProperty(packBean);
if (Objects.isNull(mesPart)) {
MesPcnException.throwMesBusiException("物料【%s】信息不存在", partNo);
}
return mesPart;
}
private Double getQty(MesPackingDefine packingDefine, String[] split) {
if (StringUtils.isEmpty(packingDefine.getQtyIndex()) || packingDefine.getQtyIndex() > split.length
|| StringUtils.isEmpty(split[packingDefine.getQtyIndex() - 1])) {
MesPcnException.throwMesBusiException("数量所在位置不存在");
}
//校验是否数字
if (!CheckTool.isNumber(split[packingDefine.getQtyIndex() - 1])) {
MesPcnException.throwMesBusiException("数量所在位置不为数字类型");
}
return Double.parseDouble(split[packingDefine.getQtyIndex() - 1]);
}
private MesPackage getMesPackage(MesPackageDetail mesPackageDetail, MesPart mesPart, Double qty, MesPackingDefine packingDefine) {
//保存包装信息
MesPackage packages = new MesPackage();
packages.setPackageNo(mesPackageDetail.getPackageNo());
packages.setPartNo(mesPart.getPartNo());
packages.setPartName(mesPart.getPartName());
packages.setPackSpecQty(qty);
packages.setQty(0d);
packages.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
packages.setPrintStatus(MesPcnEnumUtil.PACKAGE_PRINT_STATUS.UNPRINTED.getValue());
packages.setPackageSn(packingDefine.getPackCode());
packages.setOrganizeCode(mesPackageDetail.getOrganizeCode());
ConvertBean.serviceModelInitialize(packages, mesPackageDetail.getCreateUser());
return packages;
}
private MesPackage getMesPackage(String organizeCode, String packageNo) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packageNo, "packageNo", packBean);
return mesPackageRDao.getByProperty(packBean);
}
private MesPackingDefine getMesPackingDefine(MesPackageDetail mesPackageDetail) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(mesPackageDetail.getScanType(), "scanType", packBean);
MesPackingDefine packingDefine = mesPackingDefineRDao.getByProperty(packBean);
if (Objects.isNull(packingDefine)) {
MesPcnException.throwFlowException("客户条码规则在包装定义界面未维护");
}
return packingDefine;
}
}

@ -0,0 +1,38 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEnumDetailService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesEnumDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesEnumDetailRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/9 19:20
* @Modify:
**/
@Service
@Slf4j
public class MesEnumDetailServiceImpl implements IMesEnumDetailService {
@Autowired
private MesEnumDetailRepository mesEnumDetailRDao;
@Override
public List<MesEnumDetail> findMesEnumDetail(MesEnumDetail mesEnumDetail) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesEnumDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesEnumDetail.getEnumCode(), "enumCode", packBean);
DdlPreparedPack.getStringEqualPack(mesEnumDetail.getDetailCode(), "detailCode", packBean);
DdlPreparedPack.getStringEqualPack(mesEnumDetail.getDetailName(), "detailName", packBean);
DdlPreparedPack.getStringEqualPack(mesEnumDetail.getDetailValue(), "detailValue", packBean);
return mesEnumDetailRDao.findByHqlWhere(packBean);
}
}

@ -2,10 +2,12 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
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.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -49,4 +51,18 @@ public class MesProduceSnExtService implements IMesProduceSnExtService {
produceSnDataList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProduceSn::getProductSn))), ArrayList::new));
}
@Override
public void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList) {
DdlPackBean packBean = new DdlPackBean();
DdlPreparedPack.getStringEqualPack(reqBean.getOrganizeCode(), MesPcnExtConstWords.ORGANIZE_CODE, packBean);
DdlPreparedPack.getInPackList(idList, MesPcnExtConstWords.ID, packBean);
produceSnRepository.updateByProperties(
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE, MesPcnExtConstWords.SN_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), snStatus},
packBean);
}
}

@ -0,0 +1,51 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MesWorkOrderExtService implements IMesWorkOrderExtService {
@Autowired
private MesWorkOrderRepository workOrderRepository;
//根据生产工单号集合 查询生产工单数据
@Override
public List<MesWorkOrder> getWorkOrderList(String organizeCode, List<String> workOrderNoList) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(workOrderNoList)) return null;
workOrderNoList = workOrderNoList.size() == 1 ? workOrderNoList : workOrderNoList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (workOrderNoList.size() == 1) DdlPreparedPack.getStringEqualPack(workOrderNoList.get(0), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
else DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
return workOrderRepository.findByHqlWhere(packBean);
}
//根据生产工单号集合 查询生产工单数据
@Override
public Map<String, MesWorkOrder> getWorkOrderMap(String organizeCode, List<String> workOrderNoList) {
List<MesWorkOrder> workOrderList = getWorkOrderList(organizeCode, workOrderNoList);
return CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.toMap(MesWorkOrder::getWorkOrderNo, o -> o));
}
}

@ -22,6 +22,7 @@ import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
@ -90,7 +91,15 @@ public class MesWorkOrderService implements IMesWorkOrderService {
DdlPreparedPack.getStringLikerPack(workOrder.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringLikerPack(workOrder.getWorkCellCode(), "workCellCode", packBean);
DdlPreparedPack.getStringLikerPack(workOrder.getWorkOrderNo(), "workOrderNo", packBean);
DdlPreparedPack.getInPackList(workOrder.getStatusList(), "status", packBean);
if (!StringUtils.isEmpty(workOrder.getWorkOrderStatus())) DdlPreparedPack.getNumEqualPack(workOrder.getStatusList(), "workOrderStatus", packBean);
else DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList()), "workOrderStatus", packBean);
DdlPreparedPack.getStringBiggerPack(workOrder.getStartTimeStart(), "planStartTime", packBean);
DdlPreparedPack.getStringSmallerPack(workOrder.getStartTimeEnd(), "planStartTime", packBean);
DdlPreparedPack.getStringBiggerPack(workOrder.getEndTimeStart(), "planEndTime", packBean);
DdlPreparedPack.getStringSmallerPack(workOrder.getEndTimeEnd(), "planEndTime", packBean);
return packBean;
}
@ -102,7 +111,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
Map<String,MesPart> mesPartMap = new HashMap<>();
MesPart mesPart = null;
//查询工单状态
Integer[] orderStatus =new Integer[]{MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(),MesExtEnumUtil.ORDER_STATUS.process.getValue()};
Integer[] orderStatus =new Integer[]{MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(),MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()};
for (Map.Entry<String, List<MesProduceSn>> mesProduceSn : mesWorkOrderMap.entrySet()) {
List<MesProduceSn> mesWorkOrderList = mesProduceSn.getValue();
//获取物料信息
@ -165,7 +174,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
} else if (Objects.equals(oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())) {
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.process.getValue());
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
ConvertBean.serviceModelUpdate(oldMesWorkOrder,userName);
workOrderRepository.update(oldMesWorkOrder);

@ -31,10 +31,14 @@ public class MesEquipVariableCfgRuleMatchDispatchService implements IMesEquipVar
case PRODUCT_SCRAP:
case PRODUCT_SUSPICIOUS:
case READY_SIGNAL:
case BYPASS:
return matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList, "mesEvcRuleMatchCompareValueService");
case FIRST_MOULD_NO:
case MOULD_NO:
case ASSEMBLY:
case PRODUCT_SN:
case WORK_ORDER:
case PRODUCTION_PART_NO:
return matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList, "mesEvcRuleMatchBackValueService");
//TODO CASE 数据变量接口逻辑根据变量类别实现策略

@ -1,110 +0,0 @@
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
//
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
//import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
//import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
//import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
//import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.StringUtils;
//
//import java.util.Map;
//
///**
// * @Description : 展示组件:非排序生产(按钮 临时)
// * @Author :wangjie
// **/
//@Slf4j
//@Service("mesProductionNoSortFunctionModuleService")
//class MesProductionNoSortFunctionModuleService extends BaseModuleService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Override
// public boolean doFunction(StationRequestBean reqBean) {
//
// StationResultBean resultBean = new StationResultBean();
//
// String functionCmd = (String) reqBean.getDataMap().get(MesPcnExtConstWords.FUNCTION_CMD);
// ButtonDynamicModel buttonDynamicModel = !StringUtils.isEmpty(functionCmd) ? JSONObject.parseObject(functionCmd, ButtonDynamicModel.class) : null;
//
// if (null != buttonDynamicModel)
//
//
//
// this.sendMessage(reqBean, resultBean, "后端未获取到业务功能指令!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
//
//
//
//
//
// switch (command) {
// case MesPcnExtConstWords.CMD_WORK_ORDER :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "请选择启动状态的生产工单!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
//
// String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null);
// selectWorkOrderNo = (StringUtils.isEmpty(selectWorkOrderNo) || !selectWorkOrderNo.contains(MesPcnExtConstWords.COLON)) ? selectWorkOrderNo : selectWorkOrderNo.split(MesPcnExtConstWords.COLON)[1];
// if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result;
// reqBean.setForceJumpProcess(true);
// if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) result = true;
// else {
// this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试!", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// break;
// case MesPcnExtConstWords.CMD_BUSI_FLAG :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "请点击业务按钮!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
//
// String curBusiFlag = (String) doHandleBusiFlag(reqBean, 1, null);
// if (!StringUtils.isEmpty(curBusiFlag) && curBusiFlag.equals(value)) return result;
// reqBean.setTriggerAutoFsm(true);
// if (StringUtils.isEmpty(curBusiFlag)) {
// if ((Boolean) doHandleBusiFlag(reqBean, 2, value.toString())) result = true;
// else {
// this.sendMessage(reqBean, null, String.format("业务按钮[%s]缓存失败,请重试!", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// }
// break;
// case MesPcnExtConstWords.CMD_FORCE_CENTER_PASS :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "入参缺少产线强制放行的工步代码!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// String pwd = (String) dataMap.get(MesPcnExtConstWords.PWD);
// if (!jxProduceSnExtService.checkPorceCenterPassPwd(reqBean, pwd)) {
// this.sendMessage(reqBean, null, String.format("产线强制放行验证密码[%s]不正确!", pwd), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// reqBean.setForceSpecStepCode(value.toString());
// result = true;
// break;
// default:
// break;
// }
//
// if (!result) this.sendMessage(reqBean, null, "操作太频繁!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// else {
// //跳过工序
// reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
// reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
// reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
// shippingDispatchService.doSendScanQueueNextExec(reqBean);
// }
// return result;
// }
//
//}

@ -2,22 +2,40 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesFile;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.repository.MesFileRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.util.PojoAttrUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.Collectors;
/**
* @Description :
@ -33,93 +51,89 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Autowired
private MesFileRepository mesFileRepository;
@Override
public void init(StationRequestBean reqBean) {
// 获取工单信息
List<List<StationKvBean>> moduleContentContext = mesProductionDispatchContextStepService.getModuleContentContext(reqBean);
StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext);
StationResultBean resultBean1 = getStationResultBean1(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
// 获取班次信息
List<StationKvBean> prodShiftDataContext = mesProductionDispatchContextStepService.getProdShiftDataContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
MesProdShiftContext mesProdShiftKvBean = mesProductionDispatchContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (CollectionUtils.isEmpty(prodShiftDataContext)) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), "请先开班", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
throw ImppExceptionBuilder.newInstance().setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()).setErrorCode("NO_SHOW_MSG").build();
}
// 发送班次班组和工单
StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext, prodShiftDataContext);
this.sendMessage(reqBean, resultBean);
// 整合班次加工数量
List<StationKvBean> productionStatisticsContext = mesProductionDispatchContextStepService.getProductionStatisticsContext(reqBean);
if (CollectionUtils.isEmpty(productionStatisticsContext)) {
productionStatisticsContext = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(new StringJoiner(MesPcnExtConstWords.AND).add(mesProdShiftKvBean.getShiftGroup()).add(mesProdShiftKvBean.getShiftCode()).toString(), "加工次数", "0"));
}
StationResultBean shiftCountBean = getStationResultBean(reqBean, productionStatisticsContext,mesWorkCell);
this.sendMessage(reqBean, shiftCountBean);
}
private StationResultBean getStationResultBean(StationRequestBean reqBean, List<List<StationKvBean>> moduleContentContext) {
private StationResultBean getStationResultBean(StationRequestBean reqBean, List<List<StationKvBean>> moduleContentContext, List<StationKvBean> prodShiftDataContext) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_DEFAULT);
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
List<StationKvBean> stationKvBeans3 = new ArrayList<>();
StationKvBean stationKvBean7 = new StationKvBean();
stationKvBean7.setKey("shiftCode");
stationKvBean7.setName("班次");
stationKvBean7.setValue("白班");
stationKvBeans3.add(stationKvBean7);
StationKvBean stationKvBean8 = new StationKvBean();
stationKvBean8.setKey("shiftGroup");
stationKvBean8.setName("班组");
stationKvBean8.setValue("注塑2班");
stationKvBeans3.add(stationKvBean8);
resultBean.setResultObj(stationKvBeans3);
resultBean.setResultObj(prodShiftDataContext);
resultBean.setResultList(moduleContentContext);
return resultBean;
}
private StationResultBean getStationResultBean1(StationRequestBean reqBean) {
private StationResultBean getStationResultBean(StationRequestBean reqBean, List<StationKvBean> productionStatisticsContext, MesWorkCell mesWorkCell) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CUSTOM_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.ECHART.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_DEFAULT);
resultBean.setDataAttrList(packDataAttrList());
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
String dataType = MesPcnEnumUtil.STATION_DATA_TYPE.ECHART.getValue();
JSONObject reqJson = new JSONObject();
String url = "";
if (!StringUtils.isEmpty(mesWorkCell.getFileId())) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(Long.parseLong(mesWorkCell.getFileId()), "id", packBean);
MesFile mesFile = mesFileRepository.getByProperty(packBean);
url = mesFile.getFileUrl();
}
if (Objects.equal(MesExtEnumUtil.WORK_FILE_TYPE.HISTOGRAM.getValue(), mesWorkCell.getIsShowMsg())) {
dataType = MesPcnEnumUtil.STATION_DATA_TYPE.ECHART.getValue();
} else if (Objects.equal(MesExtEnumUtil.WORK_FILE_TYPE.PROD_VIDEO.getValue(), mesWorkCell.getIsShowMsg())) {
dataType = MesPcnEnumUtil.STATION_DATA_TYPE.VIDEO.getValue();
reqJson.put("url", url);
resultBean.setResultObj(reqJson);
} else if (Objects.equal(MesExtEnumUtil.WORK_FILE_TYPE.WORK_CELL_PICTURE.getValue(), mesWorkCell.getIsShowMsg())) {
dataType = MesPcnEnumUtil.STATION_DATA_TYPE.IMAGE.getValue();
reqJson.put("url", url);
resultBean.setResultObj(reqJson);
}
if (Objects.equal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),mesWorkCell.getIsCountFinish())) {
dataType = MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue();
resultBean.setResultList(productionStatisticsContext);
}
resultBean.setDataType(dataType);
resultBean.setCustomPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_WORK_CELL);
List<List<StationKvBean>> stationKvBeansList = new ArrayList<>();
List<StationKvBean> stationKvBeans = new ArrayList<>();
StationKvBean stationKvBean = new StationKvBean();
stationKvBean.setKey("orderNo");
stationKvBean.setName("工单号");
stationKvBean.setValue("11111");
stationKvBeans.add(stationKvBean);
StationKvBean stationKvBean1 = new StationKvBean();
stationKvBean1.setKey("partNo");
stationKvBean1.setName("零件号");
stationKvBean1.setValue("111");
stationKvBeans.add(stationKvBean1);
StationKvBean stationKvBean2 = new StationKvBean();
stationKvBean2.setKey("count");
stationKvBean2.setName("单数");
stationKvBean2.setValue("1111");
stationKvBeans.add(stationKvBean2);
stationKvBeansList.add(stationKvBeans);
List<StationKvBean> stationKvBeans1 = new ArrayList<>();
StationKvBean stationKvBean4 = new StationKvBean();
stationKvBean4.setKey("orderNo");
stationKvBean4.setName("工单号");
stationKvBean4.setValue("11111");
stationKvBeans1.add(stationKvBean4);
StationKvBean stationKvBean5 = new StationKvBean();
stationKvBean5.setKey("partNo");
stationKvBean5.setName("零件号");
stationKvBean5.setValue("111");
stationKvBeans1.add(stationKvBean5);
StationKvBean stationKvBean6 = new StationKvBean();
stationKvBean6.setKey("count");
stationKvBean6.setName("单数");
stationKvBean6.setValue("1111");
stationKvBeans1.add(stationKvBean6);
stationKvBeansList.add(stationKvBeans1);
//resultBean.setResultObj(stationKvBeans3);
resultBean.setResultList(stationKvBeansList);
return resultBean;
}
private List<AttrBean> packDataAttrList() {

@ -0,0 +1,110 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
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.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description :
**/
@Service
public class MesFunctionChooseCavityOrderService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//获取生产过程上下文对象
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
if (!productionProcessContext.getSuccess()) return false;
MesWorkCell workCell = productionProcessContext.getWorkCell();
if (StringUtils.isEmpty(workCell.getIsAllowOrder()) || CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == workCell.getIsAllowOrder()) {
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s失败,工位未设置允许界面选工单!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
List<StationKvBean> resultList = checkCavityOrderIsValid(buttonDynamicModel.getFunctionValue());
if (CollectionUtils.isEmpty(resultList)) {
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s失败,请检查选择的工单信息[%s]的有效性!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
//保存手动选择的腔数及工单信息上下文
productionDispatchContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList);
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功,请等待验证! 提交信息[%s]",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setTriggerAutoFsm(true);
shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false);
return true;
}
//腔数=工单个数 数据格式: 腔数;工单1;工单2;工单3
private List<StationKvBean> checkCavityOrderIsValid(String functionValue) {
List<String> list = !StringUtils.isEmpty(functionValue) ? new ArrayList<>(Arrays.asList(functionValue.split(MesPcnExtConstWords.SEMICOLON))) : null;
if (CollectionUtils.isEmpty(list)) return null;
List<StationKvBean> resultList = null;
try {
Integer cavity = Integer.valueOf(list.get(0));
if (cavity != list.size() - 1) return null;
return StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", list.remove(0)),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "加工单", list.stream().filter(o -> null != o).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON))));
} catch (NumberFormatException e) {
return null;
}
}
}

@ -0,0 +1,34 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
**/
@Service
public class MesFunctionJumpProcessService implements IFsmModuleFunctionService {
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
return true;
}
}

@ -0,0 +1,52 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Map;
/**
* @Description :
**/
@Service
public class MesFunctionJumpStateService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
Map<String, String> wcpcMap = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean);
String jumpState = wcpcMap.get(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.JUMP_STATE.getCode());
if (StringUtils.isEmpty(jumpState)) {
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s失败,未配置工位参数[%s]!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.JUMP_STATE.getCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setScanInfo(jumpState);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
return true;
}
}

@ -0,0 +1,37 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
**/
@Service
public class MesFunctionResetCellContextService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Override
public boolean doFunction(StationRequestBean reqBean) {
//删除BASE上下文数据
productionProcessContextStepService.deleteProductionProcessContext(reqBean);
//删除BUSI上下文数据
return ((IStepService) SpringContextsUtil.getBean("mesProductionContextFlushStepService")).execute(reqBean).isCompleted();
}
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { return doFunction(reqBean); }
}

@ -0,0 +1,32 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
**/
@Service
public class MesFunctionSwitchCellService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s,客户端已下线!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return true;
}
}

@ -105,6 +105,9 @@ public class MesAssemblyReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -115,9 +118,6 @@ public class MesAssemblyReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//匹配读取的装配件的有效性
return matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -59,15 +59,15 @@ public class MesAssemblyScanStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//保存设备当前一轮工序待验证的装配件条码信息
productionDispatchContextStepService.saveScanAssemblySnContext(reqBean, getAssemblySnJson(reqBean, scanInfo));
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息装配件条码[%s]!", scanInfo));
}
@ -76,7 +76,7 @@ public class MesAssemblyScanStepService extends BaseStepService {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true)));
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()));
return equipVariableCollectContextList;

@ -60,6 +60,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
@ -81,6 +84,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
//保存上下文产品加工规则信息集合
if (prodRuleContextList.size() != initSize) productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
//显示装配件信息

@ -56,6 +56,9 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
@ -74,6 +77,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
if (!showProductionAssembly(reqBean, resultBean, workCenter, cellEquipContext, prodRuleContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前未查询到相关的装配件清单");
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "显示装配件扫描项成功!");

@ -38,16 +38,16 @@ public class MesAssemblyShowStepService extends BaseStepService {
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取排序线的装配件清单
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//排序线 显示装配件扫描项工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesAssemblyShowSortStepService")).execute(reqBean);
//获取非排序线的装配件清单
//非排序线 显示装配件扫描项工步
return ((IStepService) SpringContextsUtil.getBean("mesAssemblyShowNosortStepService")).execute(reqBean);
}

@ -0,0 +1,98 @@
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.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesCountDownShowStepService")
public class MesCountDownShowStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IFsmCommonService fsmCommonService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取工位信息
MesWorkCell workCell = productionProcessContext.getWorkCell();
//不用显示倒计时, 客户端默认显示绿色无数字
if (StringUtils.isEmpty(workCell.getIsShowTime()) || CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == workCell.getIsShowTime()) return stepResult;
//解析工位参数
String countDownTime = doCalcCountDownCfg(reqBean);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("[%sS]倒计时启动!", countDownTime));
}
private String doCalcCountDownCfg(StationRequestBean reqBean) {
//获取工位参数
Map<String, String> wcpcMap = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean);
//配置值: 60,5 60代表总倒计时,显示绿色; 5代表接近超时,显示黄色; 超时后显示红色
String countDownCfg = wcpcMap.containsKey(MesPcnExtConstWords.COUNT_DOWN_CFG) ? wcpcMap.get(MesPcnExtConstWords.COUNT_DOWN_CFG) : null;
String[] countDownCfgArr = !StringUtils.isEmpty(countDownCfg) ? countDownCfg.split(MesPcnExtConstWords.COMMA) : null;
countDownCfgArr = (null != countDownCfgArr && countDownCfgArr.length == 2) ? countDownCfgArr : MesPcnExtConstWords.COUNT_DOWN_CFG_DEFAULT.split(MesPcnExtConstWords.COMMA);
List<StationKvBean> resultList = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesExtEnumUtil.COLOR.GREEN.getValue(), "倒计时时长", countDownCfgArr[0]),
new StationKvBean(MesExtEnumUtil.COLOR.YELLOW.getValue(), "即将超时", countDownCfgArr[1]), new StationKvBean(MesExtEnumUtil.COLOR.RED.getValue(), "已经超时", MesPcnExtConstWords.ZERO_STR));
//发送倒计时信号给客户端
this.sendMessage(reqBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.TIME_MODULE_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue()).resultList(resultList));
return countDownCfgArr[0];
}
}

@ -0,0 +1,112 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
/**
* @Description : BYPASS
* @Author : wangjie
**/
@Slf4j
@Service("mesEquipByPassReadStepService")
public class MesEquipByPassReadStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesEquipmentLogExtService equipmentLogExtService;
@Autowired
private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
if (productionProcessContext.getSuccess()) return stepResult.isCompleted(false);
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
if (null == cellEquipContext || StringUtils.isEmpty(cellEquipContext.getCtrlByPass())) return stepResult.isCompleted(false);
//获取生产过程上下文对象有异常信息
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) return stepResult.isCompleted(false).msg(productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[就绪信号]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.BYPASS.getValue());
//配置错误
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfgAndValue(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.BYPASS.getValue()).getSuccess())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//匹配BYPASS有效性
return matchByPassValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult matchByPassValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]BYPASS信号,持续监听中...", cellEquipContext.getEquipmentCode()));
//匹配BYPASS信号有效性
Boolean result = (Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.BYPASS.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//发送BYPASS信号给客户端
this.sendMessage(reqBean, resultBean.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.BYPASS_MODULE.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.COLOR.getValue()).resultObj(result ? MesExtEnumUtil.COLOR.GREEN.getValue() : MesExtEnumUtil.COLOR.RED.getValue()));
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult,
true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前已读取到设备[%s]BYSS信号[%s]!", cellEquipContext.getEquipmentCode(), resultBean.getResultObj()));
}
}

@ -10,7 +10,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IPartService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
@ -112,6 +111,9 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -122,9 +124,6 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//验证头道模具号的有效性
return checkFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
@ -222,7 +221,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList, Boolean isFirstMouldNo) {
List<List<StationKvBean>> dataList = new ArrayList<>();
productionPartContextList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList,
new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.MOULD_NO, isFirstMouldNo ? "头道模具号" : "模具号", o.getMouldNo()), new StationKvBean(MesPcnConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnConstWords.PART_NAME, "零件名称", o.getPartName())));
new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.MOULD_NO, isFirstMouldNo ? "头道模具号" : "模具号", o.getMouldNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.PART_NAME, "零件名称", o.getPartName())));
return dataList;
}

@ -0,0 +1,135 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService;
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesRawPackageDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawPackagePartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawPartChargingRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service("mesMaterialReadStepService")
public class MesMaterialReadStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesRawPackageDetailRepository mesRawPackageDeatilRepository;
@Autowired
private MesRawPartChargingRepository mesRawPartChargingRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
String equipmentCode = productionProcessContext.getCurCellEquip().getEquipmentCode();
// 根据设备id获取加料日志
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(equipmentCode, "equipCode", packBean);
MesRawPackageDetail mesRawPackageDetail = mesRawPackageDeatilRepository.getByProperty(packBean);
if (mesRawPackageDetail == null) {
foundExThrow(reqBean, "原材料容器信息未配置");
}
/**
*
*/
List<MesRawPartCharging> list = getListByParentDetailId(mesRawPackageDetail.getId());
/**
* todo
*/
/*MesRawPartCharging mesRawPartCharging = getRawPackByDetailId(mesRawPackageDetail.getId());
if (mesRawPackageDetail == null) {
foundExThrow(reqBean, "料桶信息不存在");
}
//
list.add(mesRawPartCharging);*/
productionDispatchContextStepService.saveMesRawPartChargingDataContext(reqBean, list);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "读取料桶原材料成功");
}
/**
*
* @param id
* @return
*/
private List<MesRawPartCharging> getListByParentDetailId(Long id){
if (id == null) {
return null;
}
List<MesRawPartCharging> list = new ArrayList<>();
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(id, "parentPackageDetailId", packBean);
List<MesRawPartCharging> parentList = mesRawPartChargingRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(parentList)) {
return null;
}
for (MesRawPartCharging mesRawPartCharging : parentList) {
List<MesRawPartCharging> chilrenList = getListByParentDetailId(mesRawPartCharging.getPackageDetailId());
if (CollectionUtils.isEmpty(chilrenList)) {
list.add(mesRawPartCharging);
}
}
return list;
}
/**
*
* @param id
* @return
*/
private MesRawPartCharging getRawPackByDetailId(Long id){
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(id, "packageDetailId", packBean);
return mesRawPartChargingRepository.getByProperty(packBean);
}
}

@ -106,6 +106,9 @@ public class MesMouldNoReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -116,9 +119,6 @@ public class MesMouldNoReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//验证模具号的有效性
checkMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -103,6 +103,9 @@ public class MesProductResultReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -113,9 +116,6 @@ public class MesProductResultReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//匹配加工结果
return matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -43,6 +43,8 @@ public class MesProductSnCheckStepService extends BaseStepService {
@Autowired
private IMesProduceSnExtService produceSnExtService;
//TODO 装配件工步 判断空腔条码
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -62,6 +64,9 @@ public class MesProductSnCheckStepService extends BaseStepService {
//获取上下文扫/读信息:主条码
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
//清除本次已获取得到的主条码信息
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn(
reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "当前上下文中没有需要验证的主条码!");
@ -71,16 +76,15 @@ public class MesProductSnCheckStepService extends BaseStepService {
List<String> finishCodeList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, false);
//验证上下文中主条码的有效性
Map<String, MesProduceSn> produceSnMap = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
//清除本次已完成验证的主条码信息
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
List<MesProduceSn> produceSnList = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg()));
//获取上下文的工位
MesWorkCell workCell = productionProcessContext.getWorkCell();
Map<String, MesProduceSn> produceSnMap = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o));
//封装 读/扫主条件信息到进料主条码数据信息中
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList));
@ -93,9 +97,10 @@ public class MesProductSnCheckStepService extends BaseStepService {
//保存进料主条码数据
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
return CollectionUtils.isEmpty(produceSnMap) ?
execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码[%s]验证条码状态成功!", productSnList)) :
execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码[%s]验证条码状态成功,进料零件主条码即将标记状态[未知]!", productSnList));
//变更主条码状态为未知
saveProduceSnList(reqBean, resultBean, produceSnList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码%s验证条码状态成功!", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()));
}
@ -105,7 +110,7 @@ public class MesProductSnCheckStepService extends BaseStepService {
}
//获取进料主条码数据信息
private Map<String, MesProduceSn> checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<String> productSnList) {
private List<MesProduceSn> checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<String> productSnList) {
//根据零件条码查询零件条码信息
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), productSnList);
@ -115,7 +120,7 @@ public class MesProductSnCheckStepService extends BaseStepService {
//循环获取进料主条码数据信息
produceSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, o));
return !stepResult.isCompleted() ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o));
return !stepResult.isCompleted() ? null : produceSnList;
}
@ -127,7 +132,8 @@ public class MesProductSnCheckStepService extends BaseStepService {
if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSn.getQcStatus())
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus())));
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSn.getSnStatus() || (MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode())))
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSn.getSnStatus() ||
(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && !produceSn.getWorkCenterCode().equals(reqBean.getWorkCenterCode()) && !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode())))
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus())));
return stepResult;
@ -141,4 +147,12 @@ public class MesProductSnCheckStepService extends BaseStepService {
productionPsInContextList.add(productionPsInContext);
}
//变更主条码状态为未知
private void saveProduceSnList(StationRequestBean reqBean, StationResultBean resultBean, List<MesProduceSn> produceSnList) {
if (CollectionUtils.isEmpty(produceSnList)) return;
Map<String, Long> psMap = produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, MesProduceSn::getId));
produceSnExtService.saveProduceSnList(reqBean, MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue(), new ArrayList<>(psMap.values()));
this.sendMessage(reqBean, resultBean, String.format("主条码%s信息已变更[%s]状态", psMap.keySet().toString(), MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getDescription()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}

@ -60,7 +60,11 @@ public class MesProductSnGenerateStepService extends BaseStepService {
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
/**todo
* todo
* @param reqBean
* @return
*/
@Override
public StepResult execute(StationRequestBean reqBean) {

@ -102,6 +102,9 @@ public class MesProductSnReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -112,9 +115,6 @@ public class MesProductSnReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//匹配读取的主条码的有效性
return matchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -58,18 +58,18 @@ public class MesProductSnScanStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
//当前工位使用的设备
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
@ -92,7 +92,7 @@ public class MesProductSnScanStepService extends BaseStepService {
Boolean isAllowJump = checkIsAllowJump(reqBean, productionPsInContextList, isCraftJumpCode, scanInfo);
//封装待验证的主条码信息
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, equipVariableCollectContextList, scanInfo);
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean.getOrganizeCode(), scanInfo, equipVariableCollectContextList);
//先判断前期扫描数量
Integer scanedQty = (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size());
@ -186,11 +186,11 @@ public class MesProductSnScanStepService extends BaseStepService {
}
//封装扫/读信息:主条码信息
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, List<MesEquipVariableCollectContext> equipVariableCollectContextList, String scanInfo) {
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(String organizeCode, String scanInfo, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true)));
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(organizeCode, scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()));
return equipVariableCollectContextList;

@ -0,0 +1,206 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
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.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IPartService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionPartNoReadStepService")
public class MesProductionPartNoReadStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesEquipmentLogExtService equipmentLogExtService;
@Autowired
private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService;
@Autowired
private IPartService partService;
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在产出零件号跟产出零件信息
if (productionDispatchContextStepService.checkProductionPartNoIsExistContext(reqBean) && productionDispatchContextStepService.checkProductionPartIsExistContext(reqBean)) return stepResult;
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[产出零件号]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCTION_PART_NO.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCTION_PART_NO.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//验证产出零件号的有效性
return checkProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
//验证产出零件号的有效性
private StepResult checkProductionPartNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]产出零件号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//读取的产出零件号进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCTION_PART_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//发送工步内容
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//获取产出零件信息 获取零件信息
List<MesProductionPartContext> productionPartContextList = getProductionPartContext(reqBean, resultBean, productionProcessContext, equipVariableCollectContextList);
//更新展示组件MODULE_CONTENT内容
doCacheMoudleContext(reqBean, productionPartContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]产出零件号[%s]!", cellEquipContext.getEquipmentCode(), scanInfo));
}
private List<MesProductionPartContext> getProductionPartContext(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
//从上下文中取出零件信息集合
Map<String, MesPart> partDataMap = productionDispatchContextStepService.getPartDataContext(reqBean);
//从读取信息中搜集零件编码并去重
List<String> partNoList = (equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
//验证上下文中取出零件信息集合是否匹配一模多腔信息中搜集零件编码
if (CollectionUtils.isEmpty(partDataMap) || (!partDataMap.keySet().containsAll(partNoList) || !partNoList.containsAll(partDataMap.keySet()))) partDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList);
//零件信息缺失 抛出异常
List<MesProductionPartContext> productionPartContextList = getProductionPartContext(reqBean, resultBean, partNoList, partDataMap, equipVariableCollectContextList);
//保存设备当前一轮工序的产出零件号,产出零件信息,零件信息
productionDispatchContextStepService.saveProductionPartNoContext(reqBean, equipVariableCollectContextList);
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap);
return productionPartContextList;
}
private List<MesProductionPartContext> getProductionPartContext(StationRequestBean reqBean, StationResultBean resultBean, List<String> partNoList, Map<String, MesPart> partDataMap, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
List<String> filterList = CollectionUtils.isEmpty(partDataMap) ? null : partNoList.stream().filter(o -> (null != o && !partDataMap.containsKey(o))).collect(Collectors.toList());
//验证错误 抛出异常
if (CollectionUtils.isEmpty(partDataMap) || !CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(partDataMap) ? partNoList.toString() : filterList.toString()));
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(new MesProductionPartContext().copyPartNo(reqBean.getOrganizeCode(), o.getEquipVariableValue(), partDataMap.get(o.getEquipVariableValue()).getPartName())));
return productionPartContextList;
}
private void doCacheMoudleContext(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
}
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
List<List<StationKvBean>> dataList = new ArrayList<>();
productionPartContextList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.PART_NAME, "零件名称", o.getPartName())));
return dataList;
}
}

@ -2,12 +2,15 @@ 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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
@ -21,6 +24,7 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.hutool.core.date.DateUtil;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -58,6 +62,8 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
public StepResult execute(StationRequestBean reqBean) {
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
List<MesProduceSn> mesProduceSns = mesProductionDispatchContextStepService.getOutProduceSnDataContext(reqBean);
List<MesProductionRecord> mesProductionRecords = new ArrayList<>();
@ -69,6 +75,10 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
});
mesProductionRecordRepository.saveAll(mesProductionRecords);
if (Objects.equal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),mesWorkCell.getIsCountFinish())) {
// 保存班次加工数量上下文
mesProductionDispatchContextStepService.addProductionStatisticsContext(reqBean,mesProduceSns.size());
}
return StepResult.getSuccessComplete();
}

@ -99,6 +99,9 @@ public class MesReadySignalReadStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -109,9 +112,6 @@ public class MesReadySignalReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//匹配就绪信号有效性
return matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -0,0 +1,148 @@
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.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderCheckNosortStepService")
public class MesWorkOrderCheckNosortStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中缺失待验证的加工单信息!");
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//清除本次已获取得到的加工单信息
productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
//非扫描场景 清除历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean);
//验证工单的有效性
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//扫描场景下合并历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
//保存上下文产出零件信息
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
//更新展示组件MODULE_CONTENT内容
doCacheMoudleContext(reqBean, productionPartContextList);
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString()));
//当前工位使用的设备
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
if (cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0)
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!",
equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size()));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size()));
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList) {
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
//获取生产工单信息
Map<String, MesWorkOrder> workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList);
for (String workOrderNo : workOrderNoList) {
if (StringUtils.isEmpty(workOrderNo)) continue;
MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo);
if (null == workOrderDb) return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo));
if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workOrderDb.getWorkOrderStatus())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus())));
if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode()));
}
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(new MesProductionPartContext().copyPartNo(workOrderMap.get(o.getEquipVariableValue()))));
return stepResult.obj(filterList);
}
private void doCacheMoudleContext(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
}
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
List<List<StationKvBean>> dataList = new ArrayList<>();
productionPartContextList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue()))));
return dataList;
}
}

@ -1,24 +1,27 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
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.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductSnMarkUnkonwStepService")
public class MesProductSnMarkUnkonwStepService extends BaseStepService {
@Service("mesWorkOrderCheckStepService")
public class MesWorkOrderCheckStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@ -26,13 +29,6 @@ public class MesProductSnMarkUnkonwStepService extends BaseStepService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProduceSnExtService produceSnExtService;
//TODO 更新条码 未知 单独工步
//TODO 装配件工步 判断空腔条码
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -43,16 +39,21 @@ public class MesProductSnMarkUnkonwStepService extends BaseStepService {
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return stepResult;
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
}
//排序线 加工单验证工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).execute(reqBean);
//非排序线 加工单验证工步
return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckNosortStepService")).execute(reqBean);
}
}

@ -0,0 +1,149 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
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.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderReadStepService")
public class MesWorkOrderReadStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesEquipmentLogExtService equipmentLogExtService;
@Autowired
private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService;
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在读取待验证的加工单信息
if (productionDispatchContextStepService.checkScanWorkOrderNoIsExistContext(reqBean)) return stepResult;
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[加工单]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.WORK_ORDER.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.WORK_ORDER.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配读取的加工单的有效性
return matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
//匹配读取的加工单的有效性
private StepResult matchWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]加工单,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//读取的加工单进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.WORK_ORDER.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的加工单,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//保存设备当前一轮工序的待验证的加工单信息
productionDispatchContextStepService.saveScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);
//发送工步内容
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]加工单信息[%s]!", cellEquipContext.getEquipmentCode(), scanInfo));
}
}

@ -0,0 +1,127 @@
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.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderScanStepService")
public class MesWorkOrderScanStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public StepResult guide(StationRequestBean reqBean) {
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描加工单!");
}
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//当前工位使用的设备
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
//如果没有扫描信息, 取手选工单信息, 封装扫/读信息:加工单信息
List<MesEquipVariableCollectContext> equipVariableCollectContextList;
if (!StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, scanInfo);
else equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult);
//扫描信息为空
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描加工单!");
//保存上下文扫/读信息:加工单
productionDispatchContextStepService.saveScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
}
//封装扫/读信息:加工单信息 (扫描)
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, String scanInfo) {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()));
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
stepResult.msg(String.format("当前扫描信息加工单[%s]!", scanInfo));
return equipVariableCollectContextList;
}
//封装扫/读信息:加工单信息 (选择)
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult) {
List<StationKvBean> chooseCavityOrder = productionDispatchContextStepService.getFunctionChooseCavityOrderContext(reqBean);
if (CollectionUtils.isEmpty(chooseCavityOrder)) return null;
List<String> pickList = new ArrayList<>(Arrays.asList(chooseCavityOrder.stream().filter(o -> (null != o && o.getKey().equals(MesPcnExtConstWords.WORK_ORDER_NO))).findFirst().get().getValue().split(MesPcnExtConstWords.SEMICOLON)));
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
pickList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK.getValue())));
//发送工步内容
String scanInfo = chooseCavityOrder.stream().filter(o -> null != o).map(o -> o.getName() + "[" + o.getValue() + "]").collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK);
stepResult.msg(String.format("当前选择信息%s!", scanInfo));
return equipVariableCollectContextList;
}
}

@ -9,12 +9,14 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -35,7 +37,7 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); }
private String getContextKey(StationRequestBean reqBean, String busiCode) { return new StringJoiner(":").add(reqBean.getOrganizeCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); }
private String getContextKey(String organizeCode, String busiCode) { return new StringJoiner(":").add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); }
//发送设备质量信息
@Override
@ -156,6 +158,33 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SEND_PROCESS_CMD_CONTEXT);
}
//获取上下文产出零件号
@Override
public List<MesEquipVariableCollectContext> getProductionPartNoContext(StationRequestBean reqBean) {
String productionPartNoJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FIRST_MOULD_NO_CONTEXT);
return !StringUtils.isEmpty(productionPartNoJson) ? JSONObject.parseArray(productionPartNoJson, MesEquipVariableCollectContext.class) : null;
}
//验证上下文产出零件号是否存在
@Override
public Boolean checkProductionPartNoIsExistContext(StationRequestBean reqBean) {
String firstMouldNo = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FIRST_MOULD_NO_CONTEXT);
return !StringUtils.isEmpty(firstMouldNo) ? true : false;
}
//保存上下文产出零件号 [JSON]List<MesEquipVariableCollectContext>
@Override
public Boolean saveProductionPartNoContext(StationRequestBean reqBean, List<MesEquipVariableCollectContext> productionPartNoList) {
if (CollectionUtils.isEmpty(productionPartNoList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FIRST_MOULD_NO_CONTEXT, JSONObject.toJSONString(productionPartNoList));
}
//删除上下文产出零件号
@Override
public void deleteProductionPartNoContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FIRST_MOULD_NO_CONTEXT);
}
//获取上下文头道模具号
@Override
public MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean) {
@ -257,6 +286,33 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MOULD_NO_CONTEXT);
}
//获取上下文扫/读信息:加工单
@Override
public List<MesEquipVariableCollectContext> getScanWorkOrderNoContext(StationRequestBean reqBean) {
String productSnJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT);
return !StringUtils.isEmpty(productSnJson) ? JSONObject.parseArray(productSnJson, MesEquipVariableCollectContext.class) : null;
}
//验证上下文扫/读信息:加工单是否存在
@Override
public Boolean checkScanWorkOrderNoIsExistContext(StationRequestBean reqBean) {
String productSnJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT);
return !StringUtils.isEmpty(productSnJson) ? true : false;
}
//保存上下文扫/读信息:加工单 [JSON]List<MesEquipVariableCollectContext>
@Override
public Boolean saveScanWorkOrderNoContext(StationRequestBean reqBean, List<MesEquipVariableCollectContext> productSnList) {
if (CollectionUtils.isEmpty(productSnList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT, JSONObject.toJSONString(productSnList));
}
//删除上下文扫/读信息:加工单
@Override
public void deleteScanWorkOrderNoContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT);
}
//获取上下文扫/读信息:主条码
@Override
public List<MesEquipVariableCollectContext> getScanProductSnContext(StationRequestBean reqBean) {
@ -392,31 +448,48 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT);
}
//获取生产线的当前班组班次信息
@Override
public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) {
List<StationKvBean> stationKvBeans = getProdShiftDataContext(orgainzeCode, workCenterCode);
MesProdShiftContext mesProdShiftContext = new MesProdShiftContext();
if (CollectionUtils.isEmpty(stationKvBeans)) {
return null;
}
StationKvBean shiftGroupKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftGroup")).findFirst().orElse(null);
StationKvBean shiftCodeKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftCode")).findFirst().orElse(null);
mesProdShiftContext.setShiftCode(shiftGroupKvBean == null ? null : shiftGroupKvBean.getValue());
mesProdShiftContext.setShiftGroup(shiftCodeKvBean == null ? null : shiftCodeKvBean.getValue());
return mesProdShiftContext;
}
//获取上下文班次班组信息
@Override
public List<StationKvBean> getProdShiftDataContext(StationRequestBean reqBean, String workCenterCode) {
String prodShiftJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
public List<StationKvBean> getProdShiftDataContext(String orgainzeCode, String workCenterCode) {
String prodShiftJson = getFsmBusiData(orgainzeCode, getContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
return !StringUtils.isEmpty(prodShiftJson) ? JSONObject.parseArray(prodShiftJson, StationKvBean.class) : null;
}
//验证上下文班次班组信息是否存在
@Override
public Boolean checkProdShiftDataIsExistContext(StationRequestBean reqBean, String workCenterCode) {
String prodShiftJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
public Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode) {
String prodShiftJson = getFsmBusiData(orgainzeCode, getContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
return !StringUtils.isEmpty(prodShiftJson) ? true : false;
}
//保存上下文班次班组信息 [JSON]List<StationKvBean>
@Override
public Boolean saveProdShiftDataContext(StationRequestBean reqBean, String workCenterCode, List<StationKvBean> prodShiftDataList) {
public Boolean saveProdShiftDataContext(String organizeCode, String workCenterCode, List<StationKvBean> prodShiftDataList) {
if (CollectionUtils.isEmpty(prodShiftDataList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode, JSONObject.toJSONString(prodShiftDataList));
return saveFsmBusiData(organizeCode, getContextKey(organizeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode, JSONObject.toJSONString(prodShiftDataList));
}
//删除上下文班次班组信息
@Override
public void deleteProdShiftDataContext(StationRequestBean reqBean, String workCenterCode) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
public void deleteProdShiftDataContext(String orgainzeCode, String workCenterCode) {
deleteFsmBusiData(orgainzeCode, getContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
}
//获取上下文工位加工数统计信息
@ -433,12 +506,72 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT, JSONObject.toJSONString(productionStatisticsList));
}
@Override
public Boolean addProductionStatisticsContext(StationRequestBean reqBean, int count) {
MesProdShiftContext mesProdShiftKvBean = getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
String key = new StringJoiner(MesPcnExtConstWords.AND).add(mesProdShiftKvBean.getShiftGroup()).add(mesProdShiftKvBean.getShiftCode()).toString();
List<StationKvBean> stationKvBeans = getProductionStatisticsContext(reqBean);
if (CollectionUtils.isEmpty(stationKvBeans)) {
String name = "加工次数";
String value = count + "";
List<StationKvBean> generateStationKvBeans = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(key, name, value));
saveProductionStatisticsContext(reqBean, generateStationKvBeans);
} else {
stationKvBeans.stream().forEach(stationKvBean -> {
if (Objects.equal(stationKvBean.getKey(), key)) {
stationKvBean.setValue(stationKvBean == null ? count + "" : (Integer.valueOf(stationKvBean.getValue()) + count) + "");
}
});
saveProductionStatisticsContext(reqBean, stationKvBeans);
}
return true;
}
//删除上下文工位加工数统计信息
@Override
public void deleteProductionStatisticsContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT);
}
//获取手动选择的腔数及工单信息上下文
@Override
public List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER);
return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null;
}
//保存手动选择的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]
@Override
public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList) {
if (CollectionUtils.isEmpty(resultList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER, JSONObject.toJSONString(resultList));
}
//删除手动选择的腔数及工单信息上下文
@Override
public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER);
}
@Override
public List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean) {
String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT");
return !StringUtils.isEmpty(mesRawPartChargingDataJson) ? JSONObject.parseArray(mesRawPartChargingDataJson, MesRawPartCharging.class) : null;
}
@Override
public Boolean saveMesRawPartChargingDataContext(StationRequestBean reqBean, List<MesRawPartCharging> mesRawPartChargingList) {
if (CollectionUtils.isEmpty(mesRawPartChargingList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT", JSONObject.toJSONString(mesRawPartChargingList));
}
@Override
public void deleteMesRawPartChargingDataContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT");
}
@ -478,4 +611,5 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT");
}
}

@ -54,6 +54,9 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.BASE_DATA_CONTEXT, JSONObject.toJSONString(productionProcessContext));
}
@Override
public void deleteProductionProcessContext(StationRequestBean reqBean) { deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.BASE_DATA_CONTEXT); }
//获取生产过程上下文对象
@Override
public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) {

@ -26,6 +26,8 @@ public class MesCommonConstant {
public static final String SPOT_CHECK_ORDER_NO_RULE = "SPOT_CHECK_ORDER_NO_RULE";
//生成重新点检单据号
public static final String SPOT_CHECK_ORDER_NO_COPY_RULE = "SPOT_CHECK_ORDER_NO_COPY_RULE";
//装箱防错密码
public static final String BOXING_ERROR_PROOFING_PWD = "BOXING_ERROR_PROOFING_PWD";
}

@ -47,12 +47,6 @@ public class MesCellEquipContext implements Serializable {
@ApiParam("是否控制byPass")
private Integer ctrlByPass;
@ApiParam("是否监控停机")
private Integer monitorDown;
@ApiParam("是否监控停机")
private String monitorDownTime;
@ApiParam("设备质量")
private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValue();

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
@ -87,21 +88,29 @@ public class MesEquipVariableCollectContext implements Serializable {
@ApiParam("读取时间")
private String equipVariableReadtime;
@ApiParam("信息来源")
private Integer messageSource;
public MesEquipVariableCollectContext() {}
public MesEquipVariableCollectContext(Long equipVariableId) {
this.equipVariableId = equipVariableId;
}
public MesEquipVariableCollectContext(String organizeCode, String equipVariableValue, String equipVariableReadtime) {
//扫描/选择信息赋值
public MesEquipVariableCollectContext(String organizeCode, String equipVariableValue, String equipVariableReadtime, Integer messageSource) {
this.organizeCode = organizeCode;
this.equipVariableValue = equipVariableValue;
this.equipVariableReadtime = equipVariableReadtime;
this.messageSource = messageSource;
}
//读取信息赋值
public void copyValue(MesEquipmentLog equipmentLog, String equipVariableReadtime) {
if (null == equipmentLog) return;
BeanUtils.copyProperties(equipmentLog, this);
this.equipVariableReadtime = equipVariableReadtime;
this.messageSource = MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue();
}
}

@ -0,0 +1,33 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.base.annotation.AnnoOutputColumn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.persistence.Column;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* -
*/
@Data
public class MesProdShiftContext implements Serializable {
private static final long serialVersionUID = 1522652732930288855L;
@ApiParam("班组代码")
private String shiftGroup;
@ApiParam("班次代码")
private String shiftCode;
}

@ -1,6 +1,8 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
@ -21,9 +23,15 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("生产工单ID")
private Long id;
@ApiParam("生产工单号")
private String workOrderNo;
@ApiParam("工单数量")
private Double qty;
@ApiParam("设备代码")
private String equipmentCode;
@ -39,8 +47,23 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("模具代码")
private String mouldNo;
//根据一模多腔赋值
public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) {
BeanUtils.copyProperties(mouldMultiCavity, this);
BeanUtils.copyProperties(mouldMultiCavity, this, MesPcnExtConstWords.ID);
return this;
}
//根据零件信息赋值
public MesProductionPartContext copyPartNo(String organizeCode, String partNo, String partName) {
this.organizeCode = organizeCode;
this.partNo = partNo;
this.partName = partName;
return this;
}
//根据工单信息赋值
public MesProductionPartContext copyPartNo(MesWorkOrder workOrder) {
BeanUtils.copyProperties(workOrder, this);
return this;
}

@ -48,6 +48,8 @@ public class MesPcnExtConstWords {
public static final String MODIFY_USER = "modifyUser";
// 修改人
public static final String USER_INFO = "userInfo";
// 同步标志
public static final String SYSTEM_SYNC_STATUS = "systemSyncStatus";
// 零件编码
public static final String PART_NO = "partNo";
// 零件名称
@ -68,6 +70,10 @@ public class MesPcnExtConstWords {
public static final String EQUIP_VARIABLE_STATUS = "equipVariableStatus";
// 模具号
public static final String MOULD_NO = "mouldNo";
// 班次
public static final String SHIFT_CODE = "shiftCode";
// 班组
public static final String SHIFT_GROUP = "shiftGroup";
// 工序代码
public static final String PROCESS_CODE = "processCode";
// 生产工单号
@ -108,6 +114,12 @@ public class MesPcnExtConstWords {
public static final String PRODUCT_SN = "productSn";
// 客户条码
public static final String CUST_SN = "custSn";
// 条码状态
public static final String SN_STATUS = "snStatus";
// 腔数
public static final String CAVITY = "cavity";
// 数量
public static final String QTY = "qty";
//设备数据变量读写访问配置
@ -140,6 +152,10 @@ public class MesPcnExtConstWords {
public static final String CAVITY_UNKNOWN_CFG = "CAVITY_UNKNOWN_CFG";
// 支持混腔扫描[工位参数]
public static final String CAVITY_NOSORT_CFG = "CAVITY_NOSORT_CFG";
// 工位倒计时配置[工位参数]
public static final String COUNT_DOWN_CFG = "COUNT_DOWN_CFG";
// 工位倒计时配置默认值
public static final String COUNT_DOWN_CFG_DEFAULT = "60,5";
// 工位/工步 参数按钮事件
@ -147,20 +163,25 @@ public class MesPcnExtConstWords {
// 工位/工步 参数按钮事件值
public static final String FUNCTION_VALUE = "FUNCTION_VALUE";
// 工位参数按钮事件: 跳过工序
// 工位参数按钮事件参数: 是否验证密码
public static final String IS_CHECK_WCPC_PWD = "IS_CHECK_WCPC_PWD";
// 工位参数按钮事件参数: 是否二次确认
public static final String IS_CONFIRM = "IS_CONFIRM";
// 工位参数按钮事件: 重置工序
public static final String FUNCTION_JUMP_PROCESS = "FUNCTION_JUMP_PROCESS";
// 工位参数按钮事件: 强过状态点(工步集)
// 工位参数按钮事件: 强过工步集
public static final String FUNCTION_JUMP_STATE = "FUNCTION_JUMP_STATE";
// 工位参数按钮事件: 重置工位上下文
// 工位参数按钮事件: 重置上下文
public static final String FUNCTION_RESET_CELL_CONTEXT = "FUNCTION_RESET_CELL_CONTEXT";
// 工位参数按钮事件: 选择工单
public static final String FUNCTION_CHOOSE_WORK_ORDER = "FUNCTION_CHOOSE_WORK_ORDER";
// 工位参数按钮事件: 选择工单(先选腔数, 再选工单)
public static final String FUNCTION_CHOOSE_CAVITY_ORDER = "FUNCTION_CHOOSE_CAVITY_ORDER";
// 工位参数按钮事件: 切换工位
public static final String FUNCTION_SWITCH_CELL = "FUNCTION_SWITCH_CELL";
// 0
public static final String ZERO_STR = "0";
// 0
public static final Integer ZERO = 0;
// 1
@ -173,10 +194,15 @@ public class MesPcnExtConstWords {
public static final String EMPTY = "";
// ;
public static final String SEMICOLON = ";";
// ,
public static final String COMMA = ",";
// 定制页面名称(默认)
public static final String CUSTOM_PAGE_NAME_DEFAULT = "CUSTOM_PAGE_NAME_DEFAULT";
// 定制页面名称(默认)
public static final String CUSTOM_PAGE_NAME_WORK_CELL = "CUSTOM_PAGE_NAME_WORK_CELL";
// 上个扫描信息
public static final String CLIENT_INFO = "clientInfo";
// 上个扫描信息
@ -224,8 +250,12 @@ public class MesPcnExtConstWords {
public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT";
//OPC_API_PARAM
public static final String OPC_LINK_URL = "OPC_LINK_URL";
public static final String VALUE = "value";
public static final String CLIENT_HANDLE= "clientHandle";
public static final String CHANNEL = "channel";
public static final String EQUIPMENT_ID = "equipmentId";
@Deprecated
public static final String OPC_WRITE_VARIABLE="/api/OPCService/WriteVariable";

Loading…
Cancel
Save