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

# Conflicts:
#	modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCustomerSnTransformService.java
#	modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/shippingscan/strategy/MesShippingScanSnAndOrderStrategyServiceImpl.java
tags/yfai-pcn-ext-v2.3
臧学普 7 months ago
commit 14817b8d61

@ -12,10 +12,7 @@ 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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* @Description:
@ -32,7 +29,8 @@ public class MesCutRawErrorProofingController {
@PostMapping("/scan-sn")
@ApiOperation(value = "扫描裁片工单/原材料条码")
public ResultBean doScanSn(MesCutRawErrorProofingModel model) {
public ResultBean doScanSn(@RequestBody MesCutRawErrorProofingModel model) {
try {
MesCutRawErrorProofingModel result = cutRawErrorProofingService.doScanSn(model);
return ResultBean.success(StringUtils.isEmpty(result.getShowInfo()) ? "扫描成功" : result.getShowInfo()).setResultObject(result);
@ -74,7 +72,7 @@ public class MesCutRawErrorProofingController {
@PostMapping("/update-raw-length")
@ApiOperation(value = "修改原材料条码长度")
public ResultBean doUpdateLengthByScanSn(MesCutUpdateRawLengthModel model) {
public ResultBean doUpdateLengthByScanSn(@RequestBody MesCutUpdateRawLengthModel model) {
try {
cutRawErrorProofingService.doUpdateLengthByScanSn(model);

@ -3,19 +3,16 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionRecordService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob;
import cn.estsh.i3plus.pojo.model.wms.WmsJobParamModel;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.init.ApplicationProperties;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -25,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -55,25 +51,24 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
@Override
@Transactional
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
JSONObject jsonObject= new JSONObject();
jsonObject.putIfAbsent("organizeCode", "CK01");
jsonObject.putIfAbsent("userName", "job");
String organizeCode = jsonObject.getStr("organizeCode");
String userName = jsonObject.getStr("userName");
if (null == organizeCode){
log.error("请添加需要报工的工厂代码!");
return;
}
if (null == userName){
userName = "JOB";
}
List<WmsJobParamModel> wmsJobParamModelList = JsonUtilTool.toList(this.getJobParam(), WmsJobParamModel.class);
if (!CollectionUtils.isEmpty(wmsJobParamModelList)) {
for (WmsJobParamModel wmsJobParamModel : wmsJobParamModelList) {
try {
long startTime = System.currentTimeMillis();
// 处理无工单
handlerNoOrder(organizeCode, userName);
handlerNoOrder(wmsJobParamModel.getOrganizeCode(), "JOB");
// 处理有工单
handlerHasOrder(organizeCode, userName);
// }
handlerHasOrder(wmsJobParamModel.getOrganizeCode(), "JOB");
long endTime = System.currentTimeMillis();
log.info("工厂{}非排序报工JOB --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime);
} catch (Exception e) {
log.info("工厂{}非排序报工JOB 执行失败{}", wmsJobParamModel.getOrganizeCode(), e);
}
}
}else{
log.info("非排序报工JOB 参数不能为空");
}
}
private void handlerNoOrder(String organizeCode, String userName) {

@ -48,6 +48,8 @@ public class MesReportSortJob extends BaseMesScheduleJob {
log.info("工厂{}排序报工job 执行失败{}", wmsJobParamModel.getOrganizeCode(), e);
}
}
}else{
log.info("排序报工job 参数不能为空");
}
}
}

@ -16,12 +16,12 @@ public class MesCustomerSnTransformService implements IMesCustomerSnTransformSer
if (StringUtils.isEmpty(barCode)) return barCode;
if (barCode.length() != MesPcnExtConstWords.CUSTOMER_SN_LENGTH_GM) return barCode;
String a = barCode.substring(0, 3);
//todo 增加3-5截取
String b = barCode.substring(5, 20);
String c = barCode.substring(20, 29);
String d = barCode.substring(29, 41);
String e = barCode.substring(41, 58);
return a + (char)30 + "06" + (char)29 + b + (char)29 + c + (char)29 + d + (char)29 + e + (char)30 + (char)04;
String b = barCode.substring(3, 5);
String c = barCode.substring(5, 20);
String d = barCode.substring(20, 29);
String e = barCode.substring(29, 41);
String f = barCode.substring(41, 58);
return a + (char)30 + b + (char)29 + c + (char)29 + d + (char)29 + e + (char)29 + f + (char)30 + (char)04;
/*public static void main(String[] args) {
String barCode = "[)>06Y4110000000000XP2638975612V545238347T1A24240A2B4C0242";
String a = barCode.substring(0, 3);

@ -360,6 +360,11 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
if (StringUtils.isEmpty(model.getPartInspection())) {
partInspection = createPartInspection(model, MesExtEnumUtil.PART_INSPECTION_STATUS.FAIL.getValue(), org);
if (model.getOptType() != null && model.getOptType() == 2) {
partInspection.setRefundFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
}
model.setPartInspection(partInspectionRepository.save(partInspection));
List<String> defectTypeNoExitList = new ArrayList<>();
@ -410,6 +415,14 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
}
if (Objects.isNull(srcLocateNo)) {
srcLocateNo = configService.getCfgValue(org, "LGORT");
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(model.getPartNo(), "partNo", ddlPackBean);
MesProductVersion version = productVersionRepository.getByProperty(ddlPackBean);
if (version != null) {
srcLocateNo = version.getShipInventoryPoint();
}
}
if (model.getOptType() != 2) {
//移库
@ -475,7 +488,17 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
//移库
if (model.getOptType() != 2) {
MesMove move = createMove(model, configService.getCfgValue(org, "LGORT"), configService.getCfgValue(org, "UMLGO"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
String srcLocateNo = configService.getCfgValue(org, "LGORT");
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(model.getPartNo(), "partNo", ddlPackBean);
MesProductVersion version = productVersionRepository.getByProperty(ddlPackBean);
if (version != null) {
srcLocateNo = version.getShipInventoryPoint();
}
MesMove move = createMove(model, srcLocateNo, configService.getCfgValue(org, "UMLGO"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
moveRepository.save(move);
}
@ -729,10 +752,10 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
* @return
*/
private MesMove createMove(MesPartInspectionInputModel model, String source, String target, String org, String workCenterCode) {
if (StringUtils.isEmpty(model.getUserInfo())) model.setUserInfo("系统");
GenSerialNoModel serialNoModel = new GenSerialNoModel("INPUT_DEFECT_ZRSUM");
serialNoModel.setPartNo(model.getPart().getPartNo());
// ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, AuthUtil.getSessionUser().getUserName(), org, 1);
ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, "系统", org, 1);
ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, model.getUserInfo(), org, 1);
String zrsum = "";
if (null != rb && !CollectionUtils.isEmpty(rb.getResultList())) {
zrsum = (rb.getResultList().get(0)).toString();
@ -753,8 +776,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SUSPICIOUS_MOVE.getValue());
move.setProductSn(model.getSn());
move.setWorkCenter(prodOrgExtService.getErpWorkCenterCode(org, workCenterCode));
// ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
ConvertBean.serviceModelInitialize(move, "系统");
ConvertBean.serviceModelInitialize(move, model.getUserInfo());
return move;
}
@ -930,7 +952,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
private List<MesPartInspectionDetail> checkPartInspectionDetail(MesPartInspection partInspection, String org) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(partInspection.getId(), "pid", packBean);
DdlPreparedPack.getNumEqualPack(partInspection.getId(), MesPcnExtConstWords.PID, packBean);
List<MesPartInspectionDetail> detailList = partInspectionDetailRepository.findByHqlWhere(packBean);
return detailList;
@ -940,7 +962,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
public void saveSusPartInspection(MesPartInspectionInputModel model, String org) {
MesPartInspection partInspection = new MesPartInspection();
BeanUtils.copyProperties(model, partInspection);
BeanUtils.copyProperties(model, partInspection, MesPcnExtConstWords.ID);
partInspection.setInspectionStatus(MesExtEnumUtil.PART_INSPECTION_STATUS.FAIL.getValue());
partInspection.setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.CREATE.getValue());
partInspection.setOrganizeCode(org);
@ -954,8 +976,8 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
partInspection.setDefectTypeCode(defectType.getDefectTypeCode());
partInspection.setDefectTypeId(defectType.getId());
partInspectionRepository.save(partInspection);
ConvertBean.serviceModelInitialize(partInspection, model.getUserInfo());
partInspection = partInspectionRepository.insert(partInspection);
log.info("生成的缺陷记录id ={}", partInspection);
MesPartInspectionDetail detail = new MesPartInspectionDetail();
@ -969,7 +991,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
detail.setDefectTypeName(defectType.getDefectTypeName());
detail.setId(null);
detail.setOrganizeCode(org);
ConvertBean.serviceModelInitialize(detail, "系统");
ConvertBean.serviceModelInitialize(detail, model.getUserInfo());
partInspectionDetailRepository.insert(detail);
//
String source = configService.getCfgValue(org, "LGORT");
@ -991,7 +1013,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
}
}
MesMove move = createMove(model, source, configService.getCfgValue(org, "UMLGO"), org, model.getWorkCenterCode());
moveRepository.save(move);
moveRepository.insert(move);
}
@ApiOperation(value = "客退品查询")

