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

tags/yfai-pcn-ext-v1.0
jun 12 months ago
commit 8727fe218e

@ -0,0 +1,17 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesOrg;
import java.util.List;
/**
* @Description:
* @Author: gsz
* @Date: 2024/5/25 18:16
* @Modify:
*/
public interface IMesOrgService {
List<MesOrg> queryMesOrg(MesOrg mesOrg);
}

@ -0,0 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import io.swagger.annotations.ApiOperation;
import java.util.List;
public interface IMesNumberRuleMatchDispatchService {
@ApiOperation(value = "编码规则匹配")
default List<?> matchNumberRule(String organizeCode, String sn, List<?> numberRuleList) { return numberRuleList; }
@ApiOperation(value = "编码规则匹配")
default Boolean matchNumberRule(String organizeCode, String sn, Object... params) { return true; }
}

@ -15,7 +15,10 @@ public interface IMesProdRuleCfgExtService {
@ApiOperation(value = "【非排序线】获取产品加工规则")
List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【非排序线】获取产品加工规则")
List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(MesProdRuleContext... prodRuleContext);
@ApiOperation(value = "【非排序线】获取产品加工规则对应的装配件信息")
MesProdRuleContext getProdRuleContext(MesProdRuleNosortCfg prodRuleNosortCfg, MesProductionPartContext productionPartContext);
MesProdRuleContext getProdRuleContext(MesProdRuleNosortCfg prodRuleNosortCfg, Integer foreignKey);
}

@ -4,14 +4,10 @@ import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public interface IMesProduceSnExtService {
@ApiOperation(value = "根据零件条码查询零件条码信息")
List<MesProduceSn> getProduceSnList(String organizeCode, List<String> productSnList);
@ApiOperation(value = "根据零件条码查询零件条码信息")
Map<String, MesProduceSn> getProduceSnMap(String organizeCode, List<String> productSnList);
}

@ -1,9 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
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.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
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.model.StationKvBean;
@ -124,7 +121,7 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "保存上下文扫/读信息:主条码", notes = "[JSON]List<MesEquipVariableCollectContext>")
Boolean saveScanProductSnContext(StationRequestBean reqBean, List<MesEquipVariableCollectContext> productSnList);
@ApiOperation(value = "删除上下文扫/读信息:装配件条码")
@ApiOperation(value = "删除上下文扫/读信息:条码")
void deleteScanProductSnContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文生产扫/读信息:装配件条码")
@ -139,17 +136,29 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文扫/读信息:装配件条码")
void deleteScanAssemblySnContext(StationRequestBean reqBean);
@ApiOperation(value = "获取进料主条码数据信息")
List<MesProductionPsInContext> getProductionPsInContext(StationRequestBean reqBean);
@ApiOperation(value = "验证进料主条码数据是否存在")
Boolean checkProductionPsInIsExistContext(StationRequestBean reqBean);
@ApiOperation(value = "保存进料主条码数据", notes = "[JSON]List<MesProductionPsInContext>")
Boolean saveProductionPsInContext(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList);
@ApiOperation(value = "删除进料主条码数据")
void deleteProductionPsInContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文产出条码数据信息集合")
List<MesProduceSn> getOutProduceSnDataContext(StationRequestBean reqBean);
List<MesProductionPsOutContext> getProductionPsOutContext(StationRequestBean reqBean);
@ApiOperation(value = "验证上下文产出条码数据信息集合是否存在")
Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean);
Boolean checkProductionPsOutIsExistContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文产出条码数据信息集合", notes = "[JSON]List<MesProduceSn>")
Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List<MesProduceSn> outProduceSnDataList);
@ApiOperation(value = "保存上下文产出条码数据信息集合", notes = "[JSON]List<MesProductionPsOutContext>")
Boolean saveProductionPsOutContext(StationRequestBean reqBean, List<MesProductionPsOutContext> productionPsOutContextList);
@ApiOperation(value = "删除上下文产出条码数据信息集合")
void deleteOutProduceSnDataContext(StationRequestBean reqBean);
void deleteProductionPsOutContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文产品加工规则数据信息集合")
List<MesProdRuleContext> getProdRuleDataContext(StationRequestBean reqBean);
@ -163,4 +172,26 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文产品加工规则信息集合")
void deleteProdRuleDataContext(StationRequestBean reqBean);
@Deprecated
@ApiOperation(value = "获取上下文产出条码数据信息集合")
List<MesProduceSn> getOutProduceSnDataContext(StationRequestBean reqBean);
@Deprecated
@ApiOperation(value = "验证上下文产出条码数据信息集合是否存在")
Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean);
@Deprecated
@ApiOperation(value = "保存上下文产出条码数据信息集合", notes = "[JSON]List<MesProduceSn>")
Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List<MesProduceSn> outProduceSnDataList);
@Deprecated
@ApiOperation(value = "删除上下文产出条码数据信息集合")
void deleteOutProduceSnDataContext(StationRequestBean reqBean);
}

@ -27,7 +27,6 @@ public interface IMesWorkOrderService {
@ApiOperation(value = "查询工单")
public ListPager<MesWorkOrder> queryMesWorkOrderListByPager(MesWorkOrder workOrder, Pager pager);
void doProductReport(List<MesProduceSn> mesProduceSnList);
void doProductReport(List<MesProduceSn> mesProduceSnList, String organizeCode, String userName);
}

@ -14,12 +14,20 @@
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
<dependency>
<groupId>impp.framework</groupId>
<artifactId>impp-framework-boot</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
<dependency>
<groupId>i3plus.ext.mes.pcn</groupId>
<artifactId>i3plus-ext-mes-pcn-api</artifactId>

