42602 发运后,客退品返工,生成并打印新条码

42582 线边库存报表
tags/yfai-pcn-ext-v1.7
jun 11 months ago
parent 879b6d2f93
commit 3f4af68ed3

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskRequestModel;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
@ -39,4 +40,6 @@ public interface IMesReworkTaskService {
void reworkSuccess(MesReworkTaskRequestModel requestModel);
MesProduceSnPrintModel doPrint(MesReworkTaskRequestModel requestModel);
}

@ -131,4 +131,20 @@ public class MesReworkTaskController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/doPrint")
@ApiOperation(value = "打印")
public ResultBean doPrint(MesReworkTaskRequestModel requestModel) {
// 数据校验
ValidatorBean.checkNotNull(requestModel.getSn(), "条码不能为空");
ValidatorBean.checkNotNull(requestModel.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(requestModel.getUserName(), "操作人不能为空");
try {
return ResultBean.success("打印成功").setResultObject(mesReworkTaskService.doPrint(requestModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -1,28 +1,33 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesReworkTaskService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
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.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskRequestModel;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
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.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPartTypePicture;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspection;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTaskDetail;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
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.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger;
@ -34,7 +39,6 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@ -76,6 +80,21 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
@Autowired
private IMesTemplateService mesTemplateService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IMesPartService mesPartService;
@Autowired
private MesMoveRepository moveRepository;
@Autowired
private MesProductionRecordRepository mesProductionRecordRepository;
@Override
public ListPager<MesReworkTask> queryReworkTask(MesReworkTask mesReworkTask, Pager pager) {
String organizeCode = !StringUtils.isEmpty(mesReworkTask.getOrganizeCode())?mesReworkTask.getOrganizeCode():AuthUtil.getOrganizeCode();
@ -206,6 +225,69 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
}
@Override
public MesProduceSnPrintModel doPrint(MesReworkTaskRequestModel requestModel) {
String organizeCode = requestModel.getOrganizeCode();
String userName = requestModel.getUserName();
MesReworkTask mesReworkTask = getMesReworkTask(requestModel);
List<MesReworkTaskDetail> reworkTaskDetails = getMesReworkTaskDetail(mesReworkTask);
if (!CollectionUtils.isEmpty(reworkTaskDetails)) {
MesPcnException.throwFlowException("还有位置未返工完成,请检查");
}
MesProduceSn sn = checkProduceSn(requestModel.getSn(), organizeCode);
//查询物料信息
MesPart mesPart = mesPartService.getMesPartByPartNo(sn.getPartNo(), organizeCode);
String prodLabelTemplate = sn.getProdLabelTemplate();
if (prodLabelTemplate == null) {
MesPcnException.throwMesBusiException("零件号[%s]的模板代码[%s]的模板信息丢失,请配置!", sn.getPartNo(), prodLabelTemplate);
}
MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel();
// 查模板代码
MesLabelTemplate labelTemplate = mesTemplateService.getMesLabelTemplate(prodLabelTemplate,organizeCode);
//根据反射获取策略类--封装打印数据
String methodCode = labelTemplate.getMethodCode();
//模板信息丢失抛出异常
if (methodCode == null) {
MesPcnException.throwMesBusiException("零件号[%s]的模板代码[%s]的反射类丢失,请配置!", sn.getPartNo(), prodLabelTemplate);
}
mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate);
mesProduceSnPrintModel.setProductSn(sn.getProductSn());
mesProduceSnPrintModel.setPartNo(sn.getPartNo());
mesProduceSnPrintModel.setOrganizeCode(organizeCode);
List<MesProduceSn> snList = new ArrayList<>();
sn.setDescription(String.format("源条码:%s",sn.getProductSn()));
sn.setProductSn(doGererateSerialNo(mesPart, organizeCode, requestModel.getUserName()));
snList.add(sn);
mesProduceSnPrintModel.getMesProduceSnList().addAll(snList);
//发送新老条码关系给WMS
createMove(requestModel.getSn(),sn.getProductSn(),organizeCode,requestModel.getUserName());
//更新条码
ConvertBean.serviceModelUpdate(sn,requestModel.getUserName());
mesProduceSnRepository.update(sn);
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(requestModel.getSn(),"productSn",packBean);
DdlPreparedPack.getStringEqualPack(sn.getPartNo(),"partNo",packBean);
//更新加工记录
mesProductionRecordRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime","productSn","description"},
new Object[]{userName, TimeTool.getNowTime(true),sn.getProductSn(),sn.getDescription()},packBean);
//更新装配记录
mesProductionAssemblyRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime","productSn","description"},
new Object[]{userName, TimeTool.getNowTime(true),sn.getProductSn(),sn.getDescription()},packBean);
//更新返工记录
mesReworkTaskRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime","sn","description"},
new Object[]{userName, TimeTool.getNowTime(true),sn.getProductSn(),sn.getDescription()},packBean);
IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode);
return strategyService.execute(null, mesProduceSnPrintModel, null, null, null, true);
}
private String doGererateSerialNo(MesPart part,String organizeCode,String userName) {
if(StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo());
return syncFuncService.syncSerialNo(
new GenSerialNoModel(part.getProductMatchRule()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(organizeCode),
userName, organizeCode, 1).getResultList().get(0).toString();
}
@Override
public boolean validateSn(MesReworkTaskRequestModel requestModel) {
//
List<String> snList = Arrays.asList(requestModel.getSn().split(","));
@ -448,4 +530,17 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
return produceSn;
}
private MesMove createMove(String sn, String oldSn, String organizeCode, String userName) {
MesMove move = new MesMove();
move.setOrganizeCode(organizeCode);
move.setFactoryCode(organizeCode);
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.REWORK_REPLACE.getValue());
move.setProductSn(sn);
move.setProductSnOld(oldSn);
ConvertBean.serviceModelInitialize(move, userName);
return moveRepository.insert(move);
}
}