@ -397,8 +397,17 @@ public class MesNcProcessingService implements IMesNcProcessingService {
partInspectionRepository.save(model.getPartInspection());
String target = configService.getCfgValue(org, "LGORT");
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(model.getPart().getPartNo(), "partNo", ddlPackBean);
MesProductVersion version = productVersionRepository.getByProperty(ddlPackBean);
if (version != null) {
target = version.getShipInventoryPoint();
}
//移库 转正常、放行8000移至2000
MesMove move = createMove(model, sourceValue, configService.getCfgValue(org, "LGORT"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
MesMove move = createMove(model, sourceValue, target, org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);

@ -10,7 +10,6 @@ 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.MesProdShiftRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -160,10 +159,12 @@ public class MesProduceSnExtService implements IMesProduceSnExtService {
@Override
public void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList) {
idList = CollectionUtils.isEmpty(idList) ? idList : idList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(idList)) return;
DdlPackBean packBean = new DdlPackBean();
DdlPreparedPack.getStringEqualPack(reqBean.getOrganizeCode(), MesPcnExtConstWords.ORGANIZE_CODE, packBean);
DdlPreparedPack.getInPackList(idList, MesPcnExtConstWords.ID, packBean);
if (idList.size() == 1) DdlPreparedPack.getNumEqualPack(idList.get(0), MesPcnExtConstWords.ID, packBean);
else DdlPreparedPack.getInPackList(idList, MesPcnExtConstWords.ID, packBean);
produceSnRepository.updateByProperties(
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE, MesPcnExtConstWords.SN_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), snStatus},

@ -201,6 +201,8 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
resultModel.getMesProduceSnList().forEach(mesProduceSn -> {
mesProduceSn.setWorkCenterCode(workCenterCode);
mesProduceSn.setPrintCount(MesPcnExtConstWords.ONE);
mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
mesProduceSn.setFid(UUID.randomUUID().toString());
//保存条码
mesProduceSnRDao.insert(mesProduceSn);

@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPullingOrderInfoService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
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.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
@ -185,6 +186,7 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
pullingOrderInfo.setPullingOrderPartInfos(pullingOrderPartInfos);
}
pullingOrderInfo.setPrintTime(TimeTool.getNowTime(true));
pullingOrderInfo.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
ConvertBean.serviceModelUpdate(pullingOrderInfo, userName);
}

@ -128,11 +128,15 @@ public class MesRawPartChargingServiceImpl implements IMesRawPartChargingService
if (!CollectionUtils.isEmpty(mesRawPartCharging)) {
MesPcnException.throwMesBusiException("料筒条码【%s】与原料条码【%s】已绑定", mesRawPartChargingModel.getPackageSn(), mesRawPartCharging.iterator().next().getSn());
}
//保存生产控制加料
//保存生产控制加料 43302 加料防错扫码流程优化
String[] split = mesRawPartChargingModel.getSn().split(",");
for (String sn : split) {
mesRawPartChargingModel.setSn(sn);
MesRawPartCharging charging = insertRawPartCharging(mesRawPartChargingModel);
//保存日志
saveLog(mesRawPartChargingModel, charging, MesExtEnumUtil.CHARGING_LOG_STATUS.FEEDING);
}
}
public void doMesRawPartChargingInit(MesRawPartChargingModel mesRawPartChargingModel) {

@ -395,14 +395,19 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
DdlPackBean packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingCode(),"shippingCode",packBean);
MesLoadingListDetail listDetail = listDetailRepository.getByProperty(packBean);
MesLoadingList loadingList = null;
if(!Objects.isNull(listDetail)){
packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(listDetail.getPid(), "id", packBean);
MesLoadingList loadingList = listRepository.getByProperty(packBean);
loadingList = listRepository.getByProperty(packBean);
if(!Objects.isNull(loadingList)){
orderManagement.setOrderCode(loadingList.getOrderCode());
orderManagement.setLoadingListId(loadingList.getId());
}
//更新装车单明细对应的发运单状态=发运
listDetail.setStatus(MesExtEnumUtil.LOADING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
ConvertBean.serviceModelUpdate(listDetail, userInfo);
listDetailRepository.update(listDetail);
}
//发运单状态修改为校验完成
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
@ -429,11 +434,10 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
detail.setRemark(managementDetail.getRemark());
detail.setStatus(managementDetail.getStatus());
detail.setBarcode(managementDetail.getBarcode());
detail.setVisualOrderNo(managementDetail.getVisualOrderNo());
DdlPreparedPack.getStringEqualPack(detail.getBarcode(), "productSn", packBean);
}
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
detail.setActualQty(1);
ConvertBean.serviceModelUpdate(detail, userInfo);
//更新条码信息,更新目视单信息
if(!StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
@ -454,7 +458,13 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
}
}
//条码格式(扫描目视单,扫描条码)
if(!StringUtil.isEmpty(detail.getVisualOrderNo())){
detail.setBarcode(new StringJoiner(MesPcnExtConstWords.COMMA).add(detail.getVisualOrderNo()).add(detail.getBarcode()).toString());
}
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
detail.setActualQty(MesPcnExtConstWords.ONE);
ConvertBean.serviceModelUpdate(detail, userInfo);
}
//更新条码
if(!CollectionUtils.isEmpty(produceSnList)){
@ -467,15 +477,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
//更新发运单
ConvertBean.serviceModelUpdate(orderManagement,userInfo);
update(orderManagement);
//不记忆时更新明细
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
shippingOrderManagementDetailRepository.saveAll(orderManagementDetailList);
//1.更新装车单明细对应的发运单状态=发运
DdlPackBean vehiclesOrderDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingCode(), "shippingCode", vehiclesOrderDetailPackBean);
MesLoadingListDetail vehiclesOrderDetail = vehiclesOrderDetailRepository.getByProperty(vehiclesOrderDetailPackBean);
if(!StringUtil.isEmpty(vehiclesOrderDetail)){
vehiclesOrderDetail.setStatus(MesExtEnumUtil.LOADING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
ConvertBean.serviceModelUpdate(vehiclesOrderDetail, userInfo);
vehiclesOrderDetailRepository.save(vehiclesOrderDetail);
}
if(StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())){
//发送数据给辊道线
@ -502,9 +506,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
//保存当前发运单明细报工
jisShippingRepository.saveAll(getMesJisShippings(mesShippingOrderManagement,userInfo));
}
if(!StringUtil.isEmpty(vehiclesOrderDetail)){
MesLoadingList loadingList = vehiclesOrderRepository.getById(vehiclesOrderDetail.getPid());
//更新装车单
if (!StringUtils.isEmpty(loadingList)) {
loadingList.setSystemSyncStatus(CommonEnumUtil.FALSE);
loadingList.setStatus(MesExtEnumUtil.MES_LOADING_STATUS.ASN.getValue());
@ -513,7 +515,6 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
}
}
}
}