@ -33,7 +33,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@ComponentScan(basePackages = {
// 扩展包
"${impp.app.ext.base-packages:}.**"
"${impp.app.ext.base-packages:}.**","org.apache.shardingsphere.shardingjdbc.spring.boot","cn.estsh.impp.framework.**"
})
//cn.estsh.i3plus.app.ext
public class ScanExtPackageConfiguration {

@ -68,7 +68,7 @@ public class MesInputDefectRecordController {
try {
if (StringUtils.isEmpty(model.getSn()) &&
(StringUtils.isEmpty(model.getPartNo()) || StringUtils.isEmpty(model.getLot()) || StringUtils.isEmpty(model.getQty()))) {
(StringUtils.isEmpty(model.getPartNo()) || StringUtils.isEmpty(model.getLotNo()) || StringUtils.isEmpty(model.getQty()) || model.getQty() == 0)) {
throw new ImppBusiException("条码为空或零件号+批次+数量为空");
}

@ -85,7 +85,9 @@ public class MesNcProcessingController {
// 数据校验
ValidatorBean.checkNotNull(model.getPartInspection(), "单据不能为空");
ValidatorBean.checkNotNull(model.getPartInspectionDetailList(), "单据明细不能为空");
ValidatorBean.checkNotNull(model.getPerson(), "责任人不能为空");
if (model.getType() != 10 && model.getType() != 40) {
ValidatorBean.checkNotNull(model.getPerson(), "责任人不能为空");
}
String description = MesExtEnumUtil.NC_TYPE.valueOfDescription(model.getType());
if (StringUtils.isEmpty(description)) {

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesOrgService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesOrg;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Description:
* @Author: gsz
* @Date: 2024/6/5 10:16
* @Modify:
*/
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesOrg")
public class MesOrgController {
@Autowired
private IMesOrgService mesOrgService;
@GetMapping(value = "/query")
@ApiOperation(value = "查询责任人区域关系")
public ResultBean queryMesProdShiftRecord(MesOrg mesOrg) {
try {
List<MesOrg> mesOrgList= mesOrgService.queryMesOrg(mesOrg);
return ResultBean.success("查询成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(mesOrgList);
} catch (ImppBusiException e) {
return ResultBean.fail(e).build();
} catch (Exception e) {
return ResultBean.fail(e);
}
}
}

@ -18,6 +18,7 @@ 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.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -82,7 +83,9 @@ public class MesReworkTaskController {
@ApiOperation(value = "装配件查询")
public ResultBean assemblyQuery(MesReworkTaskRequestModel requestModel) {
// 数据校验
ValidatorBean.checkNotNull(requestModel.getCustSn(), "客户条码不能为空");
if (StringUtils.isEmpty(requestModel.getCustSn())) {
ResultBean.success("返工成功").setResultObject(null);
}
/*ValidatorBean.checkNotNull(requestModel.getPartNo(), "零件号不能为空");*/
try {
List<MesProductionAssembly> mesProductionRecords = mesReworkTaskService.assemblyQuery(requestModel);
@ -117,7 +120,7 @@ public class MesReworkTaskController {
@ApiOperation(value = "返工成功")
public ResultBean reworkSuccess(MesReworkTaskRequestModel requestModel) {
// 数据校验
ValidatorBean.checkNotNull(requestModel.getSn(), "条码不能为空");
//ValidatorBean.checkNotNull(requestModel.getSn(), "条码不能为空");
try {
mesReworkTaskService.reworkSuccess(requestModel);
return ResultBean.success("返工成功");

@ -65,7 +65,7 @@ public class MesWorkOrderController {
@ApiOperation(value = "生产报工")
public ResultBean doProductReport(@RequestBody List<MesProduceSn> mesProduceSnList) {
try {
workOrderService.doProductReport(mesProduceSnList);
//workOrderService.doProductReport(mesProduceSnList);
return ResultBean.success("操作成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException e) {

@ -0,0 +1,40 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
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 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;
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/test")
public class TestController {
@Autowired
private IMesEquipmentLogExtService mesEquipmentLogExtService;
@GetMapping("/equipment/log/query")
@ApiOperation(value = "查询设备交互")
public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) {
try {
List<MesEquipmentLog> equipmentLogList = mesEquipmentLogExtService.getEquipmentLogList(organizeCode, equipId);
return ResultBean.success("查询成功").setResultList(equipmentLogList);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -9,9 +9,9 @@ import java.util.List;
public interface IMesNcProcessingDao {
@ApiOperation(value = "查询返工返修数据")
int queryDefectRecordByPagerCount(String partNo, String lot, String org);
int queryDefectRecordByPagerCount(String partNo, String lotNo, String org);
@ApiOperation(value = "查询停工统计数据")
List<MesNcProcessingPartAndLotModel> queryDefectRecordByPager(String partNo, String lot, String org, Pager pager);
List<MesNcProcessingPartAndLotModel> queryDefectRecordByPager(String partNo, String lotNo, String org, Pager pager);
}

@ -21,7 +21,7 @@ public class MesNcProcessingDao implements IMesNcProcessingDao {
private EntityManager entityManager;
@Override
public int queryDefectRecordByPagerCount(String partNo, String lot, String org) {
public int queryDefectRecordByPagerCount(String partNo, String lotNo, String org) {
StringBuffer hql = new StringBuffer();
hql.append("select count(1) from mes_defect_record as mdr ");
@ -29,9 +29,9 @@ public class MesNcProcessingDao implements IMesNcProcessingDao {
hql.append(" and mdr.isValid = :isValid ");
hql.append(" and mdr.isDeleted = :isDeleted ");
hql.append(" and mdr.part_no = :partNo ");
hql.append(" and mdr.lot = :lot ");
hql.append(" and mdr.lotNo = :lotNo ");
hql.append(" and mdr.nc_type = 0 ");
hql.append(" group by mdr.part_no , mdr.lot ");
hql.append(" group by mdr.part_no , mdr.lotNo ");
Query query = entityManager.createNativeQuery(hql.toString());
@ -47,17 +47,17 @@ public class MesNcProcessingDao implements IMesNcProcessingDao {
}
@Override
public List<MesNcProcessingPartAndLotModel> queryDefectRecordByPager(String partNo, String lot, String org, Pager pager) {
public List<MesNcProcessingPartAndLotModel> queryDefectRecordByPager(String partNo, String lotNo, String org, Pager pager) {
StringBuffer hql = new StringBuffer();
hql.append("select mdr.part_no ,mdr.part_name , mdr.lot from mes_defect_record as mdr ");
hql.append("select mdr.part_no ,mdr.part_name , mdr.lotNo from mes_defect_record as mdr ");
hql.append(" where mdr.organizeCode = :organizeCode ");
hql.append(" and mdr.isValid = :isValid ");
hql.append(" and mdr.isDeleted = :isDeleted ");
hql.append(" and mdr.part_no = :partNo ");
hql.append(" and mdr.lot = :lot ");
hql.append(" and mdr.lotNo = :lotNo ");
hql.append(" and mdr.nc_type = 0 ");
hql.append(" group by mdr.part_no ,mdr.part_name , mdr.lot ");
hql.append(" group by mdr.part_no ,mdr.part_name , mdr.lotNo ");
Query query = entityManager.createNativeQuery(hql.toString());
@ -83,7 +83,7 @@ public class MesNcProcessingDao implements IMesNcProcessingDao {
String defectLot = String.valueOf(cells[2]);
model.setPartNo(defectPartNo);
model.setPartName(defectPartName);
model.setLot(defectLot);
model.setLotNo(defectLot);
modelList.add(model);
}
return modelList;

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesOrgService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesOrg;
import cn.estsh.i3plus.pojo.mes.repository.MesOrgRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Description:
* @Author: gsz
* @Date: 2024/6/5 10:16
* @Modify:
*/
@Service
@Slf4j
public class MesOrgServiceImpl implements IMesOrgService {
@Autowired
private MesOrgRepository mesOrgRDao;
@Override
public List<MesOrg> queryMesOrg(MesOrg bean) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(bean.getInventoryLocationCode(), "inventoryLocationCode", packBean);
if(StringUtil.isEmpty(bean.getResponsibleParty())){
DdlPreparedPack.getIsNotNull( "responsibleParty", packBean);
}else {
DdlPreparedPack.getStringEqualPack(bean.getResponsibleParty(), "responsibleParty", packBean);
}
packBean.setOrderByStr(bean.orderBy());
return mesOrgRDao.findByHqlWhere(packBean);
}
}

@ -80,6 +80,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
if (mesReworkTask.getSn() != null) {
DdlPreparedPack.getStringEqualPack(mesReworkTask.getSn(), "sn", packBean);
}
DdlPreparedPack.getStringEqualPack(mesReworkTask.getReworkOrder(), "reworkOrder", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.REWORK_TASK_STATUS.CREATE.getValue(), "status", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
@ -267,7 +268,12 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
private MesReworkTask getMesReworkTask(MesReworkTaskRequestModel requestModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(requestModel.getSn(), "sn", packBean);
if (!StringUtils.isEmpty(requestModel.getSn())) {
DdlPreparedPack.getStringEqualPack(requestModel.getSn(), "sn", packBean);
}
if (!StringUtils.isEmpty(requestModel.getReworkOrder())) {
DdlPreparedPack.getStringEqualPack(requestModel.getReworkOrder(), "reworkOrder", packBean);
}
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.REWORK_TASK_STATUS.CREATE.getValue(), "status", packBean);
MesReworkTask res = mesReworkTaskRepository.getByProperty(packBean);

@ -108,7 +108,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
} else {
// 数据校验
ValidatorBean.checkNotNull(inputModel.getPartNo(), "物料不能为空");
ValidatorBean.checkNotNull(inputModel.getLot(), "批次不能为空");
ValidatorBean.checkNotNull(inputModel.getLotNo(), "批次不能为空");
ValidatorBean.checkNotNull(inputModel.getFrontBack(), "正反面不能为空");
ValidatorBean.checkNotNull(inputModel.getQty(), "数量不能为空");
@ -408,7 +408,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
//根据扫描的条码查询条码是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getStringEqualPack(inputModel.getPartNo(), "partNo", packBean);
DdlPreparedPack.getStringEqualPack(inputModel.getLot(), "lot", packBean);
DdlPreparedPack.getStringEqualPack(inputModel.getLotNo(), "lotNo", packBean);
DdlPreparedPack.getNumEqualPack(inputModel.getQty(), "qty", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_INSPECTION_SOURCE_TYPE.LOT.getValue(), "sourceType", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
@ -547,7 +547,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
partInspection.setInspectionStatus(inspectionStatus);
partInspection.setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.CREATE.getValue());
partInspection.setSn(model.getSn());
partInspection.setLot(model.getLot());
partInspection.setLotNo(model.getLotNo());
partInspection.setQty(model.getQty());
partInspection.setWorkCenterCode(model.getWorkCenterCode());
partInspection.setShiftCode(model.getShiftCode());

@ -98,7 +98,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
DdlPreparedPack.getStringEqualPack(partInspection.getSn(), "sn", packBean);
DdlPreparedPack.getStringEqualPack(partInspection.getPartNo(), "partNo", packBean);
DdlPreparedPack.getStringLikerPack(partInspection.getPartName(), "partName", packBean);
DdlPreparedPack.getStringEqualPack(partInspection.getLot(), "lot", packBean);
DdlPreparedPack.getStringEqualPack(partInspection.getLotNo(), "lotNo", packBean);
DdlPreparedPack.getNumEqualPack(partInspection.getQty(), "qty", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_INSPECTION_STATUS.FAIL.getValue(), "inspectionStatus", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
@ -148,11 +148,11 @@ public class MesNcProcessingService implements IMesNcProcessingService {
}
@Override
public ListPager<MesNcProcessingPartAndLotModel> queryPartLot(String partNo, String lot, String org, Pager pager) {
public ListPager<MesNcProcessingPartAndLotModel> queryPartLot(String partNo, String lotNo, String org, Pager pager) {
pager = PagerHelper.getPager(pager, ncProcessingDao.queryDefectRecordByPagerCount(partNo, lot, org));
pager = PagerHelper.getPager(pager, ncProcessingDao.queryDefectRecordByPagerCount(partNo, lotNo, org));
List<MesNcProcessingPartAndLotModel> modelList = ncProcessingDao.queryDefectRecordByPager(partNo, lot, org, pager);
List<MesNcProcessingPartAndLotModel> modelList = ncProcessingDao.queryDefectRecordByPager(partNo, lotNo, org, pager);
return new ListPager(modelList, pager);
}
@ -165,14 +165,14 @@ public class MesNcProcessingService implements IMesNcProcessingService {
MesDefectType person = model.getPerson();
//保存数据
saveDate(model, model.getPart(), type, person, org);
saveDate(model, model.getPart(), type, person, org,model.getAreaCode());
} else {
Integer type = model.getType();
MesDefectType person = model.getPerson();
//保存数据
saveDate(model, model.getPart(), type, person, org);
saveDate(model, model.getPart(), type, person, org,model.getAreaCode());
}
}
@ -320,7 +320,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
* @param person
* @param org
*/
private void saveDate(MesNcProcessingInputModel model, MesPartSap part, Integer type, MesDefectType person, String org) {
private void saveDate(MesNcProcessingInputModel model, MesPartSap part, Integer type, MesDefectType person, String org,String areaCode) {
if (type == MesExtEnumUtil.NC_TYPE.NORMAL.getValue()) {
@ -337,14 +337,15 @@ public class MesNcProcessingService implements IMesNcProcessingService {
ConvertBean.serviceModelUpdate(sn, AuthUtil.getSessionUser().getUserName());
partInspectionRepository.save(model.getPartInspection());
//移库 转正常
//移库 转正常、放行8000移至2000
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org);
moveRepository.save(move);
} else if (type == MesExtEnumUtil.NC_TYPE.REWORK.getValue()) {
//生成返工单
//生成返工单 根据责任方库区对应关系选择哪个责任方就移动到哪个库区8000移至8002/8003
GenSerialNoModel serialNoModel = new GenSerialNoModel("NC_REWORK");
serialNoModel.setPartNo(part.getPartNo());
ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, AuthUtil.getSessionUser().getUserName(), org, 1);
@ -386,6 +387,9 @@ public class MesNcProcessingService implements IMesNcProcessingService {
model.getPartInspection().setReworkTaskId(reworkTask.getId());
partInspectionRepository.save(model.getPartInspection());
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
moveRepository.save(move);
} else if (type == MesExtEnumUtil.NC_TYPE.SCRAP.getValue()) {
//更新条码质量状态
@ -401,8 +405,9 @@ public class MesNcProcessingService implements IMesNcProcessingService {
ConvertBean.serviceModelUpdate(sn, AuthUtil.getSessionUser().getUserName());
partInspectionRepository.save(model.getPartInspection());
//移库 转报废
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "SCRAP"), org);
//移库 转报废 根据责任方库区对应关系的主数据选择哪个责任方就移动到哪个库区8000移至8002/8003
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "SCRAP"), org);
moveRepository.save(move);
} else if (type == MesExtEnumUtil.NC_TYPE.RELEASE.getValue()) {
@ -421,7 +426,8 @@ public class MesNcProcessingService implements IMesNcProcessingService {
partInspectionRepository.save(model.getPartInspection());
//移库 转正常
//移库 转正常、放行8000移至2000
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org);
moveRepository.save(move);

@ -45,7 +45,11 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
//实例化排序线加工规则与装配件数据记录
List<MesProdRuleContext> prodRuleContextList = new ArrayList<>();
productionPartContextList.forEach(o -> prodRuleContextList.add(createSortProdRuleContext(o, assemblyDataMap)));
//实例化排序线加工规则与装配件数据记录
for (int i = 0; i < productionPartContextList.size(); i ++) {
prodRuleContextList.add(createSortProdRuleContext(productionPartContextList.get(i).foreignKey(i + 1), assemblyDataMap));
}
return prodRuleContextList;
@ -70,21 +74,46 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
if (StringUtils.isEmpty(prodRuleContext.getOrganizeCode()) || StringUtils.isEmpty(prodRuleContext.getEquipmentCode())) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(prodRuleContext.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(prodRuleContext.getEquipmentCode(), MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
//outPartNo与outPartNos 带入条件必须互斥 , 此处查询时不作判断
DdlPreparedPack.getStringEqualPack(prodRuleContext.getOutPartNo(), MesPcnExtConstWords.OUT_PART_NO, packBean);
DdlPreparedPack.getInPackList(prodRuleContext.getOutPartNoList(), MesPcnExtConstWords.OUT_PART_NO, packBean);
if (prodRuleContext.getInPartIsEmpty()) {
//进料为NULL
DdlPreparedPack.getIsNull(MesPcnExtConstWords.IN_PART_NO, packBean);
DdlPreparedPack.getIsNull(MesPcnExtConstWords.IN_PART_NO_RULE, packBean);
} else {
//inPartNo与inPartNos 带入条件必须互斥 , 此处查询时不作判断
DdlPreparedPack.getStringEqualPack(prodRuleContext.getInPartNo(), MesPcnExtConstWords.IN_PART_NO, packBean);
DdlPreparedPack.getInPackList(prodRuleContext.getInPartNoList(), MesPcnExtConstWords.IN_PART_NO, packBean);
//进料规则有值
if (prodRuleContext.getInPartRuleIsNotEmpty()) DdlPreparedPack.getIsNotNull(MesPcnExtConstWords.IN_PART_NO_RULE, packBean);
}
if (prodRuleContext.getInPartNoIsEmpty()) DdlPreparedPack.getIsNull(MesPcnExtConstWords.IN_PART_NO, packBean);
else DdlPreparedPack.getStringEqualPack(prodRuleContext.getInPartNo(), MesPcnExtConstWords.IN_PART_NO, packBean);
return prodRuleNoSortCfgRepository.findByHqlWhere(packBean);
if (prodRuleContext.getInPartNoRuleIsEmpty()) DdlPreparedPack.getIsNull(MesPcnExtConstWords.IN_PART_NO_RULE, packBean);
else DdlPreparedPack.getIsNotNull(MesPcnExtConstWords.IN_PART_NO_RULE, packBean);
}
return prodRuleNoSortCfgRepository.findByHqlWhere(packBean);
//【非排序线】获取产品加工规则
@Override
public List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(MesProdRuleContext... prodRuleContexts) {
if (null == prodRuleContexts) return null;
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = null;
for (MesProdRuleContext prodRuleContext : prodRuleContexts) {
if (null == prodRuleContext) continue;
List<MesProdRuleNosortCfg> itemList = getProdRuleNosortCfgList(prodRuleContext);
if (CollectionUtils.isEmpty(itemList)) continue;
if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) prodRuleNosortCfgList = new ArrayList<>();
prodRuleNosortCfgList.addAll(itemList);
}
return prodRuleNosortCfgList;
}
//【非排序线】获取产品加工规则对应的装配件信息
@Override
public MesProdRuleContext getProdRuleContext(MesProdRuleNosortCfg prodRuleNosortCfg, MesProductionPartContext productionPartContext) {
MesProdRuleContext prodRuleContext = new MesProdRuleContext().foreignKey(productionPartContext.getForeignKey()).pid(prodRuleNosortCfg.getId());
public MesProdRuleContext getProdRuleContext(MesProdRuleNosortCfg prodRuleNosortCfg, Integer foreignKey) {
MesProdRuleContext prodRuleContext = new MesProdRuleContext().foreignKey(foreignKey).pid(prodRuleNosortCfg.getId());
BeanUtils.copyProperties(prodRuleNosortCfg, prodRuleContext);
//获取非排序装配件配置信息
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == prodRuleContext.getIsHasBind()) prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblyNosortContextList(prodRuleContext.getOrganizeCode(), prodRuleContext.getPid()));

@ -13,7 +13,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
@Slf4j
@ -29,12 +32,15 @@ public class MesProduceSnExtService implements IMesProduceSnExtService {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(productSnList)) return null;
productSnList = productSnList.size() == 1 ? productSnList : productSnList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean);
else DdlPreparedPack.getInPackList(productSnList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()), MesPcnExtConstWords.PRODUCT_SN, packBean);
else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean);
//根据创建时间倒叙查询零件条码
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
//相同零件条码可能会存在多条数据, 所以去重
return distinctProduceSnList(produceSnRepository.findByHqlWhere(packBean));
}
@ -43,14 +49,4 @@ 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 Map<String, MesProduceSn> getProduceSnMap(String organizeCode, List<String> productSnList) {
return groupProduceSnList(getProduceSnList(organizeCode, productSnList));
}
private Map<String, MesProduceSn> groupProduceSnList(List<MesProduceSn> produceSnDataList) {
return CollectionUtils.isEmpty(produceSnDataList) ? null : produceSnDataList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o));
}
}

@ -96,11 +96,8 @@ public class MesWorkOrderService implements IMesWorkOrderService {
@Override
public void doProductReport(List<MesProduceSn> mesProduceSnList) {
//新增初始化
String organizeCode = AuthUtil.getOrganizeCode();
String userName = AuthUtil.getSessionUser().getUserName();
public void doProductReport(List<MesProduceSn> mesProduceSnList, String organizeCode, String userName) {
//新增初始化 todo
Map<String, List<MesProduceSn>> mesWorkOrderMap = mesProduceSnList.stream().collect(Collectors.groupingBy(MesProduceSn::getPartNo));
Map<String,MesPart> mesPartMap = new HashMap<>();
MesPart mesPart = null;
@ -179,7 +176,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
for (MesBom mesBom : mesBoms) {
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo());
newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartNameRdd());
newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName());
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
newMesProductOffLine.setItemQty(mesBom.getItemQty());

@ -27,7 +27,7 @@ import java.util.stream.Collectors;
@Slf4j
@Service
public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtService {
public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService {
@Autowired
private IConfigService configService;
@ -59,7 +59,7 @@ public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtServi
private Map<String, List<MesConfig>> getConfigMap(List<MesConfig> configList, String cfgType) {
List<MesConfig> filterList = CollectionUtils.isEmpty(configList) ? null :
configList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCfgType()) && !StringUtils.isEmpty(o.getCfgKey()) && o.getCfgType().equals(MesPcnExtConstWords.RW_API_CFG))).collect(Collectors.toList());
configList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCfgType()) && !StringUtils.isEmpty(o.getCfgKey()) && o.getCfgType().equals(cfgType))).collect(Collectors.toList());
return CollectionUtils.isEmpty(filterList) ? null : filterList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesConfig::getCfgKey));
}

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Primary
@Service
public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDispatchService {
@Override
public List<?> matchNumberRule(String organizeCode, String sn, List<?> numberRuleList) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(sn) || CollectionUtils.isEmpty(numberRuleList)) return null;
List<Object> resultList = new ArrayList<>();
if (numberRuleList.get(0) instanceof MesProdRuleNosortCfg) numberRuleList.forEach(o -> matchNumberRule(organizeCode, sn, resultList, o, "mesNumberRuleMatchRegularExpressionService", ((MesProdRuleNosortCfg) o).getInPartNoRule()));
return resultList;
}
private void matchNumberRule(String organizeCode, String sn, List<Object> resultList, Object o, String strategyClass, Object... params) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(sn) || StringUtils.isEmpty(strategyClass) || null == o) return;
Boolean result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean(strategyClass)).matchNumberRule(organizeCode, sn, o, params);
if (result) resultList.add(o);
}
}

@ -0,0 +1,25 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
*
*/
@Slf4j
@Service
public class MesNumberRuleMatchRegularExpressionService implements IMesNumberRuleMatchDispatchService {
@Override
public Boolean matchNumberRule(String organizeCode, String sn, Object... params) {
String matchRule = (String) params[0];
return true;
}
}

@ -1,5 +1,6 @@
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.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
@ -29,12 +30,18 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Override
public void init(StationRequestBean reqBean) {
/**
*
*/
StationResultBean resultBean = getStationResultBean(reqBean);
List<List<StationKvBean>> moduleContentContext = mesProductionDispatchContextStepService.getModuleContentContext(reqBean);
StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext);
StationResultBean resultBean1 = getStationResultBean1(reqBean);
@ -44,62 +51,17 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
this.sendMessage(reqBean, resultBean);
this.sendMessage(reqBean, resultBean);
}
private StationResultBean getStationResultBean(StationRequestBean reqBean) {
private StationResultBean getStationResultBean(StationRequestBean reqBean, List<List<StationKvBean>> moduleContentContext) {
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<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);
List<StationKvBean> stationKvBeans3 = new ArrayList<>();
StationKvBean stationKvBean7 = new StationKvBean();
@ -115,7 +77,7 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
stationKvBeans3.add(stationKvBean8);
resultBean.setResultObj(stationKvBeans3);
resultBean.setResultList(stationKvBeansList);
resultBean.setResultList(moduleContentContext);
return resultBean;
}

@ -115,30 +115,29 @@ 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()));
//验证装配件条码的有效性
if (stepResult.isCompleted()) matchAssemblySnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
//匹配读取的装配件的有效性
return matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult matchAssemblySnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//匹配读取的装配件的有效性
private StepResult matchAssemblySnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]装配件条码,持续监听中...", cellEquipContext.getEquipmentCode()));
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.ASSEMBLY.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的装配件条码,持续监听中...", cellEquipContext.getEquipmentCode()));
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.saveScanAssemblySnContext(reqBean, equipVariableCollectContextList);

@ -37,7 +37,7 @@ public class MesAssemblyScanStepService extends BaseStepService {
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描装配件条码!");
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描装配件条码!");
}
@ -48,11 +48,12 @@ public class MesAssemblyScanStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描装配件条码!");
if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描装配件条码!");
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
@ -64,6 +65,9 @@ public class MesAssemblyScanStepService extends BaseStepService {
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息装配件条码[%s]!", scanInfo));
}

@ -1,27 +1,30 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdRuleCfgExtService;
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.*;
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.PojoAttrUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
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.BeanUtils;
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.*;
import java.util.stream.Collectors;
/**
@ -42,7 +45,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
private IMesProdRuleCfgExtService prodRuleCfgExtService;
@Autowired
private IMesProduceSnExtService produceSnExtService;
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -69,134 +72,267 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文读/扫主条码信息集合
List<MesEquipVariableCollectContext> scanProductSnList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//根据现有数据【产出零件数据】【读/扫主条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, scanProductSnList);
Integer initSize = prodRuleContextList.size();
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
if (prodRuleContextList.size() != initSize) productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
//显示装配件信息
showProductionAssembly(reqBean, resultBean, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList);
return stepResult;
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "装配件扫描项已查询完毕,请查看!");
}
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
//没有【产出零件数据】【读/扫主条码信息】,则直接跳过 【当前场景是直接匹配装配件规则来获取产品加工规则】
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(scanProductSnList)) return;
//如果已经通过主条码条件获取了产品加工规则数据,如果当前上下文没有【读/扫主条码信息】,则直接跳过
if (!CollectionUtils.isEmpty(prodRuleContextList) && !StringUtils.isEmpty(prodRuleContextList.get(0).getProductSn()) && CollectionUtils.isEmpty(scanProductSnList)) return;
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前场景是直接匹配装配件规则来获取产品加工规则】
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return;
//根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
if (CollectionUtils.isEmpty(productionPartContextList)) doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, scanProductSnList);
if (CollectionUtils.isEmpty(productionPartContextList)) doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPsInContextList);
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
else doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, scanProductSnList);
else doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
}
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
private void doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//加工规则的数据已与产出零件的数量一致
if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return;
//已获取的加工规则数据根据关联键分组
Map<String, MesProdRuleContext> prodRuleContextMap = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o));
//拿到当前最大的foreignKey
Optional<MesProductionPartContext> maxForeignKeyOptional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPartContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
//上下文当前存在【读/扫主条码信息】, 后面匹配成功的信息会从scanProductSnList中remove掉,所以需要一个标志判断循环是否结束
Boolean isExistPs = CollectionUtils.isEmpty(scanProductSnList) ? false : true;
//搜集未匹配规则的产出零件
List<String> outPartNoList = productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
for (MesProductionPartContext productionPartContext : productionPartContextList) {
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
if (CollectionUtils.isEmpty(productionPsInContextList)) doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
else doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
}
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty());
//根据产出零件分组数据
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
if (null == productionPartContext) continue;
for (MesProductionPartContext productionPartContext : productionPartContextList) {
if (StringUtils.isEmpty(productionPartContext.getForeignKey())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("上下文中的产出零件信息数据异常,缺失数据关联键! 数据详情:[%s]", JSONObject.toJSONString(productionPartContext)));
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPartContext || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
//当前上下文中的【读/扫主条码信息】已经全部匹配完成
if (isExistPs && CollectionUtils.isEmpty(scanProductSnList)) break;
List<MesProdRuleNosortCfg> filterList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件[空]进料零件规则[空]的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
//当前产出零件已获取过加工规则
if (!CollectionUtils.isEmpty(prodRuleContextMap) && prodRuleContextMap.containsKey(productionPartContext.getForeignKey())) continue;
//【非排序线】获取产品加工规则对应的装配件信息
if (prodRuleNosortCfgList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(prodRuleNosortCfgList.get(0), productionPartContext.foreignKey(foreignKey += 1).getForeignKey()));
//根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
if (CollectionUtils.isEmpty(scanProductSnList)) doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContext);
//根据【读/扫主条码信息】获取匹配当前产出零件的加工规则数据
else doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContext, scanProductSnList);
if (prodRuleNosortCfgList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", prodRuleNosortCfgList.size(), JSONObject.toJSONString(productionPartContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
//没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null);
//拿到当前最大的foreignKey
Optional<MesProductionPsInContext> maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
List<MesProdRuleNosortCfg> filterList;
//搜集进料零件号匹配的产品加工规则
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) filterList = filterProdRuleNosortCfgList(prodRuleNosortCfgList, productionPsInContext.getPartNo());
//进料零件条码匹配进料零件规则
else filterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(prodRuleNosortCfgList));
if (CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]进料零件%s的配置信息",
cellEquipContext.getEquipmentCode(), !StringUtils.isEmpty(productionPsInContext.getPartNo()) ? String.format("号匹配[%s]", productionPsInContext.getPartNo()) : String.format("规则匹配[%s]", productionPsInContext.getProductSn())));
//【非排序线】获取产品加工规则对应的装配件信息
if (filterList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(filterList.get(0), productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()));
if (filterList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", filterList.size(), JSONObject.toJSONString(productionPsInContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
//根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, MesProductionPartContext productionPartContext) {
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNo(productionPartContext.getPartNo()).inPartNoIsEmpty().inPartNoRuleIsEmpty());
if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件为空的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
if (prodRuleNosortCfgList.size() > 1) return;
//【非排序线】获取产品加工规则对应的装配件信息
MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleContext(prodRuleNosortCfgList.get(0), productionPartContext);
prodRuleContextList.add(prodRuleContext);
private List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件可能携带产出零件
List<String> inPartNoList = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList());
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && StringUtils.isEmpty(o.getPartNo()))).findFirst();
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(
!CollectionUtils.isEmpty(inPartNoList) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartNos(inPartNoList).outPartNos(outPartNoList) : null,
(null != optional && optional.isPresent()) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartRuleIsNotEmpty().outPartNos(outPartNoList) : null);
return prodRuleNosortCfgList;
}
//根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
private void doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList);
//根据产出零件分组数据
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
for (MesProductionPartContext productionPartContext : productionPartContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPartContext || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
//查询【读/扫主条码信息】
Map<String, MesProduceSn> produceSnDataMap = produceSnExtService.getProduceSnMap(reqBean.getOrganizeCode(), scanProductSnList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()));
//获取匹配产出零件的所有加工规则
List<MesProdRuleNosortCfg> outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
MesProdRuleNosortCfg filter = null;
for (MesEquipVariableCollectContext equipVariableCollectContext : scanProductSnList) {
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
if (null == equipVariableCollectContext) continue;
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
MesProduceSn produceSnData = CollectionUtils.isEmpty(produceSnDataMap) ? null : produceSnDataMap.get(equipVariableCollectContext.getEquipVariableValue());
List<MesProdRuleNosortCfg> innerfilterList;
//搜集进料零件号匹配的产品加工规则
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) innerfilterList = filterProdRuleNosortCfgList(outPartNoProdRuleList, productionPsInContext.getPartNo());
//进料零件条码匹配进料零件规则
else innerfilterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(outPartNoProdRuleList));
if (null != produceSnData) {}
else {
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue;
productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey());
filter = innerfilterList.get(0);
break;
}
if (null == filter) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]匹配任意一个主条码的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartName()));
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(filter, productionPartContext.getForeignKey()));
}
//【非排序线】获取产品加工规则
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()));
// if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件为空的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
if (prodRuleNosortCfgList.size() > 1) return;
}
//搜集进料零件号匹配的产品加工规则
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList, String partNo) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNo()) && o.getInPartNo().equals(partNo))).collect(Collectors.toList());
}
//搜集进料零件规则有值的产品加工规则
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNoRule()))).collect(Collectors.toList());
}
//根据产出零件分组数据
private Map<String, List<MesProdRuleNosortCfg>> groupProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProdRuleNosortCfg::getOutPartNo));
}
//显示装配件信息
private Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList) {
//根据【读/扫主条码信息】获取匹配当前产出零件的加工规则数据
private void doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, MesProductionPartContext productionPartContext, List<MesEquipVariableCollectContext> scanProductSnList) {
Map<Integer, MesProductionPartContext> productionPartMap = productionPartContextList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));
List<AttrBean> attrBeanList = null;
for (MesEquipVariableCollectContext equipVariableCollectContext : scanProductSnList) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == equipVariableCollectContext) continue;
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
String workOrderNo = getWorkOrderNo(productionPartMap, prodRuleContext.getForeignKey());
//封装匹配当前设备的装配件信息
List<MesAssemblyShowContext> assemblyShowContextList = getAssemblyShowContextList(cellEquipContext, prodRuleContext.getAssemblyDataContext(workCenter), prodRuleContext, workOrderNo);
if (CollectionUtils.isEmpty(assemblyShowContextList)) continue;
//装配件清单列表标题
if (CollectionUtils.isEmpty(attrBeanList)) attrBeanList = dataAttrList(workOrderNo);
//封装多表格
resultBean.addStationResultBeans(new StationResultBean().dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue()).dataAttrList(attrBeanList).resultList(assemblyShowContextList));
}
}
if (CollectionUtils.isEmpty(resultBean.getStationResultBeans())) return false;
resultBean.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue());
this.sendMessage(reqBean, resultBean);
return true;
}
private String getWorkOrderNo(Map<Integer, MesProductionPartContext> productionPartMap, Integer foreignKey) {
return (!CollectionUtils.isEmpty(productionPartMap) && productionPartMap.containsKey(foreignKey)) ? productionPartMap.get(foreignKey).getWorkOrderNo() : null;
}
//封装匹配当前设备的装配件信息
private List<MesAssemblyShowContext> getAssemblyShowContextList(MesCellEquipContext cellEquipContext, List<MesProductionAssemblyContext> productionAssemblyContextList, MesProdRuleContext prodRuleContext, String workOrderNo) {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null;
List<MesAssemblyShowContext> assemblyShowContextList = new ArrayList<>();
for (MesProductionAssemblyContext item : productionAssemblyContextList) {
if (null == item) continue;
assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo));
}
assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList());
return assemblyShowContextList;
}
//封装装配件信息
private MesAssemblyShowContext assemblyShowContext(MesProductionAssemblyContext o, MesProdRuleContext prodRuleContext, String workOrderNo) {
MesAssemblyShowContext assemblyShowContext = new MesAssemblyShowContext();
BeanUtils.copyProperties(o, assemblyShowContext);
if (!StringUtils.isEmpty(workOrderNo)) assemblyShowContext.setWorkOrderNo(workOrderNo);
assemblyShowContext.setPartNo(prodRuleContext.getOutPartNo());
if (StringUtils.isEmpty(assemblyShowContext.getRouteSeq())) assemblyShowContext.setRouteSeq(MesPcnExtConstWords.ZERO);
if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() == assemblyShowContext.getAssemblyStatus() && (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == assemblyShowContext.getMatchType() ||
MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == assemblyShowContext.getMatchType())) assemblyShowContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue());
assemblyShowContext.setAssemblyStatusName(MesExtEnumUtil.ASSEMBLY_STATUS.valueOfDescription(o.getAssemblyStatus()));
if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() != assemblyShowContext.getAssemblyStatus())
assemblyShowContext.setColor(StringUtils.isEmpty(assemblyShowContext.getShowColor()) ? MesExtEnumUtil.COLOR.GREEN.getValue() : assemblyShowContext.getShowColor());
return assemblyShowContext;
}
//装配件清单列表标题
private List<AttrBean> dataAttrList(String workOrderNo) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号");
if (!StringUtils.isEmpty(workOrderNo)) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.WORK_ORDER_NO, "生产工单编号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NO, "零件编码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NO, "原料编码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NAME, "原料名称");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_SN, "原料条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_STATUS_NAME, "装配状态");
return attrBeanList;
}
}

@ -74,6 +74,8 @@ 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, "显示装配件扫描项成功!");
}

@ -41,6 +41,9 @@ public class MesAssemblyShowStepService extends BaseStepService {
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取排序线的装配件清单
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesAssemblyShowSortStepService")).execute(reqBean);

@ -122,30 +122,29 @@ 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()));
//验证头道模具号的有效性
if (stepResult.isCompleted()) checkFirstMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
//验证头道模具号的有效性
return checkFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult checkFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//验证头道模具号的有效性
private StepResult checkFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]头道模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
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.FIRST_MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
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 firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
@ -227,5 +226,4 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
return dataList;
}
}

@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepSer
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.actor.shipping.dispatch.IFsmCommonService;
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;
@ -22,6 +23,7 @@ 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;
@ -53,6 +55,9 @@ public class MesMouldNoReadStepService extends BaseStepService {
@Autowired
private MesFirstMouldNoReadStepService firstMouldNoReadStepService;
@Autowired
private IFsmCommonService fsmCommonService;
@Override
public StepResult init(StationRequestBean reqBean) {
@ -115,29 +120,31 @@ 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);
//验证模具号的有效性
if (stepResult.isCompleted()) checkMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
checkMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//保存设备当前一轮工序的模具号
if (null != stepResult.getObj()) productionDispatchContextStepService.saveMouldNoContext(reqBean, (MesEquipVariableCollectContext) stepResult.getObj());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
}
private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//验证上下文产出零件信息是否存在
Boolean productionPartContextIsExist = productionDispatchContextStepService.checkProductionPartIsExistContext(reqBean);
//未知腔数[工位参数]
String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG);
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue() && (equipLogDispatchContext.getNeedNewValue() || !productionPartContextIsExist))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
if (!equipLogDispatchContext.getIsCollectValue() && (equipLogDispatchContext.getNeedNewValue() || (!productionPartContextIsExist && StringUtils.isEmpty(cavityUnknownCfg))))
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);
else if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]模具号,接口逻辑设置只读一次,当前读取模具号直接跳过!", cellEquipContext.getEquipmentCode()));
@ -145,8 +152,9 @@ public class MesMouldNoReadStepService extends BaseStepService {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据: 设置常变值 或者 当前没有头道模具号或生产工单信息
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && (equipLogDispatchContext.getNeedNewValue() || !productionPartContextIsExist))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && (equipLogDispatchContext.getNeedNewValue() || (!productionPartContextIsExist && StringUtils.isEmpty(cavityUnknownCfg))))
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);
else if (CollectionUtils.isEmpty(equipVariableCollectContextList)) //非常变值 没有有效的数据 也无需再读
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,接口逻辑设置只读一次,当前读取模具号直接跳过!", cellEquipContext.getEquipmentCode()));
@ -159,8 +167,8 @@ public class MesMouldNoReadStepService extends BaseStepService {
//将模具信息放到工步结果对象的中, 工步主方法体会从里面取出
stepResult.obj(equipVariableCollectContextList.get(0));
//判断是否存在产出零件信息
if (!productionPartContextIsExist) doHandleFirstMouldNo(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, mouldNo);
//判断是否存在产出零件信息 或者 工位参数没有配置未知腔数
if (!productionPartContextIsExist && StringUtils.isEmpty(cavityUnknownCfg)) doHandleFirstMouldNo(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, mouldNo);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]模具号信息[%s]!", cellEquipContext.getEquipmentCode(), mouldNo));

@ -11,6 +11,7 @@ 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.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
@ -91,6 +92,7 @@ public class MesMouldRecordGenerateStepService extends BaseStepService {
MesProdMouldRecord mesProductionRecord = getMesProdMouldRecord(mesCellEquipContext, mouldNo, mesMouldMappingCfg);
ConvertBean.serviceModelInitialize(mesProductionRecord, reqBean.getUserInfo());
mesProdMouldRecords.add(mesProductionRecord);
}

@ -0,0 +1,138 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNcProcessingService;
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.model.ActorMessage;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesNcProcessingInputModel;
import cn.estsh.i3plus.mes.pcn.config.SpringExtProvider;
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.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesDefectType;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspection;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
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.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
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.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service
public class MesProductResultErrorHandleStepService extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesNcProcessingService ncProcessingService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
private static final Map<String, ActorRef> refMap = new ConcurrentHashMap<>(200);
@Override
public StepResult execute(StationRequestBean reqBean) {
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
// 获取加工结果
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 如果是报废或者可疑需要编辑条码状态为不合格、并且nc判定需要新增一条记录
if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue(), result)) {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工结果合格,无需记录异常");
}
// 获取条码列表
List<MesProduceSn> mesProduceSns = mesProductionDispatchContextStepService.getOutProduceSnDataContext(reqBean);
// 保存加工异常记录(NC判断记录)
saveProductResultException(reqBean, mesProduceSns, result);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工异常处理成功");
}
/**
*
* @param reqBean
* @param mesProduceSns
*/
private void saveProductResultException(StationRequestBean reqBean, List<MesProduceSn> mesProduceSns, String result) {
String defectTypeCode = MesEnumUtil.DEFECT_TYPE_CODE.DETERMIND.getValue();
mesProduceSns.forEach(mesProduceSn -> {
MesNcProcessingInputModel model = new MesNcProcessingInputModel();
MesDefectType mesDefectType = new MesDefectType();
mesDefectType.setBackDefect(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesDefectType.setDefectTypeCode(defectTypeCode);
mesDefectType.setDefectTypeName(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getDescription());
//mesDefectType.setDefectType(MesExtEnumUtil.MES_DEFECT_TYPE);
model.setSn(mesProduceSn.getProductSn());
model.setPerson(mesDefectType);
MesPartInspection partInspection = new MesPartInspection();
Long id = snowflakeIdMaker.nextId();
partInspection.setWorkCenterCode(reqBean.getWorkCenterCode());
partInspection.setSourceType(MesExtEnumUtil.PART_INSPECTION_SOURCE_TYPE.SINGLE.getValue());
partInspection.setPartNo(mesProduceSn.getPartNo());
partInspection.setPartName(mesProduceSn.getPartName());
partInspection.setDefectTypeCode(mesDefectType.getDefectTypeCode());
partInspection.setInspectionDate(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER));
partInspection.setLotNo(mesProduceSn.getLotNo());
if (!Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
partInspection.setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.SCRAP.getValue());
} else {
partInspection.setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.CREATE.getValue());
}
partInspection.setRejectQty(mesProduceSn.getQty().intValue());
partInspection.setShiftCode(mesProduceSn.getShiftCode());
partInspection.setSn(mesProduceSn.getProductSn());
partInspection.setQty(mesProduceSn.getQty().intValue());
partInspection.setInspectionStatus(MesExtEnumUtil.PART_INSPECTION_STATUS.FAIL.getValue());
partInspection.setId(id);
ConvertBean.serviceModelInitialize(partInspection, reqBean.getUserInfo());
MesPartInspectionDetail mesPartInspectionDetail = new MesPartInspectionDetail();
mesPartInspectionDetail.setPid(id);
mesPartInspectionDetail.setStatus(10);
mesPartInspectionDetail.setDefectTypeCode(mesDefectType.getDefectTypeCode());
mesPartInspectionDetail.setDefectTypeName(mesDefectType.getDefectTypeName());
model.setPartInspection(partInspection);
model.setPartInspectionDetailList(Arrays.asList(mesPartInspectionDetail));
ncProcessingService.saveNc(model, reqBean.getOrganizeCode());
});
}
}

@ -113,30 +113,28 @@ 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()));
//匹配加工结果
matchProductResult(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
//匹配加工结果
return matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult matchProductResult(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
//匹配加工结果
private StepResult matchProductResult(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]加工结果,持续监听中...", cellEquipContext.getEquipmentCode()));
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);
//根据变量类别分组数据
Map<String, List<MesEquipVariableCfgCollectContext>> variableCategoryMap = equipLogDispatchContext.getEquipVariableCfgCollectContextList().stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCfgCollectContext::getVariableCategory));
//根据变量类别分别匹配加工结果
matchVariableCategoryMap(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, variableCategoryMap);
matchVariableCategoryMap(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, variableCategoryMap);
//保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果
if (stepResult.isCompleted()) productionDispatchContextStepService.saveProductResultContext(reqBean, (String) stepResult.getObj());
@ -146,7 +144,7 @@ public class MesProductResultReadStepService extends BaseStepService {
}
//加工结果规则匹配:根据变量类别分组, 只要匹配一组即可; 在一组中根据规则类别分组, 相同规则类别的一组必须全部匹配, 任意一组规则类别匹配成功即可
private StepResult matchVariableCategoryMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
private StepResult matchVariableCategoryMap(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, Map<String, List<MesEquipVariableCfgCollectContext>> variableCategoryMap) {
for (Map.Entry<String, List<MesEquipVariableCfgCollectContext>> entry : variableCategoryMap.entrySet()) {
@ -167,8 +165,10 @@ public class MesProductResultReadStepService extends BaseStepService {
}
//加工结果匹配失败
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]加工结果的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()));
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);
return stepResult.isCompleted(false);
}