@ -132,8 +132,8 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
//updateLoadingListClose(statusForCheckList,orderManagement,shippingOrderManagement.getModifyUser());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "id",packBean);
shippingOrderManagementRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime","remark"},
new Object[]{shippingOrderManagement.getModifyUser(), TimeTool.getNowTime(true),MesPcnExtConstWords.STRONGER_PASS}, packBean);
shippingOrderManagementRepository.updateByProperties(new String[]{"forceFlag","modifyUser", "modifyDatetime","remark"},
new Object[]{MesPcnExtConstWords.STRONGER_PASS,shippingOrderManagement.getModifyUser(), TimeTool.getNowTime(true),MesPcnExtConstWords.STRONGER_PASS}, packBean);
}else{
throw new ImppBusiException(String.format("【%s】发运单对应排序【%s】前存在未扫描发运的发运单请检查数据",
orderManagement.getShippingCode(), orderManagement.getSeq()));

@ -7,7 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionRecordService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
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.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
@ -154,8 +153,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
DdlPreparedPack.getStringLikerPack(workOrder.getWorkCellCode(), "workCellCode", packBean);
DdlPreparedPack.getStringLikerPack(workOrder.getWorkOrderNo(), "workOrderNo", packBean);
if (!StringUtils.isEmpty(workOrder.getWorkOrderStatus())) DdlPreparedPack.getNumEqualPack(workOrder.getWorkOrderStatus(), "workOrderStatus", packBean);
else DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList()), "workOrderStatus", packBean);
if (!StringUtils.isEmpty(workOrder.getWorkOrderStatus()))
DdlPreparedPack.getNumEqualPack(workOrder.getWorkOrderStatus(), "workOrderStatus", packBean);
else
DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList()), "workOrderStatus", packBean);
DdlPreparedPack.getStringBiggerPack(workOrder.getStartTimeStart(), "planStartTime", packBean);
DdlPreparedPack.getStringSmallerPack(workOrder.getStartTimeEnd(), "planStartTime", packBean);
@ -245,6 +246,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
for (MesProduceSn produceSn : mesWorkOrderList) {
String nowTime = TimeTool.getNowTime(true);
for (MesBom mesBom : mesBoms) {
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo());
@ -266,7 +268,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType());
newMesProductOffLine.setSapWorkCenter(oldMesWorkOrder.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode());
newMesProductOffLine.setDescription(nowTime);
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
mesProductOffLineList.add(newMesProductOffLine);
}
@ -274,6 +276,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
}
public void doPcnJobProductReport(List<MesProductionRecord> mesProductionRecordList, List<MesShift> mesShiftList, String organizeCode, String userName, MesWorkOrder mesWorkOrderDb) {
//查询物料信息
@ -340,6 +343,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName) {
//修改工单,需要重新同步
mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
@ -349,11 +353,13 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//保存记录
saveMesWorkOrderLog(mesWorkOrder);
}
public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) {
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id");
mesWorkOrderLogRepository.insert(workOrderLog);
}
public List<MesBom> findBomList(String organizeCode, MesPart mesPart, String bomVersion) {
List<MesBom> bomData = new ArrayList<>();
// 递归展开 BOM
@ -391,6 +397,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
// 返回汇总数据
return new ArrayList<>(summaryBomMap.values());
}
/**
* BOM
*
@ -418,6 +425,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
}
}
public List<MesBom> findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
@ -432,6 +440,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//如果存在多个bomCode取最新的一个
return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode());
}
private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean);
@ -476,8 +485,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
report(productionRecord, organizeCode, userName, oldMesWorkOrderList);
}
catch (Exception e) {
} catch (Exception e) {
String msg = e.getMessage();
if (e instanceof ImppBusiException) {
msg = ((ImppBusiException) e).getErrorMsg();
@ -487,6 +495,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
productionRecordService.updateProductionRecord(organizeCode, userName, productionRecord.getId(), msg);
}
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, readOnly = false, rollbackFor = Exception.class)
public void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) {
@ -515,6 +524,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
/**
*
*
* @param oldMesWorkOrderList
* @param mesWorkCenter
* @return
@ -671,6 +681,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
/**
*
*
* @param productionRecord
* @param organizeCode
* @return
@ -799,6 +810,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
/**
* flag = 1 1 = 2
*
* @param lotNo
* @param flag
* @return
@ -834,6 +846,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
return mesProductVersion;
}
@Override
public List<MesProductionRecord> getUnReportMesProduceSn(String organizeCode) {
@ -935,6 +948,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
return productionRecordRao.findByHqlWhere(ddlPackBean);
}
@Override
public List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode, List<MesProductionRecord> mesProductionRecordList) {
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
@ -1000,8 +1014,9 @@ public class MesWorkOrderService implements IMesWorkOrderService {
if (Objects.isNull(mesWorkOrderDb.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrderDb.getOrderFlag())) {
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
String nowTime = TimeTool.getNowTime(true);
for (MesBom mesBom : mesBoms) {
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom));
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, nowTime));
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
@ -1171,6 +1186,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
workOrderRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"},
new Object[]{"CLOSE_JOB", TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean);
}
public List<MesWorkOrderToWms> saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List<MesBom> mesBomList) {
List<MesWorkOrderToWms> mesWorkOrderToWmsList = new ArrayList<>();
MesWorkOrderToWms mesWorkOrderToWms = null;
@ -1187,6 +1203,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
return mesWorkOrderToWmsList;
}
private MesProductVersion checkMesProductVersion(MesWorkOrder item) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
@ -1204,12 +1221,13 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
private String getOrderNo(MesWorkOrder mesWorkOrder, MesPart mesPart, String userName) {
if (StringUtils.isEmpty(mesPart.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", mesPart.getPartNo());
if (StringUtils.isEmpty(mesPart.getProductMatchRule()))
MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", mesPart.getPartNo());
return syncFuncService.syncSerialNo(new GenSerialNoModel(mesPart.getProductMatchRule()).prodLocation(mesWorkOrder.getWorkCenterCode()).partNo(mesPart.getPartNo()).putDataMap(MesPart.class.getSimpleName(), mesPart).organizeCode(mesPart.getOrganizeCode()), userName, mesWorkOrder.getOrganizeCode(), 1).getResultList().get(0).toString();
}
private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion,
String sn, MesBom mesBom) {
String sn, MesBom mesBom, String nowTime) {
MesProductOffLine newMesProductOffLine;
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo());
@ -1231,7 +1249,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
newMesProductOffLine.setReportType(mesWorkOrder.getReportType());
newMesProductOffLine.setSapWorkCenter(mesWorkOrder.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(mesWorkOrder.getOrganizeCode());
newMesProductOffLine.setDescription(nowTime);
ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getCreateUser());
return newMesProductOffLine;
}

@ -52,4 +52,7 @@ public class MesReworkTaskRequestModel {
@ApiModelProperty("类型")
private Integer type;
@ApiModelProperty("操作人")
private String userName;
}

Loading…
Cancel
Save