@ -674,7 +674,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
List<MesMove> mesMoveList = new ArrayList<>();
// 排除重复的数据
Map<MesBom, List<MesBom>> map = mesBoms.stream().collect(Collectors.groupingBy(mesBom -> {
MesBom bom = new MesBom();
@ -682,9 +682,44 @@ public class MesWorkOrderService implements IMesWorkOrderService {
bom.setItemPartNo(mesBom.getItemPartNo());
return bom;
}));
if(MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == productionRecord.getReportType()){
for (Map.Entry<MesBom, List<MesBom>> entry : map.entrySet()) {
MesBom mesBom = entry.getValue().get(0);
newMesProductOffLine = new MesProductOffLine();
mesProductOffLineList.add(getMesProductOffLine(productionRecord, userName, oldMesWorkOrder, mesProductVersion, entry.getValue().get(0)));
}
} else if (MesExtEnumUtil.NOSORT_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == productionRecord.getReportType()) {
customerSupplyMove(productionRecord,oldMesWorkOrder, mesProductVersion, mesBoms, productionRecord.getProductSn(), mesProductOffLineList, mesMoveList,userName);
} else {
LOGGER.info("汇报类型不存在");
return;
}
if(!CollectionUtils.isEmpty(mesProductOffLineList)){
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
if(!CollectionUtils.isEmpty(mesMoveList)){
mesMoveRepository.saveAll(mesMoveList);
}
// 同步工单信息给加工记录、条码信息
DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(productionRecord.getId(), "id", snDdlPackBean);
DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", snDdlPackBean);
mesProduceSnRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderNo"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo()}, snDdlPackBean);
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(productionRecord.getId(), "id", packBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderNo", "reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()}, packBean);
LOGGER.info("条码【{}】报工成功,报工工单【{}】", productionRecord.getProductSn(), oldMesWorkOrder.getWorkOrderNo());
}
private MesProductOffLine getMesProductOffLine(MesProductionRecord productionRecord, String userName, MesWorkOrder oldMesWorkOrder, MesProductVersion mesProductVersion, MesBom mesBom) {
MesProductOffLine newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo());
newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName());
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
@ -708,25 +743,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode());
newMesProductOffLine.setDescription(productionRecord.getCompleteDateTime());
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
mesProductOffLineList.add(newMesProductOffLine);
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
// 同步工单信息给加工记录、条码信息
DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(productionRecord.getId(), "id", snDdlPackBean);
DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", snDdlPackBean);
mesProduceSnRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderNo"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo()}, snDdlPackBean);
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(productionRecord.getId(), "id", packBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderNo", "reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()}, packBean);
LOGGER.info("条码【{}】报工成功,报工工单【{}】", productionRecord.getProductSn(), oldMesWorkOrder.getWorkOrderNo());
return newMesProductOffLine;
}
/**
@ -1503,6 +1520,64 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
}
private void customerSupplyMove(MesProductionRecord productionRecord,MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List<MesBom> mesBoms, String sn, List<MesProductOffLine> mesProductOffLineList, List<MesMove> mesMoveList,String userName) {
boolean isItemMove;
boolean isItemReport;
MesMoveRule moveRule;
//查询零件生产组的移库规则
List<MesMoveRule> moveRules = mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(mesWorkOrder.getPartProdGroupCode(), mesWorkOrder.getOrganizeCode());
Map<String, List<MesMoveRule>> mesMoveRuleMap = moveRules.stream().filter(t -> Objects.nonNull(t.getSrcType())).collect(Collectors.groupingBy(MesMoveRule::getSrcType));
List<String> itemPartNoList = mesBoms.stream().map(MesBom::getItemPartNo).collect(Collectors.toList());
//子物料SAP下发信息
Map<String, List<MesPartSap>> mesPartSapMap = getPartSapMap(mesWorkOrder, itemPartNoList);
//获取物料信息
Map<String, List<MesPart>> itemPartMap = getItemPartMap(mesWorkOrder, itemPartNoList);
for (MesBom mesBom : mesBoms) {
isItemReport = false;
isItemMove = false;
moveRule = null;
if (itemPartMap.containsKey(mesBom.getItemPartNo())) {
MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next();
if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) {
moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next();
if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) {
isItemMove = true;
isItemReport = true;
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) {
isItemReport = true;
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) {
isItemMove = true;
}
}
}
//汇报
if (isItemReport) {
mesProductOffLineList.add(getMesProductOffLine(productionRecord, userName, mesWorkOrder, mesProductVersion, mesBom));
}
//移库
if (isItemMove) {
MesPartSap mesPartSap = null;
if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) {
mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next();
}
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesWorkOrder.getErpWorkCenter(), mesBom.getItemQty(), MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue());
move.setMatnr(mesBom.getItemPartNo());
ConvertBean.serviceModelInitialize(move, userName);
mesMoveList.add(move);
}
}
}
private Map<String, List<MesPartSap>> getPartSapMap(MesWorkOrder mesWorkOrder, List<String> itemPartNoList) {
List<MesPartSap> mesPartSapList = iMesPartService.findMesPartSapByPartNo(itemPartNoList, mesWorkOrder.getOrganizeCode());
return mesPartSapList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPartSap::getPartNo));
}
private Map<String, List<MesPart>> getItemPartMap(MesWorkOrder mesWorkOrder, List<String> itemPartNoList) {
List<MesPart> itemPartList = iMesPartService.findMesPartByPartNo(itemPartNoList, mesWorkOrder.getOrganizeCode());
return itemPartList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPart::getPartNo));
}
private MesWorkOrder getMesWorkOrder(Map<String, List<MesWorkOrder>> workOrderMap, String workOrderNo) {
MesWorkOrder workOrder = Objects.isNull(workOrderMap) || StringUtils.isEmpty(workOrderNo) || !workOrderMap.containsKey(workOrderNo) ? null : workOrderMap.get(workOrderNo).iterator().next();
if (Objects.isNull(workOrder)) {
@ -1608,4 +1683,21 @@ public class MesWorkOrderService implements IMesWorkOrderService {
ConvertBean.serviceModelInitialize(move, userName);
return move;
}
private MesMove createMove(MesPartSap mesPart, String source, String target, String org, String workCenterCode, double qty, Integer moveType) {
MesMove move = new MesMove();
if (!Objects.isNull(mesPart)) {
move.setMeins(mesPart.getUnit());
}
move.setOrganizeCode(org);
move.setFactoryCode(org);
move.setLgort(source);
move.setUmlgo(target);
move.setMenge(qty);
move.setPostDate(TimeTool.getToday());
move.setMoveType(moveType);
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setWorkCenter(workCenterCode);
return move;
}
}

@ -30,10 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -70,25 +67,23 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
@Override
public MesSortShippingCheckModel doScan(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup) {
if (!Objects.isNull(model.getLastShippingDetailId())) {
//校验目视单是否已经扫描
if (model.getDetailList().stream().anyMatch(t -> !StringUtils.isEmpty(t.getVisualOrderNo()) && t.getVisualOrderNo().equals(model.getSn()))) {
throw new ImppBusiException(String.format("【%s】此目视单已经扫描过请检查数据", model.getSn()));
}
//校验条码
MesProduceSn produceSn = checkSn(model);
//更新单据信息
model.getDetailList().stream().filter(t -> t.getId().equals(model.getLastShippingDetailId())).forEach(detail -> {
detail.setVisualOrderNo(model.getSn());
updateOrderManagementDetails(orderManagement, detail, getWorkOrder(model, detail), model.getUserInfo());
detail.setBarcode(model.getSn());
updateOrderManagementDetails(orderManagement, detail, getMesWorkOrder(model, produceSn, detail), produceSn, model.getUserInfo());
});
model.setLastShippingDetailId(null);
} else {
//校验条码
MesProduceSn produceSn = checkSn(model);
//校验目视单
MesWorkOrder workOrder = getWorkOrder(model);
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo()) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
if (detail.getPartNo().equals(workOrder.getPartNo()) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
//校验发运明细
checkShippingDetails(model, orderManagement, shippingGroup, produceSn, detail);
detail.setBarcode(model.getSn());
checkShippingDetails(model, orderManagement, shippingGroup, workOrder.getPartNo(), detail);
detail.setVisualOrderNo(model.getSn());
//校验通过的明细ID
model.setLastShippingDetailId(detail.getId());
scanFlg = true;
@ -96,16 +91,15 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
throw new ImppBusiException(String.format("【%s】此目视单对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), workOrder.getPartNo()));
}
}
return model;
}
private MesWorkOrder getWorkOrder(MesSortShippingCheckModel model, MesShippingOrderManagementDetail detail) {
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), model.getSn());
private MesWorkOrder getMesWorkOrder(MesSortShippingCheckModel model, MesProduceSn produceSn, MesShippingOrderManagementDetail detail) {
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), detail.getVisualOrderNo());
if (Objects.isNull(workOrder)) {
throw new ImppBusiException(String.format("目视单【%s】不存在请检查数据", model.getSn()));
}
@ -114,17 +108,35 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
throw new ImppBusiException(String.format("目视单【%s】状态为【%s】质量状态为【%s】不允许发运", model.getSn(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(workOrder.getQcStatus())));
}
//校验条码是否匹配
if (!Objects.equals(detail.getBarcode(), workOrder.getCustSn())) {
throw new ImppBusiException(String.format("目视单【%s】条码【%s】与扫描条码【%s】不匹配", model.getSn(), workOrder.getCustSn(), detail.getBarcode()));
if (!Objects.equals(produceSn.getCustSn(), workOrder.getCustSn())) {
throw new ImppBusiException(String.format("目视单【%s】条码【%s】与扫描条码【%s】不匹配", detail.getVisualOrderNo(), workOrder.getCustSn(), model.getSn()));
}
//校验零件是否匹配
if (!Objects.equals(detail.getPartNo(), workOrder.getPartNo())) {
throw new ImppBusiException(String.format("目视单【%s】零件【%s】与发运单零件【%s】不匹配", model.getSn(), workOrder.getPartNo(), detail.getPartNo()));
if (!Objects.equals(produceSn.getPartNo(), workOrder.getPartNo())) {
throw new ImppBusiException(String.format("目视单【%s】零件【%s】与发运单零件【%s】不匹配", detail.getVisualOrderNo(), workOrder.getPartNo(), detail.getPartNo()));
}
return workOrder;
}
private void checkShippingDetails(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup, MesProduceSn produceSn, MesShippingOrderManagementDetail detail) {
private MesWorkOrder getWorkOrder(MesSortShippingCheckModel model) {
//校验目视单是否已经扫描
if (model.getDetailList().stream().anyMatch(t -> !StringUtils.isEmpty(t.getVisualOrderNo()) && t.getVisualOrderNo().equals(model.getSn()))) {
throw new ImppBusiException(String.format("【%s】此目视单已经扫描过请检查数据", model.getSn()));
}
//查询工单
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), model.getSn());
if (Objects.isNull(workOrder)) {
throw new ImppBusiException(String.format("目视单【%s】不存在请检查数据", model.getSn()));
}
//校验目视单状态
if (MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue() != workOrder.getWorkOrderStatus() || MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != workOrder.getQcStatus()) {
throw new ImppBusiException(String.format("目视单【%s】状态为【%s】质量状态为【%s】不允许发运", model.getSn(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(workOrder.getQcStatus())));
}
return workOrder;
}
private void checkShippingDetails(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup, String partNo, MesShippingOrderManagementDetail detail) {
//校验发运单明细顺序
if (!Objects.isNull(shippingGroup) && !StringUtils.isEmpty(shippingGroup.getIsEnableShippingFailSafe()) && CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()) {
Optional<MesShippingOrderManagementDetail> first = model.getDetailList().stream().filter(k -> k.getCustInfoSeq().compareTo(detail.getCustInfoSeq()) < 0 && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
@ -135,10 +147,10 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
//判断是否需要排序校验 默认排序则需要校验
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()))
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER))
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getPartNo);
//若扫描的不是最小顺序 则报错
if (minPartNo.isPresent() && !minPartNo.get().equals(produceSn.getPartNo())) {
if (minPartNo.isPresent() && !minPartNo.get().equals(partNo)) {
throw new ImppBusiException(String.format("【%s】此条码扫描顺序错误请检查数据", model.getSn()));
}
}
@ -215,7 +227,7 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
return mesShippingOrderManagementDetail;
}
private void updateOrderManagementDetails(MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, MesWorkOrder workOrder, String userInfo) {
private void updateOrderManagementDetails(MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, MesWorkOrder workOrder,MesProduceSn produceSn, String userInfo) {
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
@ -232,14 +244,14 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
update(orderManagement);
detail.setActualQty(1);
//条码格式(扫描目视单,扫描条码)
detail.setBarcode(new StringJoiner(MesPcnExtConstWords.COMMA).add(detail.getVisualOrderNo()).add(detail.getBarcode()).toString());
detail.setActualQty(MesPcnExtConstWords.ONE);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
updateDetail(detail);
MesProduceSn produceSn = getMesProduceSn(orderManagement.getOrganizeCode(), detail.getBarcode());
//内部条码更新条码状态
if (!Objects.isNull(produceSn)) {
if (!Objects.isNull(produceSn.getId())) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(produceSn, userInfo);

@ -93,7 +93,7 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
//判断是否需要排序校验 默认排序则需要校验
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()))
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER))
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getPartNo);
//若扫描的不是最小顺序 则报错
if (minPartNo.isPresent() && !minPartNo.get().equals(produceSn.getPartNo())) {

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdTempDataContext;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Optional;
/**
* @Description : 使
* @Reference :
* @Author : wangjie
* @CreateDate 2024/9/26 19:24
* @Modify:
**/
@Component
public class MesNumberRuleStrategySubstringSerialService implements INumberRulePackAttributeStrategyService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
//规则并截取右侧流水装配件规则, 生成零件条码工步需要使用此流水生成新的零件条码
List<MesProdTempDataContext> prodTempDataContextList = productionDispatchContextStepService.getProdTempDataContext(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getWorkCenterCode(), genSerialNoModel.getWorkCellCode());
Optional<MesProdTempDataContext> optional = CollectionUtils.isEmpty(prodTempDataContextList) ? null :
prodTempDataContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()) && o.getForeignKey().compareTo(genSerialNoModel.getForeignKey()) == 0)).findFirst();
if (null != optional && optional.isPresent() && !StringUtils.isEmpty(optional.get().getSerialNo())) genSerialNoModel.appendSerialno(optional.get().getSerialNo());
return genSerialNoModel;
}
}

@ -33,10 +33,10 @@ public class CustSnPrintStrategy implements IPrintTemplateStrategyService {
MesNumberRule numberRule , StepResult stepResult, StationRequestBean reqBean,
Boolean isStep) {
Map<String, Object> modelMap = (Map<String, Object>) model.getSourceData();
MesWorkOrder workOrder = (MesWorkOrder) model.getSourceData();
// 工单信息
MesWorkOrder workOrder = (MesWorkOrder) modelMap.get("mesWorkOrder");
//MesWorkOrder workOrder = (MesWorkOrder) modelMap.get("mesWorkOrder");
if (workOrder == null) {
log.info("CustSnPrintStrategy --- execute --- 工单信息为空");
@ -57,7 +57,7 @@ public class CustSnPrintStrategy implements IPrintTemplateStrategyService {
// 客户条码
resultMap.put(MesPcnExtConstWords.CUST_SN, workOrder.getCustSn());
// 客户零件号 前缀 排除后四位
resultMap.put(MesPcnExtConstWords.CUST_PART_NO_PERFIX, custPartNoPrefix);
resultMap.put(MesPcnExtConstWords.CUST_PART_NO_PREFIX, custPartNoPrefix);
// 客户零件号 后四位
resultMap.put(MesPcnExtConstWords.CUST_PART_NO_AFTER_FOUR, custPartNoAfterFour);
@ -146,7 +146,8 @@ public class CustSnPrintStrategy implements IPrintTemplateStrategyService {
log.error("CustSnPrintStrategy --- execute --- 报错:{}", e.getMessage());
return model;
}
resultMap.put(MesPcnExtConstWords.CUST_SN_DATA_MATRIX, dataMatrixCode);
resultMap.put(MesPcnExtConstWords.CUST_SN_DATA_MATRIX, Base64.getEncoder().encodeToString(dataMatrixCode.toByteArray()));
//resultMap.put(MesPcnExtConstWords.CUST_SN_DATA_MATRIX_BASE64, );
printDataMapList.add(resultMap);

@ -162,14 +162,14 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
if (CollectionUtils.isEmpty(workOrderList)) {
StationKvBeanUtil.addStationKvBeanList(orderQtyKvBeans, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.QTY, "工单计划数", MesPcnExtConstWords.ZERO_STR),
new StationKvBean(MesPcnExtConstWords.COMPLATED_QTY, "工单完成数", MesPcnExtConstWords.ZERO_STR));
new StationKvBean(MesPcnExtConstWords.COMPLETE_QTY, "工单完成数", MesPcnExtConstWords.ZERO_STR));
} else {
Double qty = workOrderList.stream().map(MesWorkOrder::getQty).reduce((a, b) -> a + b).get();
Double complateQty = workOrderList.stream().map(MesWorkOrder::getCompleteQty).reduce((a, b) -> a + b).get();
StationKvBeanUtil.addStationKvBeanList(orderQtyKvBeans, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.QTY, "工单计划数", qty.toString()),
new StationKvBean(MesPcnExtConstWords.COMPLATED_QTY, "工单完成数", complateQty.toString()));
new StationKvBean(MesPcnExtConstWords.COMPLETE_QTY, "工单完成数", complateQty.toString()));
}
if (!CollectionUtils.isEmpty(productionPartContextList)) {

@ -159,7 +159,7 @@ public class MesProductionSortModuleService extends BaseModuleService {
}
MesQueueOrder queueOrder = getNewQueueOrder(reqBean);
return Stream.of(queueOrder.getPartProdGroupCode()).collect(Collectors.toList());
return queueOrder == null ? null : Stream.of(queueOrder.getPartProdGroupCode()).collect(Collectors.toList());
}
private MesQueueOrder getNewQueueOrder(StationRequestBean reqBean) {

@ -104,14 +104,14 @@ public class MesFunctionProductionStatisticsService extends BaseSwsService imple
if (CollectionUtils.isEmpty(workOrderList)) {
StationKvBeanUtil.addStationKvBeanList(orderQtyKvBeans, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.QTY, "工单计划数", 0 + ""),
new StationKvBean(MesPcnExtConstWords.COMPLATED_QTY, "工单完成数", 0 + ""));
new StationKvBean(MesPcnExtConstWords.COMPLETE_QTY, "工单完成数", 0 + ""));
} else {
double qty = workOrderList.stream().map(MesWorkOrder::getQty).reduce((a, b) -> a + b).get();
double complateQty = workOrderList.stream().map(MesWorkOrder::getCompleteQty).reduce((a, b) -> a + b).get();
StationKvBeanUtil.addStationKvBeanList(orderQtyKvBeans, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.QTY, "工单计划数", qty + ""),
new StationKvBean(MesPcnExtConstWords.COMPLATED_QTY, "工单完成数", complateQty + ""));
new StationKvBean(MesPcnExtConstWords.COMPLETE_QTY, "工单完成数", complateQty + ""));
}
resultBean.setResultList(orderQtyKvBeans);
} else if (Objects.equal(MesExtEnumUtil.WORK_FILE_TYPE.PROD_VIDEO.getValue(), mesWorkCell.getIsShowMsg())) {

@ -97,7 +97,7 @@ public class MesProdCraftRouteCheckSortStepService extends MesProdCraftRouteChec
//验证是否存在零件为空的产品条码
private Boolean isExistProductSnNoPart(List<MesProductionPsInContext> productionPsInContextList) {
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && StringUtils.isEmpty(o.getPartNo()))).findFirst();
return (null == optional || !optional.isPresent()) ? true : false;
return (null != optional && optional.isPresent()) ? true : false;
}
//前道工艺防错验证处理

@ -157,6 +157,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
model.setPart(mesPartSap);
model.setPartInspectionDetailList(Arrays.asList(mesPartInspectionDetail));
if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
//TODO 有问题 需要修改条码质量状态
ncProcessingService.saveNc(model, reqBean.getOrganizeCode(), true);
} else {
MesPartInspectionInputModel inspectModel = new MesPartInspectionInputModel();
@ -169,6 +170,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
inspectModel.setPartInspection(partInspection);
inspectModel.setShiftCode(mesProduceSn.getShiftCode());
inspectModel.setProductVersion(productVersion);
inspectModel.setUserInfo(reqBean.getUserInfo());
inputDefectRecordService.saveSusPartInspection(inspectModel, reqBean.getOrganizeCode());
}

@ -146,8 +146,8 @@ public class MesProductSnPrintNosortStepService extends BaseStepService {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(outSn.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(outSn.getId(), MesPcnExtConstWords.ID, packBean);
mesProduceSnRao.updateByProperties(
new String[]{MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME},
new Object[]{MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true)}, packBean);
new String[]{MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.PRINT_COUNT, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME},
new Object[]{MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue(), MesPcnExtConstWords.ONE, reqBean.getUserInfo(), TimeTool.getNowTime(true)}, packBean);
}
//保存打印条码记录
snLogRao.saveAll(snLogList);

@ -83,7 +83,7 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
/**
*
*/
List<MesProduceSnPrintModel> printModelList = new ArrayList<>();
//List<MesProduceSnPrintModel> printModelList = new ArrayList<>();
//2. 获取条码需要模板、模板代码、打印机 --- 循环遍历条码 封装数据
if (CollectionUtils.isEmpty(productionPartContextList)) return stepResult;
@ -96,14 +96,7 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
List<MesWorkOrder> needModifyWorkOrderList = new ArrayList<>();
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack("WH_CUST_SN_RULE", MesPcnExtConstWords.RULE_CODE, packBean);
MesNumberRule numberRule = numberRuleRepository.getByProperty(packBean);
if (numberRule == null) {
log.error("MesCustSnPrintStepService --- exec --- 客户条码编码规则[WH_CUST_SN_RULE]无效");
return stepResult;
}
List<Map<String, Object>> resultMap = new ArrayList<>();
for (MesProductionPartContext sn : productionPartContextList) {
@ -112,16 +105,28 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
if (workOrder == null) {
log.error("MesCustSnPrintStepService --- exec --- 工单号:{}无效", sn.getWorkOrderNo());
stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号:{}无效!", sn.getWorkOrderNo()));
continue;
}
if ((partDataContext == null) || (!partDataContext.containsKey(workOrder.getPartNo()))) {
log.error("MesCustSnPrintStepService --- exec --- 工单号:{}零件{}丢失缓存", sn.getWorkOrderNo(), sn.getPartNo());
continue;
stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]丢失零件信息缓存!", sn.getWorkOrderNo(), sn.getPartNo()));
}
MesPart mesPart = partDataContext.get(sn.getPartNo());
String custMatchRule = StringUtils.isEmpty(mesPart.getCustMatchRule()) ? "WH_CUST_SN_RULE" : mesPart.getCustMatchRule();
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(custMatchRule, MesPcnExtConstWords.RULE_CODE, packBean);
MesNumberRule numberRule = numberRuleRepository.getByProperty(packBean);
if (numberRule == null) {
log.error("MesCustSnPrintStepService --- exec --- 客户条码编码规则[WH_CUST_SN_RULE]无效");
stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]客户条码编码规则[%s]无效!", sn.getWorkOrderNo(), sn.getPartNo(), custMatchRule));
}
// 从物料信息中获取标签模板
String labelTemplateCode = partDataContext.get(sn.getPartNo()).getProductLabelTemplate();
String labelTemplateCode = partDataContext.get(sn.getPartNo()).getCustLabelTemplate();
// 从物料信息中获取打印机
String productPrinterCode = partDataContext.get(sn.getPartNo()).getProductPrinterCode();
@ -156,8 +161,8 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
}
IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode);
// GenSerialNoModel model , MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep
MesProduceSnPrintModel printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, true);
printModelList.add(printModel);
MesProduceSnPrintModel printModel = strategyService.execute(null, mesProduceSnPrintModel, numberRule, stepResult, reqBean, true);
resultMap.addAll(printModel.getPrintContextList());
needModifyWorkOrderList.add(workOrder);
}
@ -165,10 +170,11 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
//前端接收到busiTyep是customComponent并且 dataType是file类型的消息就需要打印后续消息里的数据一个模板对应多个打印数据
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue());
resultBean.setResultObj(printModelList);
resultBean.setCustomPageName("SORT_WORK_CENTER_PRINT");
resultBean.setResultObj(resultMap);
//3. 发送数据给到前端
this.sendMessage(reqBean, resultBean);
List<MesPrintedSnLog> snLogList = printModelList.stream().map(MesProduceSnPrintModel::getMesPrintedSnLogList).flatMap(List::stream).collect(Collectors.toList());
List<MesPrintedSnLog> snLogList = new ArrayList<>();
//更新打印状态
for (MesWorkOrder workOrder : needModifyWorkOrderList) {
MesPrintedSnLog snLog = new MesPrintedSnLog();

@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepServ
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
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.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
@ -95,7 +96,7 @@ public class MesProductSnSaveStepService extends BaseStepService {
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
MesWorkCell workCell = productionProcessContext.getWorkCell();
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> o.copy(saveProduceSnData(reqBean, resultBean, productionProcessContext, o, partMap, prodShiftContext, productResult, workCenter, workCell)));
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveProduceSnData(reqBean, resultBean, productionProcessContext, o, partMap, prodShiftContext, productResult, workCenter, workCell));
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
@ -104,7 +105,7 @@ public class MesProductSnSaveStepService extends BaseStepService {
}
private MesProduceSn saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext,
private MesProductionPsOutContext saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext,
Map<String, MesPart> partMap, MesProdShiftContext prodShiftContext, String productResult, MesWorkCenter workCenter, MesWorkCell workCell) {
//根据零件条码ID查询零件条码信息
@ -112,46 +113,59 @@ public class MesProductSnSaveStepService extends BaseStepService {
if (null == produceSn) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件条码信息,产出零件条码[%s]ID[%s]信息不存在!", productionPsOutContext.getProductSn(), productionPsOutContext.getId()));
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- PS:{} {} --- ID:{} --- QURERY:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), produceSn.getProductSn(), produceSn.getPartNo(), produceSn.getId(), JSONObject.toJSONString(produceSn));
//零件信息
MesPart part = partMap.get(produceSn.getPartNo());
produceSn.setAreaCode(reqBean.getAreaCode());
produceSn.setWorkCenterCode(reqBean.getWorkCenterCode());
produceSn.setWorkCellCode(reqBean.getWorkCellCode());
productionPsOutContext.setAreaCode(reqBean.getAreaCode());
productionPsOutContext.setWorkCenterCode(reqBean.getWorkCenterCode());
productionPsOutContext.setWorkCellCode(reqBean.getWorkCellCode());
produceSn.setRouteCode(reqBean.getRouteCode());
produceSn.setProcessCode(reqBean.getProcessCode());
produceSn.setCraftCode(productionProcessContext.getCraftCode());
productionPsOutContext.setRouteCode(reqBean.getRouteCode());
productionPsOutContext.setProcessCode(reqBean.getProcessCode());
productionPsOutContext.setCraftCode(productionProcessContext.getCraftCode());
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
productionPsOutContext.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
productionPsOutContext.setShiftCode(prodShiftContext.getShiftCode());
productionPsOutContext.setShiftGroup(prodShiftContext.getShiftGroup());
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
productionPsOutContext.setProcessLabelTemplate(part.getProcessLabelTemplate());
productionPsOutContext.setProdLabelTemplate(part.getProductLabelTemplate());
productionPsOutContext.setCustLabelTemplate(part.getCustLabelTemplate());
ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
ConvertBean.serviceModelUpdate(productionPsOutContext, reqBean.getUserInfo());
productionPsOutContext.setLotNo(productionPsOutContext.getModifyDatetime().substring(0, 10));
if (StringUtils.isEmpty(productionPsOutContext.getInWorkCenterTime())) productionPsOutContext.setInWorkCenterTime(productionPsOutContext.getModifyDatetime());
//非排序 或者 排序的末道工位
if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0 ||
(!StringUtils.isEmpty(workCell.getIsEndWorkCell()) && workCell.getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setOutWorkCenterTime(produceSn.getModifyDatetime());
productionPsOutContext.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
productionPsOutContext.setOutWorkCenterTime(productionPsOutContext.getModifyDatetime());
} else {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue());
productionPsOutContext.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue());
}
produceSnExtService.update(produceSn);
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProductionPsOutContext:{} --- MesProduceSn:{}",
produceSnRepository.updateByProperties(
new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE},
new Object[]{produceSn.getId(), reqBean.getOrganizeCode()},
new String[]{MesPcnExtConstWords.AREA_CODE, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE, MesPcnExtConstWords.ROUTE_CODE, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.CRAFT_CODE,
MesPcnExtConstWords.SN_STATUS, MesPcnExtConstWords.QC_STATUS, MesPcnExtConstWords.SHIFT_CODE, MesPcnExtConstWords.SHIFT_GROUP, MesPcnExtConstWords.PROCESS_LABEL_TEMPLATE, MesPcnExtConstWords.PROD_LABEL_TEMPLATE,
MesPcnExtConstWords.CUST_LABEL_TEMPLATE, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.IN_WC_TIME, MesPcnExtConstWords.OUT_WC_TIME, MesPcnExtConstWords.LOT_NO},
new Object[]{productionPsOutContext.getAreaCode(), productionPsOutContext.getWorkCenterCode(), productionPsOutContext.getWorkCellCode(), productionPsOutContext.getRouteCode(), productionPsOutContext.getProcessCode(), productionPsOutContext.getCraftCode(),
productionPsOutContext.getSnStatus(), productionPsOutContext.getQcStatus(), productionPsOutContext.getShiftCode(), productionPsOutContext.getShiftGroup(), productionPsOutContext.getProcessLabelTemplate(), productionPsOutContext.getProdLabelTemplate(),
productionPsOutContext.getCustLabelTemplate(), productionPsOutContext.getModifyDatetime(), productionPsOutContext.getModifyUser(), productionPsOutContext.getInWorkCenterTime(), productionPsOutContext.getOutWorkCenterTime(), productionPsOutContext.getLotNo()});
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- PS:{} {} --- ID:{} --- UPDATE:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(productionPsOutContext), JSONObject.toJSONString(produceSn));
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), productionPsOutContext.getProductSn(), productionPsOutContext.getPartNo(), productionPsOutContext.getId(), JSONObject.toJSONString(productionPsOutContext));
return produceSn;
return productionPsOutContext;
}

@ -9,7 +9,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
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.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -126,8 +125,6 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService {
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), workOrder.getWorkOrderNo(), JSONObject.toJSONString(workOrder), calcCompleteQty, prodResult);
entityManager.detach(workOrder);
//工单状态分 排序工单 和非排序工单; 现在必须是非排序工单
if (!MesExtEnumUtil.ORDER_STATUS.checkNosortAllowStatus(workOrder.getWorkOrderStatus()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息工单状态[%s]!", entry.getKey(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus())));
@ -135,17 +132,16 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService {
if (!workOrder.getWorkCenterCode().equals(reqBean.getWorkCenterCode()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", entry.getKey(), workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode()));
List<String> propertyNameList = new ArrayList<>();
Map<String, Object> propertyMap = new HashMap<>();
//修改完成数量
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0) {
workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty));
propertyNameList.add(MesPcnExtConstWords.COMPLATED_QTY);
propertyMap.put(MesPcnExtConstWords.COMPLETE_QTY, MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty));
}
//修改未完成数量
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0 && workOrder.getUnCompleteQty().compareTo(new Double(0)) > 0 &&
MathOperation.compareTo(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)), new Double(0)) >= 0) {
workOrder.setUnCompleteQty(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)));
propertyNameList.add(MesPcnExtConstWords.UN_COMPLATED_QTY);
propertyMap.put(MesPcnExtConstWords.UN_COMPLETE_QTY, MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)));
}
/**
@ -155,43 +151,46 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService {
*
*/
if (!StringUtils.isEmpty(prodResult)) {
//可疑品
boolean isSuspicious = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue() == Integer.parseInt(prodResult);
if (isSuspicious && !productionPsOutContextList.isEmpty()){
int suspiciousQty = productionPsOutContextList.size();
workOrder.setSuspiciousPartQty(MathOperation.add(workOrder.getSuspiciousPartQty(), new Double(suspiciousQty)));
propertyNameList.add(MesPcnExtConstWords.SUSPICIOUS_PART_QTY);
if (Integer.valueOf(prodResult).compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue()) == 0 && !CollectionUtils.isEmpty(productionPsOutContextList)){
propertyMap.put(MesPcnExtConstWords.SUSPICIOUS_PART_QTY, MathOperation.add(workOrder.getSuspiciousPartQty(), new Double(productionPsOutContextList.size())));
}
//报废数量
boolean isScrap = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue() == Integer.parseInt(prodResult);
if (isScrap && !productionPsOutContextList.isEmpty()){
int scrapQty = productionPsOutContextList.size();
workOrder.setScrapPartQty(MathOperation.add(workOrder.getScrapPartQty(), new Double(scrapQty)));
propertyNameList.add(MesPcnExtConstWords.SCRAP_PART_QTY);
if (Integer.valueOf(prodResult).compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue()) == 0 && !CollectionUtils.isEmpty(productionPsOutContextList)){
propertyMap.put(MesPcnExtConstWords.SCRAP_PART_QTY, MathOperation.add(workOrder.getScrapPartQty(), new Double(productionPsOutContextList.size())));
}
}
if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) {
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
propertyNameList.add(MesPcnExtConstWords.WORK_ORDER_STATUS);
propertyMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else if (workOrder.getCompleteQty() > 0 && workOrder.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) {
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
propertyNameList.add(MesPcnExtConstWords.WORK_ORDER_STATUS);
propertyMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
//如果数量都没有修改,不操作数据库
if (!propertyNameList.isEmpty()) {
ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo());
workOrder.setModifyDatetime((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SSS)).format(new Date()));
workOrderExtService.update(workOrder);
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- UPDATE:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), workOrder.getWorkOrderNo(), JSONObject.toJSONString(workOrder));
if (CollectionUtils.isEmpty(propertyMap)) continue;
propertyMap.put(MesPcnExtConstWords.MODIFY_DATE_TIME, (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date()));
propertyMap.put(MesPcnExtConstWords.MODIFY_USER, reqBean.getUserInfo());
String[] propertyName = new String[propertyMap.size()];
Object[] propertyValue = new Object[propertyMap.size()];
Integer index = 0;
for (Map.Entry<String, Object> innerEntry : propertyMap.entrySet()) {
if (null == innerEntry) continue;
propertyName[index] = innerEntry.getKey();
propertyValue[index] = innerEntry.getValue();
index ++;
}
workOrderRepository.updateByProperties(new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{workOrder.getId(), reqBean.getOrganizeCode()}, propertyName, propertyValue);
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- UPDATE:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), workOrder.getWorkOrderNo(), JSONObject.toJSONString(propertyMap));
}
}
}

@ -107,7 +107,7 @@ public class MesWorkOrderSaveSortStepService extends BaseStepService {
workOrderRepository.updateByProperties(
new String[]{MesPcnExtConstWords.ID},
new Object[]{productionPartContext.getId()},
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.WORK_ORDER_STATUS, MesPcnExtConstWords.COMPLATED_QTY, MesPcnExtConstWords.UN_COMPLATED_QTY, MesPcnExtConstWords.OFFLINE_TIME},
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.WORK_ORDER_STATUS, MesPcnExtConstWords.COMPLETE_QTY, MesPcnExtConstWords.UN_COMPLETE_QTY, MesPcnExtConstWords.OFFLINE_TIME},
new Object[]{reqBean.getUserInfo(), (new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SSS)).format(new Date()), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue(), new Double(1), new Double(0), TimeTool.getNowTime(true)});
}

@ -94,9 +94,9 @@ public class MesPcnExtConstWords {
// 模具号
public static final String MOULD_NO = "mouldNo";
// 工单完成数
public static final String COMPLATED_QTY = "complateQty";
public static final String COMPLETE_QTY = "completeQty";
// 工单未完成数
public static final String UN_COMPLATED_QTY = "unCompleteQty";
public static final String UN_COMPLETE_QTY = "unCompleteQty";
// 工单可疑品数
public static final String SUSPICIOUS_PART_QTY = "suspiciousPartQty";
// 工单报废品数
@ -109,6 +109,8 @@ public class MesPcnExtConstWords {
public static final String SHIFT_GROUP = "shiftGroup";
// 班组名称
public static final String SHIFT_GROUP_NAME = "shiftGroupName";
// 流程代码
public static final String ROUTE_CODE = "routeCode";
// 工序代码
public static final String PROCESS_CODE = "processCode";
// 工艺代码
@ -157,6 +159,18 @@ public class MesPcnExtConstWords {
public static final String CUST_SN = "custSn";
// 条码状态
public static final String SN_STATUS = "snStatus";
// 质量状态
public static final String QC_STATUS = "qcStatus";
// 过程标签模板
public static final String PROCESS_LABEL_TEMPLATE = "processLabelTemplate";
// 产品标签模板
public static final String PROD_LABEL_TEMPLATE = "prodLabelTemplate";
// 客户标签模板
public static final String CUST_LABEL_TEMPLATE = "custLabelTemplate";
// 进产线时间
public static final String IN_WC_TIME = "inWorkCenterTime";
// 出产线时间
public static final String OUT_WC_TIME = "outWorkCenterTime";
// 腔数
public static final String CAVITY = "cavity";
// 数量
@ -185,6 +199,8 @@ public class MesPcnExtConstWords {
public static final String RULE_CODE = "ruleCode";
// 打印状态
public static final String PRINT_STATUS = "printStatus";
// 打印次数
public static final String PRINT_COUNT = "printCount";
// 颜色
public static final String COLOR = "color";
// 设备计数点位固定二级变量
@ -515,7 +531,7 @@ public class MesPcnExtConstWords {
//客户零件号
public static final String CUST_PART_NO = "custPartNo";
//客户零件号 前缀 排除后四位
public static final String CUST_PART_NO_PERFIX = "custPartNoPerfix";
public static final String CUST_PART_NO_PREFIX = "custPartNoPrefix";
//客户零件号 后四位
public static final String CUST_PART_NO_AFTER_FOUR = "custPartNoAfterFour";
//客户条码VPPS
@ -615,4 +631,5 @@ public class MesPcnExtConstWords {
public static final int DATA_MATRIX_CODE_HEIGHT = 80;
// dataMatrix 形式的客户条码
public static final String CUST_SN_DATA_MATRIX = "custSnDataMatrix";
public static final String CUST_SN_DATA_MATRIX_BASE64 = "custSnDataMatrixBase64";
}

Loading…
Cancel
Save