|
|
|
@ -1,12 +1,14 @@
|
|
|
|
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.aspect.MonitorLog;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.IMesShippingScanStrategyService;
|
|
|
|
|
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.MesSortShippingCheckModel;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingModel;
|
|
|
|
|
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;
|
|
|
|
@ -26,12 +28,12 @@ import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
|
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
@ -100,6 +102,21 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesShippingSnUniqueRepository mesShippingSnUniqueRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesWorkOrderService mesWorkOrderService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesMoveRuleService mesMoveRuleService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesPartService mesPartService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesProductionRecordService mesProductionRecordService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesProduceSnExtService mesProduceSnExtService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesSortShippingCheckModel doShippingOrderNoQuery(MesShippingOrderManagement shippingOrderManagement) {
|
|
|
|
|
//校验发运单
|
|
|
|
@ -449,6 +466,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(listDetail.getPid(), "id", packBean);
|
|
|
|
|
loadingList = listRepository.getByProperty(packBean);
|
|
|
|
|
//反填装车单信息到发运单
|
|
|
|
|
if(!Objects.isNull(loadingList)){
|
|
|
|
|
orderManagement.setOrderCode(loadingList.getOrderCode());
|
|
|
|
|
orderManagement.setLoadingListId(loadingList.getId());
|
|
|
|
@ -470,28 +488,26 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
List<MesShippingOrderManagementDetail> detailList = model.getDetailList();
|
|
|
|
|
Map<Long, List<MesShippingOrderManagementDetail>> custInfoSeqMap = detailList.stream().collect(Collectors.groupingBy(MesShippingOrderManagementDetail::getId));
|
|
|
|
|
|
|
|
|
|
//获取工单信息
|
|
|
|
|
MesSortShippingModel sortShippingModel = getMesSortShippingModel(orderManagement.getShippingGroupCode(), organizeCode, detailList.stream().map(MesShippingOrderManagementDetail::getVisualOrderNo).filter(visualOrderNo -> !StringUtil.isEmptyAndNull(visualOrderNo)).collect(Collectors.toList()));
|
|
|
|
|
//查询条码信息
|
|
|
|
|
Map<String, List<MesProduceSn>> produceSnByCustSnMap = getProduceSnByCustSnMap(orderManagement.getIsEnableMemory(), organizeCode, detailList.stream().map(MesShippingOrderManagementDetail::getBarcode).filter(barCode -> !StringUtil.isEmptyAndNull(barCode)).collect(Collectors.toList()));
|
|
|
|
|
|
|
|
|
|
List<MesProduceSn> produceSnList = new ArrayList<>();
|
|
|
|
|
List<MesWorkOrder> mesWorkOrderList = new ArrayList<>();
|
|
|
|
|
List<String> workOrderNoList = new ArrayList<>();
|
|
|
|
|
List<MesShippingSnUnique> mesShippingSnUniqueList = new ArrayList<>();
|
|
|
|
|
List<MesJisShipping> shippingList = new ArrayList<>();
|
|
|
|
|
for (MesShippingOrderManagementDetail detail : orderManagementDetailList) {
|
|
|
|
|
//根据扫描的条码查询条码是否存在
|
|
|
|
|
packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
if (!Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
|
|
|
|
|
List<MesShippingOrderManagementDetail> mesShippingOrderManagementDetails = custInfoSeqMap.get(detail.getId());
|
|
|
|
|
MesShippingOrderManagementDetail managementDetail = mesShippingOrderManagementDetails.get(0);
|
|
|
|
|
detail.setRemark(managementDetail.getRemark());
|
|
|
|
|
detail.setStatus(managementDetail.getStatus());
|
|
|
|
|
detail.setBarcode(managementDetail.getBarcode());
|
|
|
|
|
detail.setVisualOrderNo(managementDetail.getVisualOrderNo());
|
|
|
|
|
if (!Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
|
|
|
|
|
BeanUtils.copyProperties(custInfoSeqMap.get(detail.getId()).iterator().next(), detail);
|
|
|
|
|
}
|
|
|
|
|
//更新条码信息,更新目视单信息
|
|
|
|
|
if(!StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getBarcode(), "custSn", packBean);
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
|
|
|
|
|
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
|
|
|
|
|
if(!Objects.isNull(produceSn)){
|
|
|
|
|
if (!Objects.isNull(produceSnByCustSnMap) && produceSnByCustSnMap.containsKey(detail.getBarcode())) {
|
|
|
|
|
MesProduceSn produceSn = produceSnByCustSnMap.get(detail.getBarcode()).iterator().next();
|
|
|
|
|
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
|
|
|
|
|
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
|
|
|
|
|
produceSn.setSystemSyncDatetime(MesPcnExtConstWords.EMPTY);
|
|
|
|
|
ConvertBean.serviceModelUpdate(produceSn, userInfo);
|
|
|
|
|
produceSnList.add(produceSn);
|
|
|
|
|
} else {
|
|
|
|
@ -500,19 +516,14 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
}
|
|
|
|
|
//更新工单
|
|
|
|
|
if(!StringUtils.isEmpty(detail.getVisualOrderNo())){
|
|
|
|
|
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(organizeCode, detail.getVisualOrderNo());
|
|
|
|
|
if(!Objects.isNull(workOrder)){
|
|
|
|
|
workOrder.setShippingTime(TimeTool.getNowTime(true));
|
|
|
|
|
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.SHIPPING.getValue());
|
|
|
|
|
workOrder.setSystemSyncStatus(CommonEnumUtil.FALSE);
|
|
|
|
|
workOrder.setModifyUser(userInfo);
|
|
|
|
|
workOrder.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date()));
|
|
|
|
|
mesWorkOrderList.add(workOrder);
|
|
|
|
|
}
|
|
|
|
|
workOrderNoList.add(detail.getVisualOrderNo());
|
|
|
|
|
//更新应急件库位管理库存出库
|
|
|
|
|
mesEmergencyLocationService.doShippingStockOutOnline(organizeCode, detail.getVisualOrderNo(), userInfo, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//客供品移库
|
|
|
|
|
customerSupplyMove(orderManagement, userInfo, sortShippingModel, shippingList, detail);
|
|
|
|
|
|
|
|
|
|
//条码格式(扫描目视单,扫描条码)
|
|
|
|
|
if(!StringUtil.isEmpty(detail.getVisualOrderNo())){
|
|
|
|
|
detail.setBarcode(new StringJoiner(MesPcnExtConstWords.COMMA).add(detail.getVisualOrderNo()).add(detail.getBarcode()).toString());
|
|
|
|
@ -529,9 +540,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
if(!CollectionUtils.isEmpty(produceSnList)){
|
|
|
|
|
produceSnRepository.saveAll(produceSnList);
|
|
|
|
|
}
|
|
|
|
|
//更新工单
|
|
|
|
|
if(!CollectionUtils.isEmpty(mesWorkOrderList)){
|
|
|
|
|
mesWorkOrderExtService.saveAll(mesWorkOrderList);
|
|
|
|
|
//更新工单状态为已发运
|
|
|
|
|
if(!CollectionUtils.isEmpty(workOrderNoList)){
|
|
|
|
|
mesWorkOrderExtService.updateMesWorkOrderOrderStatusShippingByWorkOrderNo(organizeCode, workOrderNoList, userInfo);
|
|
|
|
|
}
|
|
|
|
|
//更新发运单
|
|
|
|
|
ConvertBean.serviceModelUpdate(orderManagement,userInfo);
|
|
|
|
@ -540,12 +551,15 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
|
|
|
|
|
shippingOrderManagementDetailRepository.saveAll(orderManagementDetailList);
|
|
|
|
|
}
|
|
|
|
|
if(StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())){
|
|
|
|
|
if (StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())) {
|
|
|
|
|
//发送数据给辊道线
|
|
|
|
|
sendShippingFinishedCmd(model, organizeCode);
|
|
|
|
|
//保存当前发运单明细报工
|
|
|
|
|
jisShippingRepository.saveAll(getMesJisShippings(orderManagement,userInfo));
|
|
|
|
|
}else{
|
|
|
|
|
//保存当前发运单明细
|
|
|
|
|
List<MesJisShipping> mesJisShippings = getMesJisShippings(orderManagement, orderManagementDetailList, userInfo);
|
|
|
|
|
if (!CollectionUtils.isEmpty(mesJisShippings)) {
|
|
|
|
|
shippingList.addAll(mesJisShippings);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
//查询装车单明细
|
|
|
|
|
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(orderManagement.getLoadingListId(),"pid",orderManagementPackBean);
|
|
|
|
@ -557,13 +571,16 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
DdlPreparedPack.getNumNOEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderManagementPackBean);
|
|
|
|
|
boolean exitByHql = shippingOrderManagementRepository.isExitByHql(orderManagementPackBean);
|
|
|
|
|
//2.装车单中所有发运单全部变成发运回传
|
|
|
|
|
if(!exitByHql){
|
|
|
|
|
if (!exitByHql) {
|
|
|
|
|
DdlPackBean jisBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(orderManagement.getOrderCode(), "orderCode", jisBean);
|
|
|
|
|
List<MesShippingOrderManagement> shippingOrderManagementList = shippingOrderManagementRepository.findByHqlWhere(jisBean);
|
|
|
|
|
for (MesShippingOrderManagement mesShippingOrderManagement : shippingOrderManagementList) {
|
|
|
|
|
//保存当前发运单明细报工
|
|
|
|
|
jisShippingRepository.saveAll(getMesJisShippings(mesShippingOrderManagement,userInfo));
|
|
|
|
|
//保存当前发运单明细
|
|
|
|
|
List<MesJisShipping> mesJisShippings = getMesJisShippings(mesShippingOrderManagement, null, userInfo);
|
|
|
|
|
if (!CollectionUtils.isEmpty(mesJisShippings)) {
|
|
|
|
|
shippingList.addAll(mesJisShippings);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//更新装车单
|
|
|
|
|
if (!StringUtils.isEmpty(loadingList)) {
|
|
|
|
@ -574,6 +591,10 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//发运结果回传
|
|
|
|
|
if(!CollectionUtils.isEmpty(shippingList)){
|
|
|
|
|
jisShippingRepository.saveAll(shippingList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -610,12 +631,14 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
return rule;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<MesJisShipping> getMesJisShippings(MesShippingOrderManagement mesShippingOrderManagement,String userName) {
|
|
|
|
|
DdlPackBean detailPackBean = DdlPackBean.getDdlPackBean(mesShippingOrderManagement.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(mesShippingOrderManagement.getId(), "pid", detailPackBean);
|
|
|
|
|
List<MesShippingOrderManagementDetail> shippingOrderManagementDetails = shippingOrderManagementDetailRepository.findByHqlWhere(detailPackBean);
|
|
|
|
|
public List<MesJisShipping> getMesJisShippings(MesShippingOrderManagement mesShippingOrderManagement,List<MesShippingOrderManagementDetail> shippingOrderManagementDetails,String userName) {
|
|
|
|
|
if (CollectionUtils.isEmpty(shippingOrderManagementDetails)) {
|
|
|
|
|
DdlPackBean detailPackBean = DdlPackBean.getDdlPackBean(mesShippingOrderManagement.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(mesShippingOrderManagement.getId(), "pid", detailPackBean);
|
|
|
|
|
shippingOrderManagementDetails = shippingOrderManagementDetailRepository.findByHqlWhere(detailPackBean);
|
|
|
|
|
}
|
|
|
|
|
//当前装车单所有发运单明细 需要报工的数据
|
|
|
|
|
return jisShippingService.getJisShipping(mesShippingOrderManagement, shippingOrderManagementDetails,userName);
|
|
|
|
|
return jisShippingService.getJisShipping(mesShippingOrderManagement, shippingOrderManagementDetails, userName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -637,4 +660,50 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
|
|
|
|
|
shippingOrderManagementDetailRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "status","remark"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue(), MesPcnExtConstWords.SHIP_PASS}, packBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesSortShippingModel getMesSortShippingModel(String shippingGroupCode, String organizeCode, List<String> orderNoList) {
|
|
|
|
|
MesSortShippingModel sortShippingModel = new MesSortShippingModel();
|
|
|
|
|
if (!CollectionUtils.isEmpty(orderNoList)) {
|
|
|
|
|
sortShippingModel.setMesWorkOrderList(mesWorkOrderExtService.getWorkOrderList(organizeCode, orderNoList));
|
|
|
|
|
sortShippingModel.setMesWorkOrderPartList(mesWorkOrderService.findMesWorkOrderPartByOrderNo(organizeCode, orderNoList));
|
|
|
|
|
sortShippingModel.setMesProductionRecordList(mesProductionRecordService.findProductionRecordList(organizeCode, orderNoList, MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue()));
|
|
|
|
|
sortShippingModel.setMesMoveRuleList(mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(shippingGroupCode, organizeCode,MesExtEnumUtil.MOVE_RULE_GROUP_TYPE.MOVE_RULE_GROUP_TYPE_10.getValue()));
|
|
|
|
|
sortShippingModel.setMesPartList(mesPartService.findMesPartByPartNo(sortShippingModel.getPartNoAllList(), organizeCode));
|
|
|
|
|
}
|
|
|
|
|
return sortShippingModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Map<String, List<MesProduceSn>> getProduceSnByCustSnMap(Integer isEnableMemory, String organizeCode, List<String> custSnList) {
|
|
|
|
|
Map<String, List<MesProduceSn>> produceSnByCustSnMap = null;
|
|
|
|
|
if (!Objects.equals(isEnableMemory, MesCommonConstant.TRUE_INTEGER)) {
|
|
|
|
|
produceSnByCustSnMap = mesProduceSnExtService.getProduceSnByCustSnMap(organizeCode, custSnList);
|
|
|
|
|
}
|
|
|
|
|
return produceSnByCustSnMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void customerSupplyMove(MesShippingOrderManagement orderManagement, String userInfo, MesSortShippingModel sortShippingModel, List<MesJisShipping> shippingList, MesShippingOrderManagementDetail detail) {
|
|
|
|
|
if (!StringUtils.isEmpty(detail.getVisualOrderNo()) && !Objects.isNull(sortShippingModel.getMesWorkOrderMap()) && sortShippingModel.getMesWorkOrderMap().containsKey(detail.getVisualOrderNo())) {
|
|
|
|
|
MesWorkOrder workOrder = sortShippingModel.getMesWorkOrderMap().get(detail.getVisualOrderNo());
|
|
|
|
|
//散件发运
|
|
|
|
|
if (!Objects.isNull(sortShippingModel.getMesProductionRecordMap()) && sortShippingModel.getMesProductionRecordMap().containsKey(detail.getVisualOrderNo()) && !Objects.isNull(sortShippingModel.getMesWorkOrderPartMap()) && sortShippingModel.getMesWorkOrderPartMap().containsKey(detail.getVisualOrderNo())) {
|
|
|
|
|
//标记为总成不记录回传表
|
|
|
|
|
detail.setSaveFlag(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
MesMoveRule moveRule = null;
|
|
|
|
|
//移库规则
|
|
|
|
|
for (MesWorkOrderPart orderPart : sortShippingModel.getMesWorkOrderPartMap().get(detail.getVisualOrderNo())) {
|
|
|
|
|
MesPart itemPart = Objects.isNull(sortShippingModel.getMesPartMap()) || !sortShippingModel.getMesPartMap().containsKey(orderPart.getPartNo()) ? null : sortShippingModel.getMesPartMap().get(orderPart.getPartNo());
|
|
|
|
|
if (Objects.isNull(itemPart) || StringUtil.isEmpty(itemPart.getEsd()) || Objects.isNull(sortShippingModel.getMesMoveRuleMap()) || !sortShippingModel.getMesMoveRuleMap().containsKey(itemPart.getEsd())) {
|
|
|
|
|
log.info("客供品移库零件【{}】维护的ESD属性未匹配到零件发运组【{}】中的移库规则", orderPart.getPartNo(), workOrder.getPartProdGroupCode());
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
moveRule = sortShippingModel.getMesMoveRuleMap().get(itemPart.getEsd());
|
|
|
|
|
if (Objects.equals(moveRule.getMoveNum(), MesExtEnumUtil.MOVE_RULE_MOVE_NUM.MOVE_RULE_MOVE_NUM_20.getValue()) && MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.SHIPPING.getValue() == moveRule.getReportType()) {
|
|
|
|
|
shippingList.add(jisShippingService.getMesJisShipping(orderManagement, detail, moveRule.getErpSrcLocateNo(), orderPart, userInfo));
|
|
|
|
|
} else {
|
|
|
|
|
log.info("客供品移库零件【{}】在零件发运组【{}】的移库规则中,汇报类型未维护或不为发运", orderPart.getPartNo(), workOrder.getPartProdGroupCode());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|