@ -0,0 +1,87 @@
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.*;
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.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductSnCheckStepService")
public class MesProductSnCheckStepService 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();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return stepResult;
}
}

@ -22,9 +22,11 @@ import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
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;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
@ -65,15 +67,19 @@ public class MesProductSnGenerateStepService extends BaseStepService {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
// 获取产出零件信息
List<MesProductionPartContext> productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);
if (CollectionUtils.isEmpty(productionPartContextList)) {
foundExThrow(reqBean, "必过工步不允许跳过");
}
// 获取零件号,可能存在多个
List<String> partNoList = productionPartContextList.stream().map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
// 根据零件号组装产品条码信息
List<MesProduceSn> mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList);
List<MesProduceSn> mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList, result);
// 保存条码信息
mesProduceSnRepository.saveAll(mesProduceSns);
// 放到上下文
@ -90,7 +96,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
* @param partNoList
* @return
*/
private List<MesProduceSn> generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List<String> partNoList) {
private List<MesProduceSn> generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List<String> partNoList, String result) {
List<MesProduceSn> mesProduceSns = new ArrayList<>();
for (String partNo : partNoList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
@ -102,7 +108,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
// 根据条码规则生成条码
String sn = generateByRule(mesPart);
// 组装条码信息
MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean);
MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean, result);
ConvertBean.serviceModelInitialize(mesProduceSn, reqBean.getUserInfo());
mesProduceSns.add(mesProduceSn);
}
@ -122,7 +128,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
return resultList.get(0);
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, MesWorkCell mesWorkCell,MesProductionProcessContext productionProcessContext, StationRequestBean reqBean) {
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, MesWorkCell mesWorkCell,MesProductionProcessContext productionProcessContext, StationRequestBean reqBean, String result) {
long serialNum = snowflakeIdMaker.nextId();
MesProduceSn mesProduceSn = new MesProduceSn();
@ -130,7 +136,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
mesProduceSn.setProductSn(sn);
mesProduceSn.setCustSn(sn);
mesProduceSn.setPartNo(mesPart.getPartNo());
mesProduceSn.setPartNameRdd(mesPart.getPartName());
mesProduceSn.setPartName(mesPart.getPartName());
mesProduceSn.setAreaCode(mesWorkCell.getAreaCode());
mesProduceSn.setWorkCenterCode(mesWorkCell.getWorkCenterCode());
mesProduceSn.setWorkCellCode(mesWorkCell.getWorkCellCode());
@ -139,7 +145,13 @@ public class MesProductSnGenerateStepService extends BaseStepService {
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setQty(1d);
mesProduceSn.setSnStatus(10);
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
Integer qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue();
if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue();
} else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue();
}
mesProduceSn.setQcStatus(qcStatus);
mesProduceSn.setLotNo(DateUtil.format(new Date(), "YYYYMMDD"));
mesProduceSn.setRouteCode(reqBean.getRouteCode());
mesProduceSn.setProcessCode(productionProcessContext.getProcessCode());

@ -112,36 +112,37 @@ 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()));
//验证主条码的有效性
if (stepResult.isCompleted()) matchProductSnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
//匹配读取的主条码的有效性
return matchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//匹配读取的主条码的有效性
private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前未读取到设备[%s]主条码,持续监听中...", cellEquipContext.getEquipmentCode()));
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.PRODUCT_SN.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的主条码,持续监听中...", cellEquipContext.getEquipmentCode()));
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);
//读取主条码前置验证
if (!checkReadProductSnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList).isCompleted()) return stepResult;
checkReadProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList);
//保存设备当前一轮工序的待验证的主条码信息
productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
//重新读到信息需要删除历史验证数据, 删除设备当前一轮工序的进料零件条码信息, 不管实际是否已经存在
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
//发送工步内容
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
@ -152,7 +153,7 @@ public class MesProductSnReadStepService extends BaseStepService {
}
//读取主条码前置验证
private StepResult checkReadProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
private void checkReadProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
//剔除finishCode信息
List<MesEquipVariableCollectContext> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).collect(Collectors.toList());
@ -162,18 +163,18 @@ public class MesProductSnReadStepService extends BaseStepService {
//验证是否存在重复条码
if (!CollectionUtils.isEmpty(filterList) && filterList.size() != produceSnCollectMap.size())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前读取到设备[%s]主条码存在重复条码,持续监听中...", cellEquipContext.getEquipmentCode()));
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);
//验证条码数量是否满足腔数
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
if (!CollectionUtils.isEmpty(productionPartContextList) && equipVariableCollectContextList.size() != productionPartContextList.size())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前读取到设备[%s]主条码数量[%s]与产出零件对应的腔数[%s]不一致,持续监听中...", cellEquipContext.getEquipmentCode(), equipVariableCollectContextList.size(), productionPartContextList.size()));
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码数量[%s]与产出零件对应的腔数[%s]不一致,持续监听中...", cellEquipContext.getEquipmentCode(), equipVariableCollectContextList.size(), productionPartContextList.size())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
if (CollectionUtils.isEmpty(productionPartContextList) && equipVariableCollectContextList.size() != cellEquipContext.getCavity())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前读取到设备[%s]主条码数量[%s]与工位设备维护的腔数[%s]不一致,持续监听中...", cellEquipContext.getEquipmentCode(), equipVariableCollectContextList.size(), cellEquipContext.getCavity()));
return stepResult;
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码数量[%s]与工位设备维护的腔数[%s]不一致,持续监听中...", cellEquipContext.getEquipmentCode(), equipVariableCollectContextList.size(), cellEquipContext.getCavity())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}

@ -1,37 +1,218 @@
//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.mes.pcn.serviceimpl.fsm.BaseStepService;
//import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
//import cn.estsh.i3plus.pojo.mes.model.StepResult;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
///**
// * @Description : 扫描主条码工步
// * @Author : wangjie
// **/
//@Slf4j
//@Service("mesProductSnScanStepService")
//public class MesProductSnScanStepService extends BaseStepService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Autowired
// private IMesProductionDispatchContextStepService productionDispatchContextStepService;
//
//
//
// @Override
// public StepResult execute(StationRequestBean reqBean) {
//
// return null;
//
// }
//
//
//
//}
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.*;
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.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductSnScanStepService")
public class MesProductSnScanStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IFsmCommonService fsmCommonService;
@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();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
//当前工位使用的设备
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
//获取上下文产出零件信息
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文扫/读信息:主条码
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
//获取进料主条码数据信息
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//验证扫描信息是否属于工艺跳过码
Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo);
//不属于工艺跳过码时,剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj 为true
if (!isCraftJumpCode && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = removeCraftCheckFailureData(stepResult, productionPsInContextList);
//验证扫描信息属于工艺跳过码的情况下是否支持跳过
Boolean isAllowJump = checkIsAllowJump(reqBean, productionPsInContextList, isCraftJumpCode, scanInfo);
//封装待验证的主条码信息
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, equipVariableCollectContextList, scanInfo);
//先判断前期扫描数量
Integer scanedQty = (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size());
//根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量
Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipmentContext.getCavity();
//扫描信息为空
if (scanedQty.compareTo(needQty) < 0 && StringUtils.isEmpty(scanInfo)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!");
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//验证前期扫描数量是否已超过匹配腔数
checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext);
//扫描信息匹配跳过码, 判断是否允许跳过
if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo));
//验证是否存在重复主条码
if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中存在重复扫描的主条码!", scanInfo));
//允许跳过码 或者 存在 stepResult.obj 则保存进料主条码数据到上下文中
if (isAllowJump || null != stepResult.getObj()) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
//不属于工艺跳过码时, 则保存上下文扫/读信息:主条码
if (!isCraftJumpCode) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
//属于工艺跳过码时并且允许跳过时,直接返回成功
if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo));
//前期扫描数量已等于腔数
if (scanedQty.compareTo(needQty) == 0)
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中的主条码个数[%s]已满足腔数!", scanInfo, scanedQty));
//是否支持混腔扫描[工位参数]
String cavityNosortCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG);
if (StringUtils.isEmpty(cavityNosortCfg)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s]!", scanInfo));
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息主条码[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfo, needQty, needQty - equipVariableCollectContextList.size()));
}
//剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj
private List<MesProductionPsInContext> removeCraftCheckFailureData(StepResult stepResult, List<MesProductionPsInContext> productionPsInContextList) {
Integer sourceSize = productionPsInContextList.size();
productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() < sourceSize) stepResult.obj(true);
return productionPsInContextList;
}
//验证扫描信息属于工艺跳过码的情况下是否支持跳过
private Boolean checkIsAllowJump(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList, Boolean isCraftJumpCode, String scanInfo) {
AtomicReference<Boolean> isAllowJump = new AtomicReference<>(false);
if (CollectionUtils.isEmpty(productionPsInContextList)) return isAllowJump.get();
//修改此前已标记工艺防错结果错误的数据, 标记跳过码
productionPsInContextList.forEach(o -> {
if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) {
o.setCraftJumpCode(scanInfo);
isAllowJump.set(true);
}
});
//不存在错误的数据则返回false
return isAllowJump.get();
}
//验证扫描信息是否属于工艺跳过码
private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) {
if (StringUtils.isEmpty(scanInfo)) return false;
String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE);
if (StringUtils.isEmpty(craftJumpCode)) return false;
return scanInfo.equals(craftJumpCode) ? true : false;
}
//验证前期扫描数量是否已超过匹配腔数
private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPartContext> productionPartContextList, MesCellEquipContext cellEquipmentContext) {
if (scanedQty.compareTo(needQty) <= 0) return;
String message = String.format("请检查相关数据,上下文中的主条码个数[%s]已满足腔数[%s],可重置工位解决!", scanedQty, needQty);
this.sendMessage(reqBean, resultBean, message +
" --- List<MesEquipVariableCollectContext> --- [" + getJsonMessage(equipVariableCollectContextList) + "]" +
" --- List<MesProductionPsInContext> --- [" + getJsonMessage(productionPsInContextList) + "]" +
" --- List<MesProductionPartContext> --- [" + getJsonMessage(productionPartContextList) + "]" +
" --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipmentContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message);
}
//集合判空转JSON
private String getJsonMessage(List list) {
return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list);
}
//封装扫/读信息:主条码信息
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, List<MesEquipVariableCollectContext> equipVariableCollectContextList, String scanInfo) {
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true)));
return equipVariableCollectContextList;
}
//验证是否存在重复主条码
private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList) {
//剔除finishCode信息
List<String> filterList1 = equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
//剔除finishCode信息
List<String> filterList2 = productionPsInContextList.stream().filter(o -> (null != o && !o.getProductSn().equals(productionProcessContext.getFinishCode()))).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList());
List<String> filterList = new ArrayList<>();
if (CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1);
if (CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2);
//验证是否存在重复条码
if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true;
return false;
}
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
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.MesEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
@ -63,6 +64,7 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
mesProduceSns.forEach(mesProduceSn -> {
MesProductionRecord mesProductionRecord = getMesProductionRecord(productionProcessContext, mesProduceSn, reqBean);
ConvertBean.serviceModelInitialize(mesProductionRecord, reqBean.getUserInfo());
mesProductionRecords.add(mesProductionRecord);
});
@ -78,11 +80,17 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
mesProductionRecord.setAreaCode(mesProduceSn.getAreaCode());
mesProductionRecord.setCraftCode(mesProduceSn.getCraftCode());
mesProductionRecord.setCustSn(mesProduceSn.getCustSn());
mesProductionRecord.setEquipmentCode(mesProduceSn.getEquipmentCode());
mesProductionRecord.setProductSn(mesProduceSn.getCustSn());
mesProductionRecord.setEquipmentCode(productionProcessContext.getCurCellEquip().getEquipmentCode());
mesProductionRecord.setEquipmentName(productionProcessContext.getCurCellEquip().getEquipmentName());
mesProductionRecord.setPartNo(mesProduceSn.getPartNo());
mesProductionRecord.setPartName(mesProduceSn.getPartName());
mesProductionRecord.setIsComplete(MesEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesProductionRecord.setCompleteDateTime(DateUtil.formatDateTime(new Date()));
mesProductionRecord.setLotNo(mesProduceSn.getLotNo());
mesProductionRecord.setEquipmentName(mesProduceSn.getEquipmentName());
//mesProductionRecord.setShiftGroup();
//mesProductionRecord.setWorkOrderNo(productionProcessContext.get);
String mouldNo = "";
MesEquipVariableCollectContext mesFirstMouldNoCollectContext = mesProductionDispatchContextStepService.getFirstMouldNoContext(reqBean);
@ -99,7 +107,6 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
mesProductionRecord.setProcessCode(mesProduceSn.getProcessCode());
mesProductionRecord.setReportPartNo(mesProduceSn.getPartNo());
mesProductionRecord.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue());
mesProductionRecord.setReportType(mesProduceSn.getReportType() + "");
mesProductionRecord.setShiftCode(mesProduceSn.getShiftCode());
mesProductionRecord.setShiftGroup(mesProduceSn.getShiftGroup());
mesProductionRecord.setWorkOrderNo(mesProduceSn.getWorkOrderNo());

@ -109,39 +109,34 @@ 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()));
//匹配就绪信号有效性
matchReadySignal(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//保存设备当前一轮工序的就绪信号, 写1
if (stepResult.isCompleted()) productionDispatchContextStepService.saveReadySignalContext(reqBean);
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult;
//匹配就绪信号有效性
return matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
private StepResult matchReadySignal(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
private StepResult matchReadySignal(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]就绪信号,持续监听中...", cellEquipContext.getEquipmentCode()));
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);
//匹配就绪信号有效性
Boolean result = (Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
if (!result) 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);
//匹配成功发送工步内容
if (result) productionDispatchContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
productionDispatchContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//匹配成功
if (result) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]就绪信号信息!", cellEquipContext.getEquipmentCode()));
//保存设备当前一轮工序的就绪信号, 写1
productionDispatchContextStepService.saveReadySignalContext(reqBean);
//匹配失败
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]就绪信号的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]就绪信号信息!", cellEquipContext.getEquipmentCode()));
}

@ -0,0 +1,52 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
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.IMesWorkOrderService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service
public class MesReportGenerateStepService extends BaseStepService {
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Autowired
private IMesWorkOrderService mesWorkOrderService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
private static final Map<String, ActorRef> refMap = new ConcurrentHashMap<>(200);
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
List<MesProduceSn> mesProduceSns = mesProductionDispatchContextStepService.getOutProduceSnDataContext(reqBean);
mesWorkOrderService.doProductReport(mesProduceSns, reqBean.getOrganizeCode(), reqBean.getUserInfo());
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存加工结果成功");
}
}

@ -0,0 +1,102 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
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.model.ActorMessage;
import cn.estsh.i3plus.mes.pcn.config.SpringExtProvider;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
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.concurrent.ConcurrentHashMap;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service
public class MesSaveProcessResultStepService extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private ActorSystem actorSystem;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesVariableWhenFinishedReadStepService mesVariableWhenFinishedReadStepService;
@Autowired
private MesMouldRecordGenerateStepService mesMouldRecordGenerateStepService;
@Autowired
private MesProductSnSaveStepService MesProductSnSaveStepService;
@Autowired
private MesProductionReocrdGenerateStepService mesProductionReocrdGenerateStepService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Autowired
private MesProductResultErrorHandleStepService mesProductResultErrorHandleStepService;
@Autowired
private MesReportGenerateStepService mesReportGenerateStepService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
private static final Map<String, ActorRef> refMap = new ConcurrentHashMap<>(200);
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
/**
*
*/
mesMouldRecordGenerateStepService.execute(reqBean);
/**
*
*/
MesProductSnSaveStepService.execute(reqBean);
/**
*
*/
mesProductionReocrdGenerateStepService.execute(reqBean);
/**
*
*/
mesProductResultErrorHandleStepService.execute(reqBean);
/**
*
*/
mesReportGenerateStepService.execute(reqBean);
mesProductionDispatchContextStepService.deleteFirstMouldNoContext(reqBean);
mesProductionDispatchContextStepService.deleteMouldNoContext(reqBean);
mesProductionDispatchContextStepService.deleteProductResultContext(reqBean);
mesProductionDispatchContextStepService.deleteReadySignalContext(reqBean);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存加工结果成功");
}
}

@ -82,26 +82,26 @@ public class MesSendInitializationCmdStepService extends BaseStepService {
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//发送数据给设备的数据变量
execSendInitializationCmd(reqBean, resultBean, stepResult, cellEquipContext, stepParamMap, equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return stepResult;
//发送数据给设备的数据变量
return execSendInitializationCmd(reqBean, resultBean, stepParamMap, stepResult, cellEquipContext, equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel()));
}
private StepResult execSendInitializationCmd(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext,
Optional<Map<String, MesProdRouteOptParam>> stepParamMap, MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) {
private StepResult execSendInitializationCmd(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult,
MesCellEquipContext cellEquipContext, MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) {
//最大重试次数[工步参数]
Integer maxRetryTimes = getMaxRetryTimes(stepParamMap);
MesEquipVariableRwResult equipVariableRwResult;
for (int i = 1; i <= maxRetryTimes; i ++) {
//写值
equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfg, equipmentVariable, kepwareFlag);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
@ -110,14 +110,18 @@ public class MesSendInitializationCmdStepService extends BaseStepService {
execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:[%s]", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage()));
//每失败一次 睡眠
if (i != maxRetryTimes) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
execSendTaskCompleteAndThrowEx(reqBean, stepResult, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return stepResult;
}
//最大重试次数[工步参数]
private Integer getMaxRetryTimes(Optional<Map<String, MesProdRouteOptParam>> stepParamMap) {
Integer maxRetryTimes = null;
try {

@ -85,23 +85,23 @@ public class MesSendProcessCmdStepService 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);
//发送数据给设备的数据变量
MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel()));
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//保存设备当前一轮工序的发送允许加工指令, 写接口逻辑参考值
if (equipVariableRwResult.getIsSuccessed()) productionDispatchContextStepService.saveSendProcessCmdContext(reqBean, equipmentVariableCfgList.get(0).getValue());
if (!equipVariableRwResult.getIsSuccessed()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
if (!equipVariableRwResult.getIsSuccessed())
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("设备[%s]:允许加工指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return !equipVariableRwResult.getIsSuccessed() ?
execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())) :
execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送成功!", cellEquipContext.getEquipmentCode()));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送成功!", cellEquipContext.getEquipmentCode()));
}

@ -80,6 +80,9 @@ public class MesVariableWhenFinishedReadStepService extends BaseStepService {
.userName(reqBean.getUserInfo())
.build();
// 数据采集信息需要存放到 redis中
// 需要保存磨具号
String key = this.getFsmBusikey(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.name());
ActorRef ref = refMap.computeIfAbsent(key,
k -> actorSystem.actorOf(SpringExtProvider.getInstance().get(actorSystem).create("mesHandlerEquipLogActor"), key));

@ -1,10 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
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.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
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.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
@ -18,7 +15,6 @@ 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 io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -312,31 +308,58 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_ASSEMBLY_SN_CONTEXT);
}
//获取进料主条码数据信息
@Override
public List<MesProductionPsInContext> getProductionPsInContext(StationRequestBean reqBean) {
String productionPsInJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_IN_CONTEXT);
return !StringUtils.isEmpty(productionPsInJson) ? JSONObject.parseArray(productionPsInJson, MesProductionPsInContext.class) : null;
}
//验证上下文进料主条码数据集合是否存在
@Override
public Boolean checkProductionPsInIsExistContext(StationRequestBean reqBean) {
String productionPsInJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_IN_CONTEXT);
return !StringUtils.isEmpty(productionPsInJson) ? true : false;
}
//保存上下文进料主条码数据信息集合 [JSON]List<MesProductionPsInContext>
@Override
public Boolean saveProductionPsInContext(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList) {
if (CollectionUtils.isEmpty(productionPsInContextList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_IN_CONTEXT, JSONObject.toJSONString(productionPsInContextList));
}
//删除上下文进料主条码数据信息集合
@Override
public void deleteProductionPsInContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_IN_CONTEXT);
}
//获取上下文产出条码数据信息集合
@Override
public List<MesProduceSn> getOutProduceSnDataContext(StationRequestBean reqBean) {
String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.OUT_PRODUCE_SN_DATA_CONTEXT);
return !StringUtils.isEmpty(outProduceSnDataJson) ? JSONObject.parseArray(outProduceSnDataJson, MesProduceSn.class) : null;
public List<MesProductionPsOutContext> getProductionPsOutContext(StationRequestBean reqBean) {
String productionPsOutJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_OUT_CONTEXT);
return !StringUtils.isEmpty(productionPsOutJson) ? JSONObject.parseArray(productionPsOutJson, MesProductionPsOutContext.class) : null;
}
//验证上下文产出条码数据信息集合是否存在
@Override
public Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean) {
String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.OUT_PRODUCE_SN_DATA_CONTEXT);
return !StringUtils.isEmpty(outProduceSnDataJson) ? true : false;
public Boolean checkProductionPsOutIsExistContext(StationRequestBean reqBean) {
String productionPsOutJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_OUT_CONTEXT);
return !StringUtils.isEmpty(productionPsOutJson) ? true : false;
}
//保存上下文产出条码数据信息集合 [JSON]List<MesProduceSn>
//保存上下文产出条码数据信息集合 [JSON]List<MesProductionPsOutContext>
@Override
public Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List<MesProduceSn> outProduceSnDataList) {
if (CollectionUtils.isEmpty(outProduceSnDataList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.OUT_PRODUCE_SN_DATA_CONTEXT, JSONObject.toJSONString(outProduceSnDataList));
public Boolean saveProductionPsOutContext(StationRequestBean reqBean, List<MesProductionPsOutContext> productionPsOutContextList) {
if (CollectionUtils.isEmpty(productionPsOutContextList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_OUT_CONTEXT, JSONObject.toJSONString(productionPsOutContextList));
}
//删除上下文产出条码数据信息集合
@Override
public void deleteOutProduceSnDataContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.OUT_PRODUCE_SN_DATA_CONTEXT);
public void deleteProductionPsOutContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_PS_OUT_CONTEXT);
}
//获取上下文产品加工规则信息集合
@ -366,4 +389,46 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT);
}
@Deprecated
//获取上下文产出条码数据信息集合
@Override
public List<MesProduceSn> getOutProduceSnDataContext(StationRequestBean reqBean) {
String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT");
return !StringUtils.isEmpty(outProduceSnDataJson) ? JSONObject.parseArray(outProduceSnDataJson, MesProduceSn.class) : null;
}
@Deprecated
//验证上下文产出条码数据信息集合是否存在
@Override
public Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean) {
String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT");
return !StringUtils.isEmpty(outProduceSnDataJson) ? true : false;
}
@Deprecated
//保存上下文产出条码数据信息集合 [JSON]List<MesProduceSn>
@Override
public Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List<MesProduceSn> outProduceSnDataList) {
if (CollectionUtils.isEmpty(outProduceSnDataList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT", JSONObject.toJSONString(outProduceSnDataList));
}
@Deprecated
//删除上下文产出条码数据信息集合
@Override
public void deleteOutProduceSnDataContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT");
}
}

@ -50,6 +50,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
//存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】
@Override
public Boolean saveProductionProcessContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getIsNeedCache()) return true;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.BASE_DATA_CONTEXT, JSONObject.toJSONString(productionProcessContext));
}

@ -0,0 +1,252 @@
#\u9879\u76EE\u7AEF\u53E3
server.port=8350
#\u672C\u673Aip
impp.server.ip=10.196.74.30
#impp.server.ip=192.168.0.105
#andon ip
impp.andon.url=http://10.195.88.71:8750
#ptl-pcn ip
impp.ptl-pcn.url=http://10.195.88.71:8750
#pcn plc\u5168\u5C40\u4E1A\u52A1\u5F00\u5173 1.yfai-hnc
mes.plc.callback.open=123
#console\u63A7\u5236\u53F0\u670D\u52A1\uFF08zipkin\u8FFD\u8E2A\u5168\u8DEF\u5F84\uFF09
impp.console.ip=http://10.195.88.71:8010
################ \u529F\u80FD\u914D\u7F6E1 ################
#\u5DE5\u4F5C\u533AID,\u4E0D\u540C\u670D\u52A1\u5668\u4E0D\u540CID 0 - 31
impp.snowflake.work.id=22
#\u6570\u636E\u4ED3\u533AID 0 - 31 \u6709\u9ED8\u8BA4\u56FA\u5B9AID
impp.snowflake.database.id=22
#\u82E5\u65E0\u6CD5\u8FDE\u63A5\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u662F\u5426\u9700\u8981\u4E00\u76F4\u68C0\u6D4B\u52A0\u5165
impp.cluster.fetch=false
#\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3
impp.cluster.regist.center=http://10.195.88.71:8000/eureka/
#\u65E5\u5FD7\u9ED8\u8BA4\u4F7F\u7528log4j2
logging.config=classpath:log4j2-spring.xml
mes.ws=ws://10.197.190.121:8300/ws/pcn-regist/
#mes-pcn.ws.path=ws://10.197.176.77:8350
mes-pcn.ws.path=ws://10.196.74.30:8350
pcn.code=PCN-U7
########\u5E73\u53F0\u76F8\u5173\u53C2\u6570##########
#\u662F\u5426\u5F00\u542Fredis\u7F13\u5B58
impp.config.redis=true
#\u662F\u5426\u5F00\u542FrabbitMQ
impp.config.rabbitmq=false
#\u662F\u5426\u5F00\u542Fswagger
impp.config.swagger=true
#\u662F\u5426\u5F00\u542Fwebsocket
impp.config.websocket=true
#\u662F\u5426\u5F00\u542F\u6587\u4EF6\u670D\u52A1
impp.config.fileserver=false
#\u662F\u5426\u5BF9\u53D1\u5E03\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.controller=true
#\u662F\u5426\u5BF9\u8C03\u7528\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.service=true
################ \u961F\u5217\u5904\u7406 ################
#\u7AD9\u5185\u4FE1
impp.mq.queue.letter=true
#\u90AE\u4EF6
impp.mq.queue.mail=true
#\u5B9A\u65F6\u4EFB\u52A1
impp.mq.queue.schedule=true
#SWEB\u901A\u77E5\u5904\u7406\u961F\u5217
impp.mq.queue.sweb.notice=true
################################ \u5176\u4ED6\u529F\u80FD\u8BBE\u7F6E ################################
#redisIP
redis.hostName=10.195.88.71
#\u7AEF\u53E3\u53F7
redis.port=6379
#\u5982\u679C\u6709\u5BC6\u7801
redis.password=Admin123!
##\u5176\u4ED6redis\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################## rabbitMQ\u914D\u7F6E ####################
spring.rabbitmq.vhost=/
spring.rabbitmq.host=10.195.88.71
spring.rabbitmq.port=5672
spring.rabbitmq.username=estsh
spring.rabbitmq.password=estsh123
##\u5176\u4ED6rabbitMq\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################ \u529F\u80FD\u914D\u7F6E2 ################
#\u662F\u5426\u5F00\u542Fredis
mes.pcn.redis.open=true
#\u662F\u5426\u5141\u8BB8\u524D\u7AEF\u8DE8\u57DF\u63D0\u4EA4
impp.web.cross=true
################ \u6388\u6743\u8FC7\u6EE4\u914D\u7F6E ################
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.user.filteruri=/mes-pcn/operate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.admin.filteruri=/mes-pcn/adoperate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.saadmin.filteruri=/mes-pcn/saoperate/*
################ \u4E91\u914D\u7F6E \uFF08\u4EE5projectName\u4F5C\u4E3A\u5E94\u7528\u540D\uFF09 ################
#\u662F\u5426\u5F00\u542F\u5FAE\u670D
eureka.client.enabled=false
#\uFF08\u53C2\u6570\u914D\u7F6E\uFF09\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740 -\u300B i3plus-ics\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694
eureka.client.service-url.defaultZone=${impp.cluster.regist.center}
#\u533A\u57DF\uFF08\u6E90\u7801\u4E2D\u5305\u542BdefaultZone\uFF0C\u6241\u4EE5\u9ED8\u8BA4\u4F7F\u7528defaultZone\uFF09
#eureka.client.region=estsh
#eureka.client.service-url.estsh:http://192.168.1.20:8000/eureka/,http://192.168.1.20:8001/eureka/
################ \u672C\u673A\u5FAE\u670D\u914D\u7F6E ################
#\u672C\u670D\u52A1\u4E3B\u673Aip\uFF08\u82E5\u591A\u4E2A\u7F51\u5361\uFF0C\u5219\u9700\u8981\u8BBE\u7F6E\u672C\u670D\u52A1ip\uFF09
eureka.instance.ip-address=${impp.server.ip}
#\u672C\u670D\u52A1\u5B9E\u4F8BID
eureka.instance.instance-id=${impp.server.ip}:${server.port}
#\u672C\u670D\u52A1\u4E3B\u673A\u540D
eureka.instance.hostname=${impp.server.ip}
#\u672C\u670D\u52A1\u72B6\u6001\u9875\u9762
eureka.instance.status-page-url=http://${impp.server.ip}:${server.port}/swagger-ui.html
#\u5C06\u81EA\u5DF1\u7684IP\u6CE8\u518C\u5230Eureka Server\u3002\u82E5\u4E0D\u914D\u7F6E\u6216\u8BBE\u7F6E\u4E3Afalse\uFF0C\u8868\u793A\u6CE8\u518C\u5FAE\u670D\u52A1\u6241\u5728\u64CD\u4F5C\u7CFB\u7EDF\u7684hostname\u5230Eureka Server
eureka.instance.prefer-ip-address=false
#\u662F\u5426\u8FDB\u884C\u5065\u5EB7\u68C0\u67E5
eureka.client.healthcheck.enabled=true
################ \u68C0\u6D4B\u673A\u5236 ################
#\u5FC3\u8DF3\u95F4\u9694\u5468\u671F\uFF0C\u5B95\u673A\u9650\u5236\uFF08\u79D2\uFF09\uFF0C30\u79D2\u6CA1\u53CD\u5E94\u89C6\u4E3A\u5B95\u673A
eureka.instance.lease-expiration-duration-in-seconds=30
#\u5FC3\u8DF3\u5468\u671F
eureka.instance.lease-renewal-interval-in-seconds=20
#client\u8FDE\u63A5Eureka\u670D\u52A1\u7AEF\u540E\u7684\u7A7A\u95F2\u7B49\u5F85\u65F6\u95F4\uFF0C\u9ED8\u8BA4\u4E3A30 \u79D2
eureka.client.eureka-connection-idle-timeout-seconds=1
#\u6700\u521D\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\u6241\u9700\u7684\u65F6\u95F4\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A40\u79D2
eureka.client.initial-instance-info-replication-interval-seconds=1
#\u95F4\u9694\u591A\u957F\u65F6\u95F4\u518D\u6B21\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.instance-info-replication-interval-seconds=1
#\u4ECEeureka\u670D\u52A1\u5668\u6CE8\u518C\u8868\u4E2D\u83B7\u53D6\u6CE8\u518C\u4FE1\u606F\u7684\u65F6\u95F4\u95F4\u9694\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.registry-fetch-interval-seconds=1
################ \u6253\u5F00feign\u7684\u7194\u65AD ################
feign.hystrix.enabled=true
#\u8BFB\u53D6\u6570\u636E\u65F6\u957F
ribbon.ReadTimeout=10000
#\u8FDE\u63A5\u65F6\u957F
ribbon.ConnectTimeout=10000
#\u91CD\u8BD5
ribbon.maxAutoRetries=2
#\u54CD\u5E94\u8D85\u8FC7\u65F6\u957F\uFF0C\u8FDB\u884C\u7194\u65AD\uFF08\u7194\u65AD\u8D85\u65F6\u9700\u8981\u5927\u4E8E\u8BFB\u53D6\u65F6\u957F\u53CA\u8FDE\u63A5\u65F6\u957F\uFF09
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000
#\u96C6\u7FA4\u540D
eureka.instance.metadata-map.cluster=impp_cluster
################ \u94FE\u8DEF\u8FFD\u8E2A ################
#\u4F7F\u7528web\u65B9\u5F0F\u4F20\u8F93\u4FE1\u606F
spring.zipkin.sender.type=web
#\u94FE\u8DEF\u8FFD\u8E2A\u670D\u52A1\u7684\u5730\u5740
spring.zipkin.base-url=${impp.console.ip}
#\u8FFD\u8E2A\u6DF1\u5EA6\uFF0C\u767E\u5206\u6BD4\uFF0C1\u662F\u5168\u90E8
spring.sleuth.sampler.probability=1.0
# mysql
#impp.write.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.write.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.write.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.write.datasource.username=root
#impp.write.datasource.password=estsh123
#impp.read.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.read.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.read.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.read.datasource.username=root
#impp.read.datasource.password=estsh123
#
###########################\u8BFB\u5199\u5206\u79BB#######################################
spring.shardingsphere.datasource.names=master,slave
##\u5199\u5E93
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=estsh123
spring.shardingsphere.datasource.master.maximum-pool-size=400
spring.shardingsphere.datasource.master.minimum-idle=200
spring.shardingsphere.datasource.master.idle-timeout=500000
spring.shardingsphere.datasource.master.connection-timeout=600000
spring.shardingsphere.datasource.master.max-lifetime=7000000
spring.shardingsphere.datasource.master.connection-test-query=select 1
spring.shardingsphere.datasource.master.keep-alive-time=3500000
##\u8BFB\u5E93
spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=estsh123
spring.shardingsphere.datasource.slave.maximum-pool-size=200
spring.shardingsphere.datasource.slave.minimum-idle=200
spring.shardingsphere.datasource.slave.idle-timeout=500000
spring.shardingsphere.datasource.slave.connection-timeout=600000
spring.shardingsphere.datasource.slave.max-lifetime=7000000
spring.shardingsphere.datasource.slave.connection-test-query=select 1
spring.shardingsphere.datasource.slave.keep-alive-time=3500000
##\u8BFB\u5199\u5206\u79BB\u914D\u7F6E
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave
#\u9ED8\u8BA4datasource \u9ED8\u8BA4\u6570\u636E\u6E90\uFF0C\u672A\u5206\u7247\u7684\u8868\u9ED8\u8BA4\u6267\u884C\u5E93
#spring.shardingsphere.sharding.default-data-source-name=ds0
#\u7CFB\u7EDF\u5C5E\u6027\uFF0C\u663E\u793A\u6B63\u5E38\u7684sql\u8BED\u53E5
spring.shardingsphere.props.sql.show=false
spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{1..100}
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.sharding-column=equip_id
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.algorithm-expression=mes_equipment_log_$->{equip_id}
#\u7ED1\u5B9A\u8868
spring.shardingsphere.sharding.binding-tables[0]=mes_equipment_log
#\u4E2D\u822A\u6570\u636E\u6E90
##############\u5B9A\u65F6\u4EFB\u52A1\u6301\u4E45\u5316##############
impp.schedule.open=true
impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver
impp.schedule.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.schedule.datasource.username=root
impp.schedule.datasource.password=estsh123
impp.schedule.datasource.max-connections=20
#\u5B9A\u65F6\u4EFB\u52A1\u5728\u670D\u52A1\u542F\u52A8\u540E\u591A\u5C11\u79D2\u6267\u884C
impp.schedule.start.after-second=20
#\u662F\u5426\u96C6\u7FA4\u90E8\u7F72
impp.schedule.datasource.is-clustered=true
#\u6267\u884C\u68C0\u6D4B\uFF08\u6BEB\u79D2\uFF09\uFF0C\u82E5\u5B95\u673A\u7531\u5176\u4ED6\u5B9A\u65F6\u5668\u6267\u884C
impp.schedule.datasource.cluster-checkin-interval=30000
#\u7EBF\u7A0B\u6570
impp.schedule.thread-count=10
#\u7EBF\u7A0B\u4F18\u5148\u7EA7\uFF081-10\uFF09\u9ED8\u8BA4\u4E3A5
impp.schedule.thread-priority=5
################ \u6570\u636E\u6C60\u8BBE\u7F6E ################
## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF0C\u9ED8\u8BA4\u662F10
spring.datasource.maximum-pool-size=100
## \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570\u91CF
spring.datasource.min-idle=10
################ JPA\u8BBE\u7F6E\u8BBE\u7F6E ################
# mysql
spring.jpa.database=MYSQL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
##Sql-server##
#spring.jpa.database=sql_server
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
##oracle##
#spring.jpa.database=oracle
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
# mysql
#spring.datasource.validationQuery=SELECT 1
##Sql-server##
spring.datasource.validationQuery=SELECT 1
##oracle##
# spring.datasource.validationQuery=SELECT 1 FROM DUAL
#ImprovedNamingStrategy / physical_naming_strategy java\u5C5E\u6027\u6620\u5C04\u5230\u6570\u636E\u5E93\u5B57\u6BB5\u65F6\u547D\u540D\u89C4\u5219
# spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy/org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u8868\u5173\u7CFBcreate,create-drop,update,validate
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u662F\u5426\u663E\u793Asql
spring.jpa.show-sql=true
################ \u6388\u6743\u914D\u7F6E ################
slm.api.password=4C9479EBEFA6FA6E232EF25EFA49C4D2
slm.app.id=20190513
# \u811A\u672C\u5728\u7EBF\u8C03\u8BD5\u751F\u6210\u7684\u65E5\u5FD7\u6587\u4EF6\u76F8\u5BF9\u8DEF\u5F84\uFF0Cclasspath:xx
pcn.script.logger.path=pluginlogs
pcn.schedule.job=true
server.tomcat.max-threads=300
server.tomcat.max-connections=300
plugin.mainPackage=cn.estsh.i3plus

@ -0,0 +1,252 @@
#\u9879\u76EE\u7AEF\u53E3
server.port=8350
#\u672C\u673Aip
impp.server.ip=10.196.74.30
#impp.server.ip=192.168.0.105
#andon ip
impp.andon.url=http://10.195.88.71:8750
#ptl-pcn ip
impp.ptl-pcn.url=http://10.195.88.71:8750
#pcn plc\u5168\u5C40\u4E1A\u52A1\u5F00\u5173 1.yfai-hnc
mes.plc.callback.open=123
#console\u63A7\u5236\u53F0\u670D\u52A1\uFF08zipkin\u8FFD\u8E2A\u5168\u8DEF\u5F84\uFF09
impp.console.ip=http://10.195.88.71:8010
################ \u529F\u80FD\u914D\u7F6E1 ################
#\u5DE5\u4F5C\u533AID,\u4E0D\u540C\u670D\u52A1\u5668\u4E0D\u540CID 0 - 31
impp.snowflake.work.id=22
#\u6570\u636E\u4ED3\u533AID 0 - 31 \u6709\u9ED8\u8BA4\u56FA\u5B9AID
impp.snowflake.database.id=22
#\u82E5\u65E0\u6CD5\u8FDE\u63A5\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u662F\u5426\u9700\u8981\u4E00\u76F4\u68C0\u6D4B\u52A0\u5165
impp.cluster.fetch=false
#\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3
impp.cluster.regist.center=http://10.195.88.71:8000/eureka/
#\u65E5\u5FD7\u9ED8\u8BA4\u4F7F\u7528log4j2
logging.config=classpath:log4j2-spring.xml
mes.ws=ws://10.197.190.121:8300/ws/pcn-regist/
#mes-pcn.ws.path=ws://10.197.176.77:8350
mes-pcn.ws.path=ws://10.196.74.30:8350
pcn.code=PCN-U7
########\u5E73\u53F0\u76F8\u5173\u53C2\u6570##########
#\u662F\u5426\u5F00\u542Fredis\u7F13\u5B58
impp.config.redis=true
#\u662F\u5426\u5F00\u542FrabbitMQ
impp.config.rabbitmq=false
#\u662F\u5426\u5F00\u542Fswagger
impp.config.swagger=true
#\u662F\u5426\u5F00\u542Fwebsocket
impp.config.websocket=true
#\u662F\u5426\u5F00\u542F\u6587\u4EF6\u670D\u52A1
impp.config.fileserver=false
#\u662F\u5426\u5BF9\u53D1\u5E03\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.controller=true
#\u662F\u5426\u5BF9\u8C03\u7528\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.service=true
################ \u961F\u5217\u5904\u7406 ################
#\u7AD9\u5185\u4FE1
impp.mq.queue.letter=true
#\u90AE\u4EF6
impp.mq.queue.mail=true
#\u5B9A\u65F6\u4EFB\u52A1
impp.mq.queue.schedule=true
#SWEB\u901A\u77E5\u5904\u7406\u961F\u5217
impp.mq.queue.sweb.notice=true
################################ \u5176\u4ED6\u529F\u80FD\u8BBE\u7F6E ################################
#redisIP
redis.hostName=10.195.88.71
#\u7AEF\u53E3\u53F7
redis.port=6379
#\u5982\u679C\u6709\u5BC6\u7801
redis.password=Admin123!
##\u5176\u4ED6redis\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################## rabbitMQ\u914D\u7F6E ####################
spring.rabbitmq.vhost=/
spring.rabbitmq.host=10.195.88.71
spring.rabbitmq.port=5672
spring.rabbitmq.username=estsh
spring.rabbitmq.password=estsh123
##\u5176\u4ED6rabbitMq\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################ \u529F\u80FD\u914D\u7F6E2 ################
#\u662F\u5426\u5F00\u542Fredis
mes.pcn.redis.open=true
#\u662F\u5426\u5141\u8BB8\u524D\u7AEF\u8DE8\u57DF\u63D0\u4EA4
impp.web.cross=true
################ \u6388\u6743\u8FC7\u6EE4\u914D\u7F6E ################
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.user.filteruri=/mes-pcn/operate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.admin.filteruri=/mes-pcn/adoperate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.saadmin.filteruri=/mes-pcn/saoperate/*
################ \u4E91\u914D\u7F6E \uFF08\u4EE5projectName\u4F5C\u4E3A\u5E94\u7528\u540D\uFF09 ################
#\u662F\u5426\u5F00\u542F\u5FAE\u670D
eureka.client.enabled=false
#\uFF08\u53C2\u6570\u914D\u7F6E\uFF09\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740 -\u300B i3plus-ics\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694
eureka.client.service-url.defaultZone=${impp.cluster.regist.center}
#\u533A\u57DF\uFF08\u6E90\u7801\u4E2D\u5305\u542BdefaultZone\uFF0C\u6241\u4EE5\u9ED8\u8BA4\u4F7F\u7528defaultZone\uFF09
#eureka.client.region=estsh
#eureka.client.service-url.estsh:http://192.168.1.20:8000/eureka/,http://192.168.1.20:8001/eureka/
################ \u672C\u673A\u5FAE\u670D\u914D\u7F6E ################
#\u672C\u670D\u52A1\u4E3B\u673Aip\uFF08\u82E5\u591A\u4E2A\u7F51\u5361\uFF0C\u5219\u9700\u8981\u8BBE\u7F6E\u672C\u670D\u52A1ip\uFF09
eureka.instance.ip-address=${impp.server.ip}
#\u672C\u670D\u52A1\u5B9E\u4F8BID
eureka.instance.instance-id=${impp.server.ip}:${server.port}
#\u672C\u670D\u52A1\u4E3B\u673A\u540D
eureka.instance.hostname=${impp.server.ip}
#\u672C\u670D\u52A1\u72B6\u6001\u9875\u9762
eureka.instance.status-page-url=http://${impp.server.ip}:${server.port}/swagger-ui.html
#\u5C06\u81EA\u5DF1\u7684IP\u6CE8\u518C\u5230Eureka Server\u3002\u82E5\u4E0D\u914D\u7F6E\u6216\u8BBE\u7F6E\u4E3Afalse\uFF0C\u8868\u793A\u6CE8\u518C\u5FAE\u670D\u52A1\u6241\u5728\u64CD\u4F5C\u7CFB\u7EDF\u7684hostname\u5230Eureka Server
eureka.instance.prefer-ip-address=false
#\u662F\u5426\u8FDB\u884C\u5065\u5EB7\u68C0\u67E5
eureka.client.healthcheck.enabled=true
################ \u68C0\u6D4B\u673A\u5236 ################
#\u5FC3\u8DF3\u95F4\u9694\u5468\u671F\uFF0C\u5B95\u673A\u9650\u5236\uFF08\u79D2\uFF09\uFF0C30\u79D2\u6CA1\u53CD\u5E94\u89C6\u4E3A\u5B95\u673A
eureka.instance.lease-expiration-duration-in-seconds=30
#\u5FC3\u8DF3\u5468\u671F
eureka.instance.lease-renewal-interval-in-seconds=20
#client\u8FDE\u63A5Eureka\u670D\u52A1\u7AEF\u540E\u7684\u7A7A\u95F2\u7B49\u5F85\u65F6\u95F4\uFF0C\u9ED8\u8BA4\u4E3A30 \u79D2
eureka.client.eureka-connection-idle-timeout-seconds=1
#\u6700\u521D\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\u6241\u9700\u7684\u65F6\u95F4\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A40\u79D2
eureka.client.initial-instance-info-replication-interval-seconds=1
#\u95F4\u9694\u591A\u957F\u65F6\u95F4\u518D\u6B21\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.instance-info-replication-interval-seconds=1
#\u4ECEeureka\u670D\u52A1\u5668\u6CE8\u518C\u8868\u4E2D\u83B7\u53D6\u6CE8\u518C\u4FE1\u606F\u7684\u65F6\u95F4\u95F4\u9694\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.registry-fetch-interval-seconds=1
################ \u6253\u5F00feign\u7684\u7194\u65AD ################
feign.hystrix.enabled=true
#\u8BFB\u53D6\u6570\u636E\u65F6\u957F
ribbon.ReadTimeout=10000
#\u8FDE\u63A5\u65F6\u957F
ribbon.ConnectTimeout=10000
#\u91CD\u8BD5
ribbon.maxAutoRetries=2
#\u54CD\u5E94\u8D85\u8FC7\u65F6\u957F\uFF0C\u8FDB\u884C\u7194\u65AD\uFF08\u7194\u65AD\u8D85\u65F6\u9700\u8981\u5927\u4E8E\u8BFB\u53D6\u65F6\u957F\u53CA\u8FDE\u63A5\u65F6\u957F\uFF09
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000
#\u96C6\u7FA4\u540D
eureka.instance.metadata-map.cluster=impp_cluster
################ \u94FE\u8DEF\u8FFD\u8E2A ################
#\u4F7F\u7528web\u65B9\u5F0F\u4F20\u8F93\u4FE1\u606F
spring.zipkin.sender.type=web
#\u94FE\u8DEF\u8FFD\u8E2A\u670D\u52A1\u7684\u5730\u5740
spring.zipkin.base-url=${impp.console.ip}
#\u8FFD\u8E2A\u6DF1\u5EA6\uFF0C\u767E\u5206\u6BD4\uFF0C1\u662F\u5168\u90E8
spring.sleuth.sampler.probability=1.0
# mysql
#impp.write.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.write.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.write.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.write.datasource.username=root
#impp.write.datasource.password=estsh123
#impp.read.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.read.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.read.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.read.datasource.username=root
#impp.read.datasource.password=estsh123
#
###########################\u8BFB\u5199\u5206\u79BB#######################################
spring.shardingsphere.datasource.names=master,slave
##\u5199\u5E93
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=estsh123
spring.shardingsphere.datasource.master.maximum-pool-size=400
spring.shardingsphere.datasource.master.minimum-idle=200
spring.shardingsphere.datasource.master.idle-timeout=500000
spring.shardingsphere.datasource.master.connection-timeout=600000
spring.shardingsphere.datasource.master.max-lifetime=7000000
spring.shardingsphere.datasource.master.connection-test-query=select 1
spring.shardingsphere.datasource.master.keep-alive-time=3500000
##\u8BFB\u5E93
spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=estsh123
spring.shardingsphere.datasource.slave.maximum-pool-size=200
spring.shardingsphere.datasource.slave.minimum-idle=200
spring.shardingsphere.datasource.slave.idle-timeout=500000
spring.shardingsphere.datasource.slave.connection-timeout=600000
spring.shardingsphere.datasource.slave.max-lifetime=7000000
spring.shardingsphere.datasource.slave.connection-test-query=select 1
spring.shardingsphere.datasource.slave.keep-alive-time=3500000
##\u8BFB\u5199\u5206\u79BB\u914D\u7F6E
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave
#\u9ED8\u8BA4datasource \u9ED8\u8BA4\u6570\u636E\u6E90\uFF0C\u672A\u5206\u7247\u7684\u8868\u9ED8\u8BA4\u6267\u884C\u5E93
#spring.shardingsphere.sharding.default-data-source-name=ds0
#\u7CFB\u7EDF\u5C5E\u6027\uFF0C\u663E\u793A\u6B63\u5E38\u7684sql\u8BED\u53E5
spring.shardingsphere.props.sql.show=false
spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{1..100}
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.sharding-column=equip_id
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.algorithm-expression=mes_equipment_log_$->{equip_id}
#\u7ED1\u5B9A\u8868
spring.shardingsphere.sharding.binding-tables[0]=mes_equipment_log
#\u4E2D\u822A\u6570\u636E\u6E90
##############\u5B9A\u65F6\u4EFB\u52A1\u6301\u4E45\u5316##############
impp.schedule.open=true
impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver
impp.schedule.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.schedule.datasource.username=root
impp.schedule.datasource.password=estsh123
impp.schedule.datasource.max-connections=20
#\u5B9A\u65F6\u4EFB\u52A1\u5728\u670D\u52A1\u542F\u52A8\u540E\u591A\u5C11\u79D2\u6267\u884C
impp.schedule.start.after-second=20
#\u662F\u5426\u96C6\u7FA4\u90E8\u7F72
impp.schedule.datasource.is-clustered=true
#\u6267\u884C\u68C0\u6D4B\uFF08\u6BEB\u79D2\uFF09\uFF0C\u82E5\u5B95\u673A\u7531\u5176\u4ED6\u5B9A\u65F6\u5668\u6267\u884C
impp.schedule.datasource.cluster-checkin-interval=30000
#\u7EBF\u7A0B\u6570
impp.schedule.thread-count=10
#\u7EBF\u7A0B\u4F18\u5148\u7EA7\uFF081-10\uFF09\u9ED8\u8BA4\u4E3A5
impp.schedule.thread-priority=5
################ \u6570\u636E\u6C60\u8BBE\u7F6E ################
## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF0C\u9ED8\u8BA4\u662F10
spring.datasource.maximum-pool-size=100
## \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570\u91CF
spring.datasource.min-idle=10
################ JPA\u8BBE\u7F6E\u8BBE\u7F6E ################
# mysql
spring.jpa.database=MYSQL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
##Sql-server##
#spring.jpa.database=sql_server
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
##oracle##
#spring.jpa.database=oracle
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
# mysql
#spring.datasource.validationQuery=SELECT 1
##Sql-server##
spring.datasource.validationQuery=SELECT 1
##oracle##
# spring.datasource.validationQuery=SELECT 1 FROM DUAL
#ImprovedNamingStrategy / physical_naming_strategy java\u5C5E\u6027\u6620\u5C04\u5230\u6570\u636E\u5E93\u5B57\u6BB5\u65F6\u547D\u540D\u89C4\u5219
# spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy/org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u8868\u5173\u7CFBcreate,create-drop,update,validate
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u662F\u5426\u663E\u793Asql
spring.jpa.show-sql=true
################ \u6388\u6743\u914D\u7F6E ################
slm.api.password=4C9479EBEFA6FA6E232EF25EFA49C4D2
slm.app.id=20190513
# \u811A\u672C\u5728\u7EBF\u8C03\u8BD5\u751F\u6210\u7684\u65E5\u5FD7\u6587\u4EF6\u76F8\u5BF9\u8DEF\u5F84\uFF0Cclasspath:xx
pcn.script.logger.path=pluginlogs
pcn.schedule.job=true
server.tomcat.max-threads=300
server.tomcat.max-connections=300
plugin.mainPackage=cn.estsh.i3plus

@ -1,5 +1,5 @@
#\u4F7F\u7528\u914D\u7F6E
spring.profiles.active=71
spring.profiles.active=72
#\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C\u7801
desc.application.name=\u751F\u4EA7\u4E2D\u5FC3\u8282\u70B9
######### \u81EA\u5B9A\u4E49\u53C2\u6570 #########

@ -13,6 +13,9 @@ public class MesAssemblyShowContext implements Serializable {
private static final long serialVersionUID = -3650546953572889323L;
@ApiParam("生产工单号")
private String workOrderNo;
@ApiParam("零件编码")
private String partNo;
@ -38,7 +41,7 @@ public class MesAssemblyShowContext implements Serializable {
private Integer assemblyStatus;
@ApiParam("装配件条码确认方式")
private String matchType;
private Integer matchType;
@ApiParam("装配零件状态")
private String assemblyStatusName;

@ -11,9 +11,10 @@ import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* -()
* -
*/
@Data
public class MesProdRuleContext implements Serializable {
@ -23,8 +24,8 @@ public class MesProdRuleContext implements Serializable {
@ApiParam("组织代码")
public String organizeCode;
@ApiParam(name = "数据关联键 排序:生产工单号 非排序:snowflakeId")
private String foreignKey;
@ApiParam(name = "数据关联键")
private Integer foreignKey;
@ApiParam("装配件绑定清单 [JSON]List<MesProductionAssemblyContext>")
public String assemblyDataJson;
@ -45,12 +46,6 @@ public class MesProdRuleContext implements Serializable {
@ApiParam(name = "读/扫主条码信息(内制件/外协件),不一定有值")
private String productSn;
@ApiParam(name = "进料零件号是否为空")
private Boolean inPartNoIsEmpty = false;
@ApiParam(name = "进料零件规则是否为空")
private Boolean inPartNoRuleIsEmpty = false;
@ApiParam("非排序产品加工规则ID")
public Long pid;
@ -90,6 +85,20 @@ public class MesProdRuleContext implements Serializable {
@ApiParam(name = "子箱设备信号点")
private String packageEquSignal;
//----------仅作为查询条件冗余-------------
@ApiParam(name = "进料零件号与规则是否均为空")
private Boolean inPartIsEmpty = false;
@ApiParam(name = "进料规则是否有值")
private Boolean inPartRuleIsNotEmpty = false;
@ApiParam(name = "进料零件号")
private String inPartNos;
@ApiParam(name = "产成零件号")
private String outPartNos;
public MesProdRuleContext() {}
public MesProdRuleContext(String organizeCode) {
@ -103,18 +112,18 @@ public class MesProdRuleContext implements Serializable {
this.processCode = processCode;
}
public MesProdRuleContext foreignKey(String foreignKey) {
public MesProdRuleContext foreignKey(Integer foreignKey) {
this.foreignKey = foreignKey;
return this;
}
public MesProdRuleContext inPartNoIsEmpty() {
this.inPartNoIsEmpty = true;
public MesProdRuleContext inPartIsEmpty() {
this.inPartIsEmpty = true;
return this;
}
public MesProdRuleContext inPartNoRuleIsEmpty() {
this.inPartNoRuleIsEmpty = true;
public MesProdRuleContext inPartRuleIsNotEmpty() {
this.inPartRuleIsNotEmpty = true;
return this;
}
@ -133,6 +142,30 @@ public class MesProdRuleContext implements Serializable {
return this;
}
public MesProdRuleContext inPartNos(List<String> inPartNoList) {
if (CollectionUtils.isEmpty(inPartNoList)) return this;
inPartNoList = inPartNoList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (inPartNoList.size() > 1) this.inPartNos = JSONObject.toJSONString(inPartNoList);
else this.inPartNo = inPartNoList.get(0);
return this;
}
public MesProdRuleContext outPartNos(List<String> outPartNoList) {
if (CollectionUtils.isEmpty(outPartNoList)) return this;
outPartNoList = outPartNoList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (outPartNoList.size() > 1) this.outPartNos = JSONObject.toJSONString(outPartNoList);
else this.outPartNo = outPartNoList.get(0);
return this;
}
public List<String> getInPartNoList() {
return !StringUtils.isEmpty(this.inPartNos) ? JSONObject.parseObject(this.inPartNos, List.class) : null;
}
public List<String> getOutPartNoList() {
return !StringUtils.isEmpty(this.outPartNos) ? JSONObject.parseObject(this.outPartNos, List.class) : null;
}
public MesProdRuleContext equipmentCode(String equipmentCode) {
this.equipmentCode = equipmentCode;
return this;
@ -143,6 +176,7 @@ public class MesProdRuleContext implements Serializable {
return this;
}
//根据生产线类型返回装配件数据集合【向上转型】
public List<MesProductionAssemblyContext> getAssemblyDataContext(MesWorkCenter workCenter) {
if (StringUtils.isEmpty(this.assemblyDataJson)) return null;
List<MesProductionAssemblyContext> productionAssemblyContextList = new ArrayList<>();

@ -15,8 +15,8 @@ public class MesProductionPartContext implements Serializable {
private static final long serialVersionUID = 5562937531822977296L;
@ApiParam(name = "数据关联键 排序:生产工单号 非排序:snowflakeId")
private String foreignKey;
@ApiParam(name = "数据关联键")
private Integer foreignKey;
@ApiParam("组织代码")
private String organizeCode;
@ -41,18 +41,11 @@ public class MesProductionPartContext implements Serializable {
public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) {
BeanUtils.copyProperties(mouldMultiCavity, this);
this.foreignKey = mouldMultiCavity.getId().toString();
return this;
}
//-------以下场景预留未开发-------
public MesProductionPartContext copyWorkOrder(String workOrderNo) {
this.foreignKey = workOrderNo + "腔顺序号";
return this;
}
public MesProductionPartContext copyPartNo(String partNo) {
this.foreignKey = partNo + "腔顺序号";
public MesProductionPartContext foreignKey(Integer foreignKey) {
this.foreignKey = foreignKey;
return this;
}

@ -0,0 +1,67 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
* -(/)
*/
@Data
public class MesProductionPsInContext implements Serializable {
private static final long serialVersionUID = 4337949265011880288L;
@ApiParam(name = "数据关联键 排序:生产工单号 非排序:snowflakeId")
private Integer foreignKey;
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("零件条码ID")
private Long id;
@ApiParam("非排序进料零件条码/排序工单号")
private String productSn;
@ApiParam("过程条码")
private String serialNumber;
@ApiParam("客户条码")
private String custSn;
@ApiParam("零件号")
private String partNo;
@ApiParam("零件名称")
private String partName;
@ApiParam("工艺跳过码")
private String craftJumpCode;
//默认否
@ApiParam("是否顺序防错")
private Integer isCheckSeq = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
//默认否
@ApiParam(name = "是否前道工艺防错")
private Integer isCheckCraft = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
//默认未验证
@ApiParam("顺序防错结果")
private Integer checkSeqResult = MesPcnExtConstWords.ZERO;
//默认未验证
@ApiParam(name = "前道工艺防错结果")
private Integer checkCraftResult = MesPcnExtConstWords.ZERO;
public MesProductionPsInContext foreignKey(Integer foreignKey) {
this.foreignKey = foreignKey;
return this;
}
}

@ -0,0 +1,20 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
* -()
*/
@Data
public class MesProductionPsOutContext extends MesProduceSn implements Serializable {
private static final long serialVersionUID = 5562937531822977296L;
@ApiParam(name = "数据关联键 非排序:snowflakeId")
private String foreignKey;
}

@ -18,7 +18,7 @@ import java.util.List;
* @Modify:
**/
@Data
public class MesNcProcessingInputModel {
public class MesNcProcessingInputModel {
@ApiParam("类型")
private Integer type;
@ -29,6 +29,9 @@ public class MesNcProcessingInputModel {
@ApiParam("责任人")
private MesDefectType person;
@ApiParam("区域代码")
private String areaCode;
@ApiParam("物料")
private MesPartSap part;

@ -21,7 +21,7 @@ public class MesNcProcessingPartAndLotModel {
private String partName;
@ApiParam("批次")
private String lot;
private String lotNo;
}

@ -38,7 +38,7 @@ public class MesPartInspectionInputModel {
private Integer frontBack;
@ApiParam("批次")
private String lot;
private String lotNo;
@ApiParam("数量")
private Integer qty;

@ -19,11 +19,11 @@ public class MesReworkTaskRequestModel {
*
*/
private String custSn;
/**
*
*/
private String reworkOrder;
/**
*
*/

@ -130,7 +130,12 @@ public class MesPcnExtConstWords {
// 最大重试次数[工步参数]
public static final Integer MAX_RETRY_TIMES_DEFAULT = 10;
// 工艺跳过码(前后防错/顺序防错)[工位参数]
public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE";
// 未知腔数[工位参数]
public static final String CAVITY_UNKNOWN_CFG = "CAVITY_UNKNOWN_CFG";
// 支持混腔扫描[工位参数]
public static final String CAVITY_NOSORT_CFG = "CAVITY_NOSORT_CFG";
// 0
public static final Integer ZERO = 0;
@ -185,12 +190,10 @@ public class MesPcnExtConstWords {
public static final String SCAN_ASSEMBLY_SN_CONTEXT = "SCAN_ASSEMBLY_SN_CONTEXT";
// 上下文: 产品加工规则数据信息
public static final String PROD_RULE_DATA_CONTEXT = "PROD_RULE_DATA_CONTEXT";
// 上下文: 进料条码数据信息
public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT";
// 上下文: 产出条码数据信息
public static final String OUT_PRODUCE_SN_DATA_CONTEXT = "OUT_PRODUCE_SN_DATA_CONTEXT";
// 上下文: 装配件清单
public static final String ASSEMBLY_DATA_CONTEXT = "ASSEMBLY_DATA_CONTEXT";
// 上下文: 非排序产品加工规则信息
public static final String PROD_RULE_NOSORT_DATA_CONTEXT = "PROD_RULE_NOSORT_DATA_CONTEXT";
public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT";
/***
* OPC

@ -30,7 +30,7 @@
<skipTests>true</skipTests>
<app.charset>UTF-8</app.charset>
<impp.framework.version>1.0.0.4-patch</impp.framework.version>
<impp.framework.version>1.0.1-YZ</impp.framework.version>
<i3plus.pojo.version>1.0.0-yfai</i3plus.pojo.version>
<i3plus.platform.version>1.0.0.1-patch</i3plus.platform.version>
<i3plus.mes.pcn.version>1.0.0-yfai</i3plus.mes.pcn.version>

Loading…
Cancel
Save