Merge branch 'dev-wuhan' of http://git.estsh.com/I3-YF/i3plus-mes-pcn-yfai into dev-wuhan

tags/yfai-pcn-ext-v2.3
gsz 8 months ago
commit 361eb7e455

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : xinwang.yi
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
public interface IMesPartProdGroupService {
@ApiOperation(value = "查询零件生产组集合")
List<MesPartProdGroup> queryMesPartProdGroup(MesPartProdGroup partProdGroup);
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintQueue;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut;
@ -24,4 +25,7 @@ public interface IMesProduceSnPrintService {
@ApiOperation(value = "裁片工单查询")
List<MesWorkOrderCut> findMesWorkOrderCut(MesWorkOrderCut workOrderCut);
@ApiOperation(value = "打印队列查询")
List<MesPrintQueue> findMesPrintQueueList(MesPrintQueue printQueue);
}

@ -0,0 +1,46 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartProdGroupService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import 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;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/13 15:13
* @Modify:
**/
@RestController
@Api(tags = "零件生产组")
@RequestMapping(MesCommonConstant.MES_YANFEN + "/mes-part-prod-group")
public class MesPartProdGroupController {
@Autowired
private IMesPartProdGroupService partProdGroupService;
@GetMapping("/query")
@ApiOperation(value = "查询零件生产组信息")
public ResultBean queryMesCutLengthModifyType(MesPartProdGroup partProdGroup) {
try {
ValidatorBean.checkNotNull(partProdGroup.getOrganizeCode(), "工厂代码为空");
return ResultBean.success("查询成功").setResultList(partProdGroupService.queryMesPartProdGroup(partProdGroup));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -5,8 +5,10 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnPrintService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintQueue;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
@ -134,4 +136,30 @@ public class MesProduceSnPrintController {
}
}
@PostMapping("/mes-print-queue/find")
@ApiOperation(value = "打印队列查询")
public ResultBean findMesWorkOrderPrintQueue(MesPrintQueue printQueue) {
try {
ValidatorBean.checkNotNull(printQueue.getPrintQueueType(), "打印类型不能为空");
if (printQueue.getPrintQueueType() == MesExtEnumUtil.PRINT_QUEUE_TYPE.WORK_ORDER_ASSEMBLY.getValue()) {
ValidatorBean.checkNotNull(printQueue.getWorkCenterCodeQuery(), "产线代码不能为空");
ValidatorBean.checkNotNull(printQueue.getPartProdGroupCodeQuery(), "零件生产组代码不能为空");
}
ValidatorBean.checkNotNull(printQueue.getPrintQueueType(), "打印队列类型不能为空");
ValidatorBean.checkNotNull(printQueue.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(printQueue.getModifyUser(), "操作人不能为空");
return ResultBean.success("查询成功")
.setMsg("打印队列查询成功!!!")
.setResultList(mesProduceSnPrintService.findMesPrintQueueList(printQueue));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,30 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartProdGroupService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup;
import cn.estsh.i3plus.pojo.mes.repository.MesPartProdGroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-24 11:06
*/
@Service
public class MesPartProdGroupService implements IMesPartProdGroupService {
@Autowired
private MesPartProdGroupRepository partProdGroupRepository;
@Override
public List<MesPartProdGroup> queryMesPartProdGroup(MesPartProdGroup partProdGroup) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(partProdGroup.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(partProdGroup.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE,ddlPackBean);
return partProdGroupRepository.findByHqlWhere(ddlPackBean);
}
}

@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnPrintService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.IPrintQueueStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel;
@ -28,6 +29,7 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
@ -47,6 +49,7 @@ import java.util.stream.Stream;
* @CreateDate 2024/6/13 15:52
* @Modify:
**/
@Slf4j
@Service
public class MesProduceSnPrintService implements IMesProduceSnPrintService {
@ -331,7 +334,7 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
String methodCode = labelTemplate.getMethodCode();
//模板信息丢失抛出异常
if (methodCode == null) {
if (StringUtils.isEmpty(methodCode)) {
workOrderCutDb.setRemark(String.format("裁片方案[%s]模板代码[%s]方法类为空,请配置!", cutScheme.getCutCode(), labelTemplate.getTemplateCode()));
workOrderCutDb.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(workOrderCutDb, workOrderCut.getModifyUser());
@ -377,6 +380,22 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
return new ArrayList<>();
}
@Override
public List<MesPrintQueue> findMesPrintQueueList(MesPrintQueue printQueue) {
String clazz = MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfClazz(printQueue.getPrintQueueType());
List<MesPrintQueue> printQueueList = null;
try {
IPrintQueueStrategyService strategyService = (IPrintQueueStrategyService) SpringContextsUtil.getBean(clazz);
printQueueList = strategyService.execute(printQueue);
} catch (BeansException e) {
log.info("findMesPrintQueueList --- clazz:{}执行异常", clazz);
}
return printQueueList;
}
private List<MesCutSchemeEquipment> getMesCutSchemeEquipments(MesWorkOrderCut workOrderCut, List<String> cutCodeList) {
List<MesCutSchemeEquipment> cutSchemeEquipmentList = getMesCutSchemeEquipments(workOrderCut.getOrganizeCode(), cutCodeList);
// 过滤出只需要打印的裁片方案设备

@ -0,0 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintQueue;
import java.util.List;
/**
* @Description : content dataList
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/6 16:39
* @Modify:
**/
public interface IPrintQueueStrategyService {
/**
* @param model
* @return List<MesPrintQueue>
*/
List<MesPrintQueue> execute(MesPrintQueue model);
}

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.strategy;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-23 11:08
*/
@Service
public class PrintQueueDispatchService {
@Autowired
private MesLabelTemplateRepository labelTemplateRepository;
@Autowired
private MesLabelTemplateParamRepository labelTemplateParamRepository;
public MesLabelTemplate getLabelTemplate(String templateCode, String organizeCode) {
DdlPackBean templatePackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(templateCode, MesPcnExtConstWords.TEMPLATE_CODE, templatePackBean);
MesLabelTemplate mesLabelTemplate = labelTemplateRepository.getByProperty(templatePackBean);
if (mesLabelTemplate != null) {
//级联获取labelTemplateParam
DdlPackBean templateParamPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(mesLabelTemplate.getId(), "templateId", templateParamPackBean);
List<MesLabelTemplateParam> params = labelTemplateParamRepository.findByHqlWhere(templateParamPackBean);
mesLabelTemplate.setLabelTemplateParamList(params);
}
return mesLabelTemplate;
}
}

@ -0,0 +1,213 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.IPrintQueueStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
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.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-23 11:08
*/
@Slf4j
@Service
public class WorkOrderAssemblyPrintQueueStrategyService implements IPrintQueueStrategyService {
@Autowired
private MesPrintQueueRepository printQueueRepository;
@Autowired
private MesWorkOrderRepository workOrderRepository;
@Autowired
private MesPartProdGroupRepository partProdGroupRepository;
@Autowired
private PrintQueueDispatchService printQueueDispatchService;
@Autowired
private MesCustomerCarModelRepository customerCarModelRepository;
@Autowired
private MesWorkOrderAssemblyRepository workOrderAssemblyRepository;
@Override
public List<MesPrintQueue> execute(MesPrintQueue model) {
// 获取需要打印的打印队列
List<MesPrintQueue> printQueueList = getMesPrintQueues(model);
// 无打印直接返回
if (CollectionUtils.isEmpty(printQueueList)) return null;
// 获取工单信息
List<MesWorkOrder> workOrderList = getMesWorkOrders(model, printQueueList);
// 根据工单号对工单分组
Map<String, MesWorkOrder> workOrderMapByWorkOrderNo = workOrderList.stream().collect(Collectors.toMap(MesWorkOrder::getWorkOrderNo, Function.identity(), (x, y) -> y));
// 根据零件生产组代码分组
Map<String, MesPartProdGroup> partProdGroupMap = getMesPartProdGroupMap(model, printQueueList);
// 客户车型配置名称MAP
Map<String, MesCustomerCarModel> carModelMapByCode = getMesCustomerCarModelMap(model, workOrderList);
// 工单装配件
Map<String, List<MesWorkOrderAssembly>> workOrderAssemblyMapByWorkOrderNo = getWorkOrderAssemblyMapByWorkOrderNo(model, workOrderMapByWorkOrderNo);
// 展示打印队列列表
List<MesPrintQueue> showPrintQueueList = new ArrayList<>();
for (MesPrintQueue printQueue : printQueueList) {
MesWorkOrder mesWorkOrder = workOrderMapByWorkOrderNo.get(printQueue.getWorkOrderNo());
if (mesWorkOrder == null) {
log.info("WorkOrderAssemblyPrintQueueStrategyService --- 工单{}为空 暂不输出打印", printQueue.getWorkOrderNo());
continue;
}
printQueue.setWorkOrderTypeName(MesExtEnumUtil.ORDER_TYPE.valueOfDescription(mesWorkOrder.getWorkOrderType()));
MesPartProdGroup mesPartProdGroup = partProdGroupMap.get(printQueue.getPartProdGroupCode());
String printTemplate = mesPartProdGroup.getPrintTemplate();
if (StringUtils.isEmpty(printTemplate)) {
printQueue.setRemark("打印模板为空");
printQueue.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(printQueue, model.getModifyUser());
continue;
}
MesLabelTemplate labelTemplate = printQueueDispatchService.getLabelTemplate(printTemplate, model.getOrganizeCode());
//根据反射获取策略类--封装打印数据
String methodCode = labelTemplate.getMethodCode();
//模板信息丢失抛出异常
if (StringUtils.isEmpty(methodCode)) {
printQueue.setRemark(String.format("模板代码[%s]方法类为空,请配置!", labelTemplate.getTemplateCode()));
printQueue.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(printQueue, model.getModifyUser());
continue;
}
Map<String, Object> modelMap = new HashMap<>();
modelMap.put("mesWorkOrder", mesWorkOrder);
modelMap.put("mesPartProdGroup", mesPartProdGroup);
MesCustomerCarModel customerCarModel = carModelMapByCode.get(mesWorkOrder.getCarModelCode());
if (customerCarModel != null) {
modelMap.put("mesCustomerCarModel", customerCarModel);
}
List<MesWorkOrderAssembly> workOrderAssemblyListByWorkOrderNo = workOrderAssemblyMapByWorkOrderNo.get(printQueue.getWorkOrderNo());
if (!CollectionUtils.isEmpty(workOrderAssemblyListByWorkOrderNo)) {
modelMap.put("mesWorkOrderAssemblyList", workOrderAssemblyListByWorkOrderNo);
}
MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel();
mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate);
mesProduceSnPrintModel.setSourceData(modelMap);
mesProduceSnPrintModel.setPrinter(mesPartProdGroup.getPrinter());
MesProduceSnPrintModel snPrintModel = null;
try {
IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode);
snPrintModel = strategyService.execute(null, mesProduceSnPrintModel, null, null, null ,false);
} catch (BeansException e) {
printQueue.setRemark(String.format("模板代码[%s]方法类[%s]执行异常,请配置!", labelTemplate.getTemplateCode(), labelTemplate.getMethodCode()));
ConvertBean.serviceModelUpdate(printQueue, model.getModifyUser());
printQueue.setSystemSyncStatus(CommonEnumUtil.FALSE);
continue;
}
printQueue.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
printQueue.setPrintTime(TimeTool.getNowTime(true));
ConvertBean.serviceModelUpdate(printQueue, model.getModifyUser());
printQueue.setPrintContent(snPrintModel.getPrintContextList());
printQueue.setSystemSyncStatus(CommonEnumUtil.FALSE);
showPrintQueueList.add(printQueue);
}
printQueueRepository.saveAll(printQueueList);
return showPrintQueueList;
}
private Map<String, List<MesWorkOrderAssembly>> getWorkOrderAssemblyMapByWorkOrderNo(MesPrintQueue model, Map<String, MesWorkOrder> workOrderMapByWorkOrderNo) {
List<String> workOrderNoList = workOrderMapByWorkOrderNo.keySet().stream().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
List<MesWorkOrderAssembly> workOrderAssemblyList = workOrderAssemblyRepository.findByHqlWhere(packBean);
Map<String, List<MesWorkOrderAssembly>> workOrderAssemblyMapByWorkOrderNo = workOrderAssemblyList.stream().collect(Collectors.groupingBy(MesWorkOrderAssembly::getWorkOrderNo));
return workOrderAssemblyMapByWorkOrderNo;
}
private Map<String, MesCustomerCarModel> getMesCustomerCarModelMap(MesPrintQueue model, List<MesWorkOrder> workOrderList) {
List<String> carModelCodeList = workOrderList.stream().map(MesWorkOrder::getCarModelCode).distinct().collect(Collectors.toList());
// 客户车型配置
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getInPackList(carModelCodeList, MesPcnExtConstWords.CAR_MODEL_CODE, packBean);
List<MesCustomerCarModel> customerCarModelList = customerCarModelRepository.findByHqlWhere(packBean);
Map<String, MesCustomerCarModel> carModelMapByCode = customerCarModelList.stream().collect(Collectors.toMap(MesCustomerCarModel::getCarModelCode, Function.identity(), (x, y) -> y));
return carModelMapByCode;
}
private Map<String, MesPartProdGroup> getMesPartProdGroupMap(MesPrintQueue model, List<MesPrintQueue> printQueueList) {
// 生产零件号
List<String> partProdGroupCodeList = printQueueList.stream().map(MesPrintQueue::getPartProdGroupCode).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
//DdlPreparedPack.getInPackList(workCenterCodeList, MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getInPackList(partProdGroupCodeList, MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
List<MesPartProdGroup> partProdGroupList = partProdGroupRepository.findByHqlWhere(packBean);
return partProdGroupList.stream().collect(Collectors.toMap(MesPartProdGroup::getPartProdGroupCode, Function.identity(), (x,y) -> y));
}
private List<MesWorkOrder> getMesWorkOrders(MesPrintQueue model, List<MesPrintQueue> printQueueList) {
List<String> workOrderNoList = printQueueList.stream().map(MesPrintQueue::getWorkOrderNo).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
return workOrderRepository.findByHqlWhere(packBean);
}
private List<MesPrintQueue> getMesPrintQueues(MesPrintQueue model) {
Pager pager = new Pager();
pager.setStartRow(1);
pager.setCurrentPage(1);
pager.setPageSize(30);
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getInPackList(Arrays.asList(model.getWorkCenterCodeQuery().split(MesPcnExtConstWords.COMMA)), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getInPackList(Arrays.asList(model.getPartProdGroupCodeQuery().split(MesPcnExtConstWords.COMMA)), MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
DdlPreparedPack.getIsNull(MesPcnExtConstWords.REMARK, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_QUEUE_TYPE.WORK_ORDER_ASSEMBLY.getValue(), MesPcnExtConstWords.PRINT_QUEUE_TYPE, packBean);
return printQueueRepository.findByHqlWherePage(packBean, pager);
}
}

@ -0,0 +1,109 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:43
* @Modify:
**/
@Component
@Slf4j
public class AssemblyVisualListPrintStrategy implements IPrintTemplateStrategyService {
//@Autowired
//private MesCutSchemeFgRepository cutSchemeFgRepository;
//
//@Autowired
//private MesCutSchemeMaterialRepository cutSchemeMaterialRepository;
//
//@Autowired
//private MesCutSchemeEquipmentRepository cutSchemeEquipmentRepository;
//
//@Autowired
//private MesCutSchemeEquipmentDetailRepository cutSchemeEquipmentDetailRepository;
@Override
public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel model, MesNumberRule numberRule , StepResult stepResult, StationRequestBean reqBean, Boolean isStep) {
Map<String, Object> modelMap = (Map<String, Object>) model.getSourceData();
// 工单信息
MesWorkOrder workOrder = (MesWorkOrder) modelMap.get("mesWorkOrder");
// 零件生产组信息
MesPartProdGroup partProdGroup = (MesPartProdGroup) modelMap.get("mesPartProdGroup");
// 客户车型配置信息
MesCustomerCarModel customerCarModel = modelMap.containsKey("mesCustomerCarModel") ? (MesCustomerCarModel) modelMap.get("mesCustomerCarModel") : null;
// 工单装配件信息
List<MesWorkOrderAssembly> workOrderAssemblyList = modelMap.containsKey("mesWorkOrderAssemblyList") ? (List<MesWorkOrderAssembly>) modelMap.get("mesWorkOrderAssemblyList") : null;
if (!CollectionUtils.isEmpty(workOrderAssemblyList)) workOrderAssemblyList.sort(Comparator.comparing(MesWorkOrderAssembly::getDisplaySeq));
// 返回的结果集合
List<Map<String, Object>> printDataMapList = new ArrayList<>();
// 单个标签参数值
Map<String, Object> resultMap = new HashMap<>();
// 车型名称
resultMap.put(MesPcnExtConstWords.CAR_MODEL_NAME, customerCarModel == null ? "" : customerCarModel.getCarModelName());
// vinCode
resultMap.put(MesPcnExtConstWords.VIN_CODE, workOrder.getVinCode());
// vinCode 后四位
resultMap.put(MesPcnExtConstWords.VIN_CODE_AFTER_FOUR, workOrder.getVinCode());
// 总成零件号
resultMap.put(MesPcnExtConstWords.PART_NO, workOrder.getPartNo());
// 工单标识
resultMap.put(MesPcnExtConstWords.ORDER_FLAG, workOrder.getOrderFlag());
// 客户订单号
resultMap.put(MesPcnExtConstWords.CUST_ORDER_NO, workOrder.getCustOrderNo());
// 客户零件号
resultMap.put(MesPcnExtConstWords.CUST_PART_NO, workOrder.getPartNo());
// 客户条码
resultMap.put(MesPcnExtConstWords.SN, workOrder.getSn());
// 车型名称
resultMap.put(MesPcnExtConstWords.REMARK, customerCarModel == null ? "" : customerCarModel.getRemark());
// 重打印
resultMap.put(MesPcnExtConstWords.REPRINT, "");
// EDI接口时间 取工单plan_start_time
resultMap.put(MesPcnExtConstWords.EDI_REC_TIME, workOrder.getPlanStartTime());
// 总个数
Integer totalCount = partProdGroup.getTotalCount();
// 为空时显示内容
String isNullViewContent = StringUtils.isEmpty(partProdGroup.getIsNullViewContent()) ? "" : partProdGroup.getIsNullViewContent();
for (Integer index = 0; index < totalCount; index++) {
String displayValue = workOrderAssemblyList.size() -1 < index ? isNullViewContent : workOrderAssemblyList.get(0).getDisplayValue();
resultMap.put(MesPcnExtConstWords.ASSEMBLY_PARAM + (index+1), StringUtils.isEmpty(displayValue) ? "" : displayValue);
}
printDataMapList.add(resultMap);
model.setPrintContextList(packResultMapList(model, printDataMapList));
return model;
}
private List<Map<String, Object>> packResultMapList(MesProduceSnPrintModel printModel, List<Map<String, Object>> printTemplateDateList) {
List<Map<String, Object>> resultMapList = new ArrayList<>();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.LABEL_TEMPLATE, printModel.getMesLabelTemplate());
resultMap.put(MesPcnExtConstWords.TEMPLATE_DATA, printTemplateDateList);
resultMap.put(MesPcnExtConstWords.TEMPLATE_CODE, printModel.getMesLabelTemplate().getTemplateCode());
resultMap.put(MesPcnExtConstWords.PRINTER, printModel.getPrinter());
resultMapList.add(resultMap);
return resultMapList;
}
}

@ -24,12 +24,12 @@ import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblyGeneratePartNoStepService2")
public class MesAssemblyGeneratePartNoStepService2 extends BaseStepService {
@Service("mesAssemblyMatchNosortRetrodictStepService")
public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService {
@Autowired
private IFsmCommonService fsmCommonService;
@ -124,15 +124,19 @@ public class MesAssemblyGeneratePartNoStepService2 extends BaseStepService {
//未知腔数配置【工位参数】, 不验证装配件条码的个数
String cavityUnknownCfg = getCavityUnknownCfg(reqBean);
//根据设备代码获取可复用条码的个数
Integer repeatAssemblySnCount = productionCustomContextStepService.getRepeatAssemblySnCount(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode());
Integer repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : 1);
//非未知腔数,验证装配件条码个数是否匹配 腔数或者未匹配的主条码个数*每腔个数
if (StringUtils.isEmpty(cavityUnknownCfg) && equipVariableCollectContextList.size() != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) {
if (StringUtils.isEmpty(cavityUnknownCfg) && (equipVariableCollectContextList.size() + repeatAssemblySnAmount) != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) {
String suffix = repeatAssemblySnAmount == 0 ? MesPcnExtConstWords.EMPTY : String.format(",可复用个数[%s]", repeatAssemblySnAmount);
if (!CollectionUtils.isEmpty(curProductionPsInContextList)) {
productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toList()));
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN),
String.format("当前装配件条码个数[%s]不满足主条码个数[%s]每腔个数[%s]配置!", equipVariableCollectContextList.size(), curProductionPsInContextList.size(), cellEquipContext.getBindQty()));
String.format("当前装配件条码个数[%s]%s不满足主条码个数[%s]每腔个数[%s]配置!", equipVariableCollectContextList.size(), suffix, curProductionPsInContextList.size(), cellEquipContext.getBindQty()));
} else {
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY),
String.format("当前装配件条码个数[%s]不满足腔数[%s]每腔个数[%s]配置!", equipVariableCollectContextList.size(), cellEquipContext.getCavity(), cellEquipContext.getBindQty()));
String.format("当前装配件条码个数[%s]%s不满足腔数[%s]每腔个数[%s]配置!", equipVariableCollectContextList.size(), suffix, cellEquipContext.getCavity(), cellEquipContext.getBindQty()));
}
}
@ -249,54 +253,48 @@ public class MesAssemblyGeneratePartNoStepService2 extends BaseStepService {
if (null == productionAssemblyNosortContext) continue;
//非扫描模式 或者 扫描模式情况下非可复用件
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) != 0 ||
StringUtils.isEmpty(productionAssemblyNosortContext.getIsRepeat()) || productionAssemblyNosortContext.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) {
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) {
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) {
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
//匹配规则
Map<String, Object> result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext);
//匹配规则
Map<String, Object> result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext);
//匹配失败
if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) {
String msg = (String) result.get(MesPcnExtConstWords.MESSAGE);
stepResult.obj(String.format("%s%s", StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj(), StringUtils.isEmpty(msg) ? MesPcnExtConstWords.EMPTY : msg));
continue;
}
//匹配失败
if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) {
String msg = (String) result.get(MesPcnExtConstWords.MESSAGE);
stepResult.obj(String.format("%s%s", StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj(), StringUtils.isEmpty(msg) ? MesPcnExtConstWords.EMPTY : msg));
continue;
}
MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA);
MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA);
//前道防错
if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) {
if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(),
String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode())));
continue;
}
//前道防错
if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) {
if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(),
String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode())));
continue;
}
}
//时效性验证
if (!StringUtils.isEmpty(filter.getProductSnId())) {
result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue());
if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE)));
continue;
}
//时效性验证
if (!StringUtils.isEmpty(filter.getProductSnId())) {
result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue());
if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE)));
continue;
}
}
//装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus(equipVariableCollectContext.getEquipVariableValue()).productSnId(filter.getProductSnId());
//临时数据标记已消费
equipVariableCollectContext.isConsume();
//装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus(equipVariableCollectContext.getEquipVariableValue()).productSnId(filter.getProductSnId());
break;
//临时数据标记已消费
equipVariableCollectContext.isConsume();
}
break;
}

@ -80,7 +80,7 @@ public class MesCustomDialogStepService extends BaseStepService {
if (!scdBean.getIsAsyn()) stepSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "弹框会话开启!");
//弹框业务异步处理
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "弹框会话开启!");
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "弹框会话开启!");
}

@ -25,14 +25,12 @@ 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.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :

@ -36,6 +36,9 @@ public class MesWorkOrderCutSaveStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
//保存开模记录工步
((IStepService) SpringContextsUtil.getBean("mesMouldRecordGenerateStepService")).executeInState(reqBean);
//保存裁片工单条码工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutProductSnSaveStepService")).executeInState(reqBean);

@ -56,14 +56,14 @@ redis.hostName=10.193.30.9
#\u7AEF\u53E3\u53F7
redis.port=6379
#\u5982\u679C\u6709\u5BC6\u7801
redis.password=ABCabc123!@#
redis.password=(mfLEu7@9kmfdsTy
##\u5176\u4ED6redis\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################## rabbitMQ\u914D\u7F6E ####################
spring.rabbitmq.vhost=/
spring.rabbitmq.host=10.193.30.18
spring.rabbitmq.port=15672
spring.rabbitmq.username=root
spring.rabbitmq.password=ABCabc123!@#
spring.rabbitmq.password=(mfLEu7@9kmfdsTy
##\u5176\u4ED6rabbitMq\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################ \u529F\u80FD\u914D\u7F6E2 ################
#\u662F\u5426\u5F00\u542Fredis
@ -134,14 +134,14 @@ 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.193.30.20:3306/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.write.datasource.jdbc-url=jdbc:mysql://10.193.30.20:3306/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8&allowMultiQueries=true
impp.write.datasource.username=root
impp.write.datasource.password=@E#e7@saWE!293**((367
impp.write.datasource.password=(mfLEu7@9kmfdsTy
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.193.30.17:3306/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.read.datasource.jdbc-url=jdbc:mysql://10.193.30.17:3306/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8&allowMultiQueries=true
impp.read.datasource.username=root
impp.read.datasource.password=@E#e7@saWE!293**((367
impp.read.datasource.password=(mfLEu7@9kmfdsTy
#
@ -151,7 +151,7 @@ impp.schedule.open=true
impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver
impp.schedule.datasource.jdbc-url=jdbc:mysql://10.193.30.20:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.schedule.datasource.username=root
impp.schedule.datasource.password=@E#e7@saWE!293**((367
impp.schedule.datasource.password=(mfLEu7@9kmfdsTy
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

@ -244,7 +244,7 @@ public class MesProdRuleContext implements Serializable {
//排序装配件清单
public List<MesProductionAssemblySortContext> getSortAssemblyDataContext() {
List<MesProductionAssemblySortContext> sortAssemblyList = !StringUtils.isEmpty(this.assemblyDataJson) ? JSONObject.parseArray(this.assemblyDataJson, MesProductionAssemblySortContext.class) : null;
return CollectionUtils.isEmpty(sortAssemblyList) ? null : sortAssemblyList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProductionAssemblySortContext::getProcessSeq).thenComparing(MesProductionAssemblySortContext::getRouteSeq)).collect(Collectors.toList());
return CollectionUtils.isEmpty(sortAssemblyList) ? null : sortAssemblyList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessSeq()))).sorted(Comparator.comparing(MesProductionAssemblySortContext::getProcessSeq).thenComparing(MesProductionAssemblySortContext::getRouteSeq)).collect(Collectors.toList());
}
}

@ -114,12 +114,6 @@ public class MesProductionPartContext implements Serializable {
// 裁片功能
@ApiParam("裁片方案代码")
private String cutCode;
@ApiParam("标包数量")
private Double packageQty;
@ApiParam("包装条码规则")
private String packageSnRule;
// 裁片功能
//根据一模多腔赋值

@ -1,5 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.util;
import io.swagger.annotations.ApiParam;
/**
* @Description :
* @Reference :
@ -548,4 +550,24 @@ public class MesPcnExtConstWords {
public static final String PACKAGE_PART_NO = "packagePartNo";
//规则类型
public static final String RULE_TYPE = "ruleType";
// 打印队列类型
public static final String PRINT_QUEUE_TYPE = "printQueueType";
// 车型名称
public static final String CAR_MODEL_NAME = "carModelName";
// VIN_CODE
public static final String VIN_CODE = "vinCode";
// VIN_CODE 后四位
public static final String VIN_CODE_AFTER_FOUR = "vinCodeAfterFour";
// 工单标识
public static final String ORDER_FLAG = "orderFlag";
// 重打印
public static final String REPRINT = "reprint";
// EDI接收时间
public static final String EDI_REC_TIME = "ediRecTime";
// 装配件参数
public static final String ASSEMBLY_PARAM = "assemblyParam";
}

Loading…
Cancel
Save