合并宁德发运

uat-temp-wj-chongqingdaqu-prod-huaweiyun-for-cd2
王杰 2 months ago
commit 7576219ed8

@ -0,0 +1,37 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.pojo.mes.bean.MesJisShipping;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author :
* @CreateDate : 2024-04-26 15:37
* @Modify:
**/
public interface IMesNingDeShippingCheckService {
@ApiOperation(value = "扫描发运单")
MesSortShippingCheckModel doShippingOrderNoQuery(MesShippingOrderManagement shippingOrderManagement);
@ApiOperation(value = "保存条码")
MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model);
@ApiOperation(value = "查询发运单-自动推单")
MesShippingOrderManagement queryShippingOrderNoByAutoPushOrder(String shippingGroupNo, String org);
@ApiOperation("保存发运数据")
List<MesJisShipping> getMesJisShippings(MesShippingOrderManagement mesShippingOrderManagement,List<MesShippingOrderManagementDetail> shippingOrderManagementDetails,String userName);
void update(MesShippingOrderManagement item);
void updateDetail(MesShippingOrderManagementDetail item);
void checkPassword(String password, String organizeCode);
}

@ -39,8 +39,6 @@ public interface IMesSortShippingCheckService {
void updateDetail(MesShippingOrderManagementDetail item);
void saveSecondShipScanOrder(MesSortShippingCheckModel model);
@ApiOperation(value = "待发运列表")
MesSortShippingCheckModel getSortShippingQueueList(MesSortShippingCheckModel model);

@ -0,0 +1,193 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNingDeShippingCheckService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.log.MesServiceBusiScanLogService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesRedisLockUtil;
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.MesSortShippingPasswordModel;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.repository.MesServiceBusiScanLogRepository;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
@RestController
@Api(tags = "宁德二次发运校验")
@RequestMapping(MesCommonConstant.MES_YANFEN + "/ning-de-second-shipping")
@Slf4j
public class MesNingDeSecondShippingController {
@Autowired
private IMesNingDeShippingCheckService sortShippingCheckService;
@Autowired
private MesRedisLockUtil redisLockUtil;
@Autowired
private MesServiceBusiScanLogRepository mesServiceBusiScanLogRepository;
private static final String KEY = ":BUSI_LOCK:SORT_SHIPPING_CHECK:";
@PostMapping("/query-shipping-order")
@ApiOperation(value = "查询发运单")
public ResultBean queryLoadingOrderNo(@RequestBody MesShippingOrderManagement shippingOrderManagement) {
if (StringUtils.isEmpty(shippingOrderManagement.getShippingGroupCode())) {
return ResultBean.fail("未选择零件发运组");
}
MesServiceBusiScanLogService scanLogUtil = new MesServiceBusiScanLogService(MesNingDeSecondShippingController.class);
scanLogUtil.setMesServiceBusiScanLogRepository(mesServiceBusiScanLogRepository);
Boolean lockFlg = false;
String moduleKey = null;
String organizeCode = null;
String userInfo = null;
try {
if (StringUtils.isEmpty(shippingOrderManagement.getShippingCode())) {
MesPcnException.throwBusiException("请扫描发运单!");
}
organizeCode = !StringUtils.isEmpty(shippingOrderManagement.getOrganizeCode()) ? shippingOrderManagement.getOrganizeCode() : AuthUtil.getOrganize().getOrganizeCode();
userInfo = !StringUtils.isEmpty(shippingOrderManagement.getUserInfo()) ? shippingOrderManagement.getUserInfo() : AuthUtil.getSessionUser().getUserName();
scanLogUtil.setOrderNo(shippingOrderManagement.getShippingCode());
scanLogUtil.setOrganizeCode(organizeCode);
scanLogUtil.setUserName(userInfo);
moduleKey = organizeCode + KEY + "SHIPPING_CODE:" + shippingOrderManagement.getShippingCode();
scanLogUtil.info(String.format("工厂:%s 排序发运扫描发运单 --- %s --- START --- 操作人:%s --- THREAD:%s", organizeCode, moduleKey, userInfo, Thread.currentThread().getName()));
//加锁
lockFlg = redisLockUtil.redisLock(moduleKey);
scanLogUtil.info(String.format("工厂:%s 排序发运扫描发运单 --- %s --- LOCKED --- 操作人:%s --- THREAD:%s", organizeCode, moduleKey, userInfo, Thread.currentThread().getName()));
// 数据校验
ValidatorBean.checkNotNull(shippingOrderManagement.getShippingCode(), "发运单不能为空");
shippingOrderManagement.setOrganizeCode(organizeCode);
ConvertBean.serviceModelUpdate(shippingOrderManagement, userInfo);
long start = System.currentTimeMillis();
MesSortShippingCheckModel model = sortShippingCheckService.doShippingOrderNoQuery(shippingOrderManagement);
long end = System.currentTimeMillis();
scanLogUtil.info("扫描发运单执行结束", end - start);
return ResultBean.success(model != null ? model.getMsg() : "").setResultObject(model);
} catch (ImppBusiException imppException) {
scanLogUtil.error(imppException.getErrorMsg());
return ResultBean.fail(imppException);
} catch (Exception e) {
scanLogUtil.error(ExceptionUtils.getStackTrace(e));
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
} finally {
//解锁
if (lockFlg) {
redisLockUtil.redisUnLock(lockFlg, moduleKey);
log.info("工厂:{} 排序发运扫描发运单 --- {} --- UNLOCK --- 操作人:{} --- THREAD:{}", organizeCode, moduleKey, userInfo, Thread.currentThread().getName());
}
scanLogUtil.flush();
}
}
@PostMapping("/scan-sn")
@ApiOperation(value = "扫描条码")
public ResultBean saveSn(@RequestBody MesSortShippingCheckModel model) {
MesServiceBusiScanLogService scanLogUtil = new MesServiceBusiScanLogService(MesNingDeSecondShippingController.class);
scanLogUtil.setMesServiceBusiScanLogRepository(mesServiceBusiScanLogRepository);
Boolean lockFlg = false;
String moduleKey = null;
String organizeCode = null;
String userInfo = null;
try {
if (StringUtils.isEmpty(model.getSn())) {
MesPcnException.throwBusiException("请扫描条码!");
}
organizeCode = !StringUtils.isEmpty(model.getOrganizeCode()) ? model.getOrganizeCode() : AuthUtil.getOrganize().getOrganizeCode();
userInfo = !StringUtils.isEmpty(model.getUserInfo()) ? model.getUserInfo() : AuthUtil.getSessionUser().getUserName();
scanLogUtil.setOrderNo(model.getShippingCode());
scanLogUtil.setOrganizeCode(organizeCode);
scanLogUtil.setUserName(userInfo);
scanLogUtil.setSn(model.getSn());
//增加单据锁
moduleKey = organizeCode + KEY + "SHIPPING_CODE:" + model.getShippingCode();
scanLogUtil.info(String.format("工厂:%s 排序发运扫描条码 --- %s --- START --- 操作人:%s --- THREAD:%s", organizeCode, model.getSn(), userInfo, Thread.currentThread().getName()));
//加锁
lockFlg = redisLockUtil.redisLock(moduleKey);
scanLogUtil.info(String.format("工厂:%s 排序发运扫描条码 --- %s --- LOCKED --- 操作人:%s --- THREAD:%s", organizeCode, model.getSn(), userInfo, Thread.currentThread().getName()));
// 数据校验
ValidatorBean.checkNotNull(model.getShippingCode(), "发运单不能为空");
ValidatorBean.checkNotNull(model.getDetailList(), "发运明细不能为空");
ValidatorBean.checkNotNull(model.getSn(), "条码不能为空");
model.setOrganizeCode(organizeCode);
model.setUserInfo(userInfo);
model.setSecondShipping(true);
long start = System.currentTimeMillis();
sortShippingCheckService.saveSn(model);
long end = System.currentTimeMillis();
scanLogUtil.info("扫描发运条码执行结束", end - start);
return ResultBean.success(model.getMsg()).setResultObject(model);
} catch (ImppBusiException imppException) {
scanLogUtil.error(imppException.getErrorMsg());
return ResultBean.fail(imppException);
} catch (Exception e) {
scanLogUtil.error(ExceptionUtils.getStackTrace(e));
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
} finally {
//解锁
if (lockFlg) {
redisLockUtil.redisUnLock(lockFlg, moduleKey);
log.info("工厂:{} 排序发运扫描条码 --- {} --- UNLOCK --- 操作人:{} --- THREAD:{}", organizeCode, model.getSn(), userInfo, Thread.currentThread().getName());
}
scanLogUtil.flush();
}
}
@GetMapping("/query-auto-push-order")
@ApiOperation(value = "自动推单")
public ResultBean queryAutoPushOrder(String shippingGroupNo, String organizeCode) {
try {
organizeCode = !StringUtils.isEmpty(organizeCode) ? organizeCode : AuthUtil.getOrganize().getOrganizeCode();
MesShippingOrderManagement order = sortShippingCheckService.queryShippingOrderNoByAutoPushOrder(shippingGroupNo, organizeCode);
return ResultBean.success("查询成功").setResultObject(order);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/check-password")
@ApiOperation(value = "校验二次发运操作密码")
public ResultBean checkPassword(@RequestBody MesSortShippingPasswordModel model) {
if (StringUtils.isEmpty(model.getPassword())) {
return ResultBean.fail("密码不能为空!");
}
try {
String organizeCode = !StringUtils.isEmpty(model.getOrganizeCode()) ? model.getOrganizeCode() : AuthUtil.getOrganize().getOrganizeCode();
sortShippingCheckService.checkPassword(model.getPassword(), organizeCode);
return ResultBean.success("校验成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -258,20 +258,4 @@ public class MesSortShippingCheckController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/second-ship-scan-order")
@ApiOperation(value = "宁德二次发运防错扫描发运单")
public ResultBean secondShipScanOrder(@RequestBody MesSortShippingCheckModel model) {
try {
if (model.getMesPartShippingGroup() == null) {
return ResultBean.fail("未选择零件发运组");
}
sortShippingCheckService.saveSecondShipScanOrder(model);
return ResultBean.success(model.getMsg()).setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,809 @@
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;
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.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.shipping.*;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.repository.edi.cd.MesCimVolvoJisRackIdDetailRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
* @Reference :
* @Author :
* @CreateDate : 2024-04-26 15:38
* @Modify:
**/
@Service
@Slf4j
public class MesNingDeShippingCheckService implements IMesNingDeShippingCheckService {
@Autowired
private MesShippingOrderManagementRepository shippingOrderManagementRepository;
@Autowired
private MesShippingOrderManagementDetailRepository shippingOrderManagementDetailRepository;
@Autowired
private MesProduceSnRepository produceSnRepository;
@Autowired
private MesLoadingListRepository listRepository;
@Autowired
private MesLoadingListDetailRepository listDetailRepository;
@Autowired
private MesJisShippingRepository jisShippingRepository;
@Autowired
private IMesJisShippingService jisShippingService;
@Autowired
private MesLoadingListDetailRepository vehiclesOrderDetailRepository;
@Autowired
private MesLoadingListRepository vehiclesOrderRepository;
@Autowired
private MesPartShippingGroupService mesPartShippingGroupService;
@Autowired
private MesBallTrackRuleRepository mesBallTrackRuleRepository;
@Autowired
private IMesWorkOrderExtService mesWorkOrderExtService;
@Autowired
private IMesEquipmentExtService mesEquipmentExtService;
@Autowired
private IMesEquipVariableRwExtService equipVariableRwExtService;
@Autowired
private IMesEmergencyLocationService mesEmergencyLocationService;
@Autowired
private IMesShippingSnUniqueService mesShippingSnUniqueService;
@Autowired
private MesShippingSnUniqueRepository mesShippingSnUniqueRepository;
@Autowired
private IMesWorkOrderService mesWorkOrderService;
@Autowired
private IMesMoveRuleService mesMoveRuleService;
@Autowired
private IMesPartService mesPartService;
@Autowired
private IMesProductionRecordService mesProductionRecordService;
@Autowired
private IMesProduceSnExtService mesProduceSnExtService;
@Autowired
private MesMoveRepository moveRepository;
@Autowired
private MesShippingQueueRepository shippingQueueRDao;
@Autowired
private IMesConfigService mesConfigService;
@Autowired
private MesVolvoRackRepository mesVolvoRackRDao;
@Autowired
private MesCustSoftInfoRepository custSoftInfoRDao;
@Autowired
private MesCimVolvoJisRackIdDetailRepository rackIdDetailRDao;
@Autowired
private IMesLoadingGroupRepository mesLoadingGroupRDao;
@Override
public MesSortShippingCheckModel doShippingOrderNoQuery(MesShippingOrderManagement shippingOrderManagement) {
//返回数据组装
MesSortShippingCheckModel model = new MesSortShippingCheckModel();
//校验发运单
MesShippingOrderManagement orderManagement = getMesShippingOrderManagement(shippingOrderManagement, shippingOrderManagement.getShippingGroupCode());
if(Objects.isNull(orderManagement)){
model.setMsg(String.format("发运单【%s】已跳过请扫描下一个发运单",shippingOrderManagement.getShippingCode()));
return model;
}
MesPartShippingGroup partShippingGroup = getMesPartShippingGroup(orderManagement.getOrganizeCode(),orderManagement.getShippingGroupCode());
//校验发运单扫描顺序
checkShippingOrderSeq(shippingOrderManagement, orderManagement);
//根据扫描的发运单找到是否装车配置,若是,则根据发运单查询是否生成装车单,若没生成装车单则提示此发运单配置是否装车为是,但没生成装车单,请检查数据!
// checkLoadingList(shippingOrderManagement, orderManagement, partShippingGroup);
if (!StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
model.setIsScanLocationCode(true);
}
//发运单号
model.setShippingCode(orderManagement.getShippingCode());
//零件发运组
model.setMesPartShippingGroup(partShippingGroup);
//发运单明细
model.setDetailList(getMesShippingOrderManagementDetails(orderManagement,model.getMesPartShippingGroup()));
//最近扫描完成的发运单号
MesShippingOrderManagement lastShippingOrder = getLastShippingOrder(orderManagement.getOrganizeCode());
if (!Objects.isNull(lastShippingOrder)) {
model.setRecentlyScanShippingCode(lastShippingOrder.getShippingCode());
}
model.setMsg(String.format("发运单【%s】扫描成功请扫描条码",model.getShippingCode()));
return model;
}
@Override
public MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model) {
//校验发运单是否存在
MesShippingOrderManagement orderManagement = checkMesShippingOrderManagement(model);
//零件发运组
MesPartShippingGroup shippingGroup = Objects.isNull(model.getMesPartShippingGroup()) ? getMesPartShippingGroup(orderManagement.getOrganizeCode(), orderManagement.getShippingGroupCode()) : model.getMesPartShippingGroup();
//扫描强过码
model.setMesPartShippingGroup(shippingGroup);
if (!Objects.isNull(model.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE, model.getIsPass())) {
skipShippingDetails(model, model.getUserInfo(), orderManagement);
//扫描条码
} else if (!Objects.isNull(model.getIsPass()) && Objects.equals(MesPcnExtConstWords.THREE, model.getIsPass())) {
forcePassShippingDetails(model, model.getUserInfo(), orderManagement);
//扫描条码
} else {
/**
* bug 44253 by castle Pisces/
*
*
* 1.
*
* 2.
*
* 3.
*
* 4. ,
*
* 5.
*/
if(!checkFrontProcess(model, shippingGroup)){
MesPcnException.throwMesBusiException("条码【%s】前道校验未通过请检查数据",model.getSn());
}
if (StringUtils.isEmpty(shippingGroup.getConfirmPartType())) {
MesPcnException.throwMesBusiException("零件发运组【%s】扫描确认方式未维护请检查数据");
}
model = ((IMesShippingScanStrategyService) SpringContextsUtil.getBean(MesExtEnumUtil.SHIPPING_GROUP_CONFIRM_PART_TYPE.valueOfServiceImpl(Integer.parseInt(shippingGroup.getConfirmPartType())))).doScan(model, orderManagement, shippingGroup);
}
model.setDetailList(model.getDetailList());
//当前发运单全部扫描完成 并且不需要扫位置码
if (model.getIsScanCount() == model.getDetailList().size() && StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
//保存数据库
saveDate(orderManagement, model, model.getOrganizeCode(), model.getUserInfo());
model.setMsg(String.format("发运单【%s】已发运完成请扫描下一个发运单",model.getShippingCode()));
}
return model;
}
private boolean checkFrontProcess(MesSortShippingCheckModel model,MesPartShippingGroup shippingGroup){
boolean flag = false;
String organizeCode = model.getOrganizeCode();
//1.首先校验自制件
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (Objects.isNull(produceSn)) {
//外协件不需要校验前道工艺
flag = true;
}else{
//自制件校验前道工艺 零件发运组详情中的优先
MesPartShippingGroupDetail groupDetail = mesPartShippingGroupService.getMesPartShippingGroupDetailByPartNo(organizeCode, shippingGroup.getShippingGroupCode(), produceSn.getPartNo());
if (null == groupDetail) {
return true;
}
if (!StringUtils.isEmpty(groupDetail.getFrontProcessCode())){
Integer count = mesProductionRecordService.findFrontProcessProductionRecord(organizeCode, produceSn.getProductSn(), groupDetail.getFrontProcessCode());
if (count > 0){
flag = true;
}
}else if (!StringUtils.isEmpty(shippingGroup.getFrontProcessCode())){
Integer count = mesProductionRecordService.findFrontProcessProductionRecord(organizeCode, produceSn.getProductSn(), shippingGroup.getFrontProcessCode());
if (count > 0){
flag = true;
}
}else {
//如果都没有
flag = true;
}
}
return flag;
}
@Override
public MesShippingOrderManagement queryShippingOrderNoByAutoPushOrder(String shippingGroupNo, String org) {
//查询最近扫描完成的装车单号
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderPackBean);
DdlPreparedPack.getStringEqualPack(shippingGroupNo, "shippingGroupCode", orderPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"seq"}, orderPackBean);
return shippingOrderManagementRepository.getByProperty(orderPackBean);
}
private MesPartShippingGroup getMesPartShippingGroup(String org, String partShippingGroupCode) {
if(StringUtil.isEmpty(org) ||StringUtil.isEmpty(partShippingGroupCode)){
throw new ImppBusiException("零件发运组信息不存在,请检查数据!");
}
MesPartShippingGroup shippingGroup = mesPartShippingGroupService.getMesPartShippingGroup(org, partShippingGroupCode);
if(Objects.isNull(shippingGroup)){
throw new ImppBusiException(String.format("零件发运组【%s】信息不存在请检查数据", partShippingGroupCode));
}
return shippingGroup;
}
private MesShippingOrderManagement getMesShippingOrderManagement(MesShippingOrderManagement shippingOrderManagement, String shippingGroupCode) {
//查询发运单信息 发运跳过
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(shippingOrderManagement.getShippingCode(), "shippingCode", orderManagementPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (StringUtils.isEmpty(orderManagement)) {
throw new ImppBusiException(String.format("【%s】此发运单不存在请检查数据", shippingOrderManagement.getShippingCode()));
}
if (!Objects.equals(orderManagement.getShippingGroupCode(), shippingGroupCode)) {
MesPcnException.throwMesBusiException("发运单【%s】不属于发运组【%s】请检查数据", orderManagement.getShippingCode(), shippingGroupCode);
}
//校验发运单状态 必须是已发运的状态
if (!Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue()).collect(Collectors.toList()).contains(orderManagement.getStatus())) {
throw new ImppBusiException(String.format("【%s】此发运单状态为【%s】,请选择状态为【%s】状态的发运单请检查数据", shippingOrderManagement.getShippingCode(),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.valueOfDescription(orderManagement.getStatus()),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getDescription()));
}
//跳过
if (Objects.equals(MesPcnExtConstWords.THREE, shippingOrderManagement.getIsPass())) {
//跳过的单据和明细,系统默认是完成的
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SECOND_SHIPPED.getValue());
orderManagement.setRemark(MesPcnExtConstWords.SHIP_PASS);
ConvertBean.serviceModelUpdate(orderManagement, shippingOrderManagement.getModifyUser());
vehiclesOrderRepository.update(orderManagement);
//明细跳过
updateShippingOrderDetails(orderManagement.getOrganizeCode(), shippingOrderManagement.getModifyUser(), orderManagement.getId());
return null;
}
return orderManagement;
}
private void checkShippingOrderSeq(MesShippingOrderManagement shippingOrderManagement, MesShippingOrderManagement orderManagement) {
//最后一个扫描完成的发运单信息
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getNumberSmallerPack(orderManagement.getSeq(), "seq", orderManagementPackBean);
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", orderManagementPackBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SECOND_SHIPPED.getValue(), "status", orderManagementPackBean);
DdlPreparedPack.getOrderBy("seq", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), orderManagementPackBean);
MesShippingOrderManagement management = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
//当前发运组是否存在比当前小的序号,且状态是未发运完成
orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getNumberSmallerPack(orderManagement.getSeq(), "seq", orderManagementPackBean);
if (!Objects.isNull(management)) {
DdlPreparedPack.getNumberBiggerPack(management.getSeq(), "seq", orderManagementPackBean);
}
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", orderManagementPackBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderManagementPackBean);
DdlPreparedPack.getOrderBy("seq", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), orderManagementPackBean);
MesShippingOrderManagement shippingOrder = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (!Objects.isNull(shippingOrder)) {
//1强过
if ((!Objects.isNull(shippingOrderManagement.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE, shippingOrderManagement.getIsPass()))) {
orderManagement.setRemark(MesPcnExtConstWords.STRONGER_PASS);
ConvertBean.serviceModelUpdate(orderManagement, shippingOrderManagement.getModifyUser());
vehiclesOrderRepository.update(orderManagement);
} else {
throw new ImppBusiException(String.format("【%s】发运单对应排序【%s】前存在未扫描发运的发运单【%s】序号【%s】请检查数据",
orderManagement.getShippingCode(), orderManagement.getSeq(),shippingOrder.getShippingCode(),shippingOrder.getSeq()));
}
}
}
// private void checkLoadingList(MesShippingOrderManagement shippingOrderManagement, MesShippingOrderManagement orderManagement, MesPartShippingGroup partShippingGroup) {
// if (Objects.equals(orderManagement.getIsLoading(), MesCommonConstant.TRUE_INTEGER)) {
// //查询装车单明细
// DdlPackBean packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
// DdlPreparedPack.getStringEqualPack(orderManagement.getShippingCode(),"shippingCode",packBean);
// MesLoadingListDetail listDetail = listDetailRepository.getByProperty(packBean);
// if(Objects.isNull(listDetail)){
// throw new ImppBusiException(String.format("【%s】此发运单配置是否装车为是,但没绑定装车单号,请检查数据!", shippingOrderManagement.getShippingCode()));
// }
// packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
// DdlPreparedPack.getNumEqualPack(listDetail.getPid(), "id", packBean);
// MesLoadingList loadingList = listRepository.getByProperty(packBean);
// if(Objects.isNull(loadingList)){
// throw new ImppBusiException(String.format("【%s】此发运单配置是否装车为是,但没生成装车单,请检查数据!", shippingOrderManagement.getShippingCode()));
// }
// //判断是否先装车
// if (mesPartShippingGroupService.isFirstInstall(partShippingGroup, loadingList)) {
// //若没进行装车校验,则提示【%s】此发运单对应的【%s】此装车单状态为【%s】请选择状态为【%s】的数据
// if (loadingList.getStatus() != MesExtEnumUtil.MES_LOADING_STATUS.SCANNED.getValue()) {
// throw new ImppBusiException(String.format("【%s】此发运单对应的【%s】此装车单状态为【%s】请选择状态为【%s】的数据请检查数据",
// shippingOrderManagement.getShippingCode(), loadingList.getOrderCode(),
// MesExtEnumUtil.MES_LOADING_STATUS.valueOfDescription(loadingList.getStatus()),
// MesExtEnumUtil.MES_LOADING_STATUS.SCANNED.getDescription()));
// }
// }
// }
// }
private List<MesShippingOrderManagementDetail> getMesShippingOrderManagementDetails(MesShippingOrderManagement orderManagement,MesPartShippingGroup mesPartShippingGroup) {
//45550 PDA-MES-PDA发运扫描排序方式修改
List<MesConfig> shippingBusiSoftCfgList = mesConfigService.getConfigList(orderManagement.getOrganizeCode(),
MesCommonConstant.SHIPPING_BUSI_SOFT_CFG, mesPartShippingGroup.getShippingGroupCode(), null);
DdlPackBean orderDetailPackBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderDetailPackBean);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.CLOSE.getValue(),"status",orderDetailPackBean);
if (CollectionUtils.isEmpty(shippingBusiSoftCfgList)) {
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"custInfoSeq"}, orderDetailPackBean);
}else {
MesConfig mesConfig = shippingBusiSoftCfgList.get(0);
if (!Objects.isNull(mesConfig) &&
!StringUtils.isEmpty(mesConfig.getCfgValue()) &&
"logic_seq".equals(mesConfig.getCfgValue())) {
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"logicSeq"}, orderDetailPackBean);
}
}
List<MesShippingOrderManagementDetail> detailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderDetailPackBean);
if(CollectionUtils.isEmpty(detailList)){
throw new ImppBusiException(String.format("发运单【%s】明细信息不存在请检查数据", orderManagement.getShippingCode()));
}
//已扫描数据
detailList.forEach(k -> {
if (Objects.equals(k.getSecondScanFlg(), MesCommonConstant.TRUE_INTEGER)){
k.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
}
});
//序号,总成类型顺序
if(!Objects.isNull(mesPartShippingGroup.getScanSeqWay()) && !StringUtil.isEmpty(mesPartShippingGroup.getPartType()) && mesPartShippingGroup.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE_40.getValue()){
return mesShippingOrderManagementDetailsSort(mesPartShippingGroup, detailList);
}
return detailList;
}
private List<MesShippingOrderManagementDetail> mesShippingOrderManagementDetailsSort(MesPartShippingGroup mesPartShippingGroup, List<MesShippingOrderManagementDetail> detailList) {
List<MesShippingOrderManagementDetail> resultDetails = new ArrayList<>();
Map<Long, List<MesShippingOrderManagementDetail>> detailMap = detailList.stream().collect(Collectors.groupingBy(MesShippingOrderManagementDetail::getCustInfoSeq));
List<String> partTypeList = Arrays.asList(mesPartShippingGroup.getPartType().split(MesPcnExtConstWords.COMMA));
for (Long seq : detailMap.keySet()) {
List<MesShippingOrderManagementDetail> details = detailMap.get(seq);
if (details.size() > MesPcnExtConstWords.ONE) {
Map<String, List<MesShippingOrderManagementDetail>> containsMap = details.stream().filter(t -> partTypeList.contains(t.getPartTypeCode())).collect(Collectors.groupingBy(MesShippingOrderManagementDetail::getPartTypeCode));
List<MesShippingOrderManagementDetail> noContains = details.stream().filter(t -> !partTypeList.contains(t.getPartTypeCode())).collect(Collectors.toList());
//按照维护的总成类型显示
for (String type : partTypeList){
if (!Objects.isNull(containsMap) && containsMap.containsKey(type)){
resultDetails.addAll(containsMap.get(type));
}
}
//相同seq总成类型未维护放在最后面显示
if (!CollectionUtils.isEmpty(noContains)){
resultDetails.addAll(noContains);
}
} else {
resultDetails.addAll(details);
}
}
return resultDetails;
}
private MesShippingOrderManagement getLastShippingOrder(String organizeCode) {
DdlPackBean recentlyOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", recentlyOrderPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"modifyDatetime"}, recentlyOrderPackBean);
return shippingOrderManagementRepository.getByProperty(recentlyOrderPackBean);
}
private void updateOrderManagementDetails(String userInfo, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS status) {
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setSecondScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(status.getValue());
detail.setRemark(MesPcnExtConstWords.STRONGER_PASS);
//根据是否启动记忆判断 若启用记忆,则根据保存数据库
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
//若发运单状态为已发运 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue()) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
//发运单状态
// orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
update(orderManagement);
//发运单明细
detail.setActualQty(1);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
updateDetail(detail);
}
}
private MesSortShippingCheckModel skipShippingDetails(MesSortShippingCheckModel model, String userInfo, MesShippingOrderManagement orderManagement) {
Optional<MesShippingOrderManagementDetail> shippingOrderManagementDetailOptional = model.getDetailList().stream().filter(t -> !Objects.equals(t.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if(!shippingOrderManagementDetailOptional.isPresent()){
throw new ImppBusiException(String.format("【%s】明细已全部扫描完成请检查数据", orderManagement.getShippingCode()));
}
//更新明细
updateOrderManagementDetails(userInfo, orderManagement, shippingOrderManagementDetailOptional.get(), MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP);
return model;
}
private MesSortShippingCheckModel forcePassShippingDetails(MesSortShippingCheckModel model, String userInfo, MesShippingOrderManagement orderManagement) {
Optional<MesShippingOrderManagementDetail> shippingOrderManagementDetailOptional = model.getDetailList().stream().filter(t -> !Objects.equals(t.getSecondScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if(!shippingOrderManagementDetailOptional.isPresent()){
throw new ImppBusiException(String.format("【%s】明细已全部扫描完成请检查数据", orderManagement.getShippingCode()));
}
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (Objects.equals(detail.getSecondScanFlg(), MesCommonConstant.TRUE_INTEGER) && Objects.equals(detail.getBarcode(), model.getSn())) {
throw new ImppBusiException(String.format("【%s】条码已进行二次发运扫描请检查数据", model.getSn()));
}
}
MesProduceSn produceSn = checkSecondSn(model);
//更新明细
MesShippingOrderManagementDetail detail = shippingOrderManagementDetailOptional.get();
detail.setBarcode(model.getSn());
updateOrderManagementDetails(userInfo, orderManagement, detail, MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED);
return model;
}
/**
*
* @param model
*/
private MesProduceSn checkSecondSn(MesSortShippingCheckModel model) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (produceSn == null) {
throw new ImppBusiException(String.format("【%s】此条码无效,请检查数据!", model.getSn()));
}
//校验产品条码状态 必须是状态为已下线条码
if (produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择状态为【%s】或【%s】或【%s】状态的条码请检查数据", model.getSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()),
MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue()));
}
//校验产品质量状态 必须是状态为合格条码
List<Integer> statusList = Stream.of(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue(), MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue()).collect(Collectors.toList());
if (!statusList.contains(produceSn.getQcStatus())){
throw new ImppBusiException(String.format("【%s】此条码质量状态为【%s】,请选择【%s】状态的条码请检查数据", model.getSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()),
MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getDescription()));
}
return produceSn;
}
private MesShippingOrderManagement checkMesShippingOrderManagement(MesSortShippingCheckModel model) {
//校验发运单是否存在
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getShippingCode(), "shippingCode", orderManagementPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (StringUtils.isEmpty(orderManagement)) {
throw new ImppBusiException(String.format("【%s】此发运单不存在请检查数据", model.getShippingCode()));
}
return orderManagement;
}
public void saveDate(MesShippingOrderManagement orderManagement, MesSortShippingCheckModel model, String organizeCode, String userInfo) {
//发运单状态修改为校验完成
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SECOND_SHIPPED.getValue());
orderManagement.setEndScanTime(TimeTool.getNowTime(true));
//零件发运组
MesPartShippingGroup shippingGroup = Objects.isNull(model.getMesPartShippingGroup()) ? getMesPartShippingGroup(orderManagement.getOrganizeCode(), orderManagement.getShippingGroupCode()) : model.getMesPartShippingGroup();
//发运单明细状态修改为校验完成
DdlPackBean orderManagementDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> orderManagementDetailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderManagementDetailPackBean);
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()));
final String confirmPartType = getConfirmPartType(orderManagement);
List<MesProduceSn> produceSnList = new ArrayList<>();
List<String> workOrderNoList = new ArrayList<>();
List<MesShippingSnUnique> mesShippingSnUniqueList = new ArrayList<>();
List<MesJisShipping> shippingList = new ArrayList<>();
for (MesShippingOrderManagementDetail detail : orderManagementDetailList) {
if (!Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
BeanUtils.copyProperties(custInfoSeqMap.get(detail.getId()).iterator().next(), detail);
} else if (!StringUtil.isEmpty(detail.getBarcode()) && detail.getBarcode().contains(MesPcnExtConstWords.COMMA)) {
detail.setVisualOrderNo(detail.getBarcode().split(MesPcnExtConstWords.COMMA)[MesPcnExtConstWords.ZERO]);
}
//更新条码信息,更新目视单信息
if(!StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
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 {
//记录唯一性校验表
mesShippingSnUniqueList.add(mesShippingSnUniqueService.getMesShippingSnUnique(organizeCode, detail.getBarcode(), orderManagement.getShippingCode(), userInfo));
}
//更新工单
if(!StringUtils.isEmpty(detail.getVisualOrderNo())){
workOrderNoList.add(detail.getVisualOrderNo());
//更新应急件库位管理库存出库
mesEmergencyLocationService.doShippingStockOutOnline(organizeCode, detail.getVisualOrderNo(), userInfo, true);
// 保存到发运队列,后续发运单的条码会拼接,而保存到发运队列中的为拼接前的数据,因此要在拼接前调用。
saveShippingQueue(orderManagement, detail, userInfo);
if (!Objects.equals(confirmPartType, String.valueOf(MesExtEnumUtil.SHIPPING_GROUP_CONFIRM_PART_TYPE.SHIPPING_GROUP_CONFIRM_PART_TYPE_40.getValue()))) {
if (Objects.equals(confirmPartType, String.valueOf(MesExtEnumUtil.SHIPPING_GROUP_CONFIRM_PART_TYPE.SHIPPING_GROUP_CONFIRM_PART_TYPE_50.getValue()))) {
detail.setBarcode(detail.getBarcode() + "," + detail.getPartPosition());
} else {
//条码格式(扫描目视单,扫描条码)
detail.setBarcode(new StringJoiner(MesPcnExtConstWords.COMMA).add(detail.getVisualOrderNo()).add(detail.getBarcode()).toString());
}
}
}
}
//客供品移库
customerSupplyMove(sortShippingModel, detail);
detail.setIsValid(CommonEnumUtil.VALID);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
detail.setActualQty(MesPcnExtConstWords.ONE);
ConvertBean.serviceModelUpdate(detail, userInfo);
}
//保存唯一性表
if(!CollectionUtils.isEmpty(mesShippingSnUniqueList)){
mesShippingSnUniqueRepository.saveAll(mesShippingSnUniqueList);
}
//更新条码
if(!CollectionUtils.isEmpty(produceSnList)){
produceSnRepository.saveAll(produceSnList);
}
//更新工单状态为已发运
if(!CollectionUtils.isEmpty(workOrderNoList)){
mesWorkOrderExtService.updateMesWorkOrderOrderStatusShippingByWorkOrderNo(organizeCode, workOrderNoList, userInfo);
}
//更新发运单
ConvertBean.serviceModelUpdate(orderManagement,userInfo);
update(orderManagement);
//不记忆时更新明细
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && !Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)){
shippingOrderManagementDetailRepository.saveAll(orderManagementDetailList);
}
if (StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())) {
//发送数据给辊道线
sendShippingFinishedCmd(model, organizeCode);
//保存当前发运单明细
List<MesJisShipping> mesJisShippings = getMesJisShippings(orderManagement, orderManagementDetailList, userInfo);
if (!CollectionUtils.isEmpty(mesJisShippings)) {
shippingList.addAll(mesJisShippings);
}
}
//发运结果回传
if(!CollectionUtils.isEmpty(shippingList)){
jisShippingRepository.saveAll(shippingList);
}
}
private void sendShippingFinishedCmd(MesSortShippingCheckModel model, String organizeCode) {
if (!Objects.isNull(model.getMesPartShippingGroup()) && !StringUtil.isEmpty(model.getMesPartShippingGroup().getEquipmentCode())) {
//辊道设备配置
MesBallTrackRule rule = getMesBallTrackRule(model, organizeCode);
//设备变量
MesEquipmentVariable mesEquipmentVariable = mesEquipmentExtService.getMesEquipmentVariable(organizeCode, rule.getEquipmentCode(), rule.getEquipVariableId());
if (Objects.isNull(mesEquipmentVariable)) {
MesPcnException.throwMesBusiException("设备【%s】设备变量ID【%s】信息不存在请检查", rule.getEquipmentCode(), rule.getEquipVariableId());
}
//设备通道
MesEquipmentChannel mesEquipmentChannel = mesEquipmentExtService.getMesEquipmentChannel(organizeCode, rule.getEquipmentCode(), mesEquipmentVariable.getChannel());
if (Objects.isNull(mesEquipmentChannel)) {
MesPcnException.throwMesBusiException("设备【%s】设备通道【%s】信息不存在请检查", rule.getEquipmentCode(), mesEquipmentVariable.getChannel());
}
//写入
MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(rule.getEquipVariableValue(), mesEquipmentVariable, mesEquipmentChannel.getKepwareFlag());
if (!equipVariableRwResult.getIsSuccessed()) {
MesPcnException.throwMesBusiException(String.format("设备【%s】:发运成功指令发送失败!原因:%s", mesEquipmentChannel.getEquipmentName(), JSONObject.toJSONString(equipVariableRwResult)));
}
}
}
private MesBallTrackRule getMesBallTrackRule(MesSortShippingCheckModel model, String organizeCode) {
DdlPackBean bean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(model.getMesPartShippingGroup().getEquipmentCode(), "equipmentCode", bean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.BALL_TRACK_TYPE.BALL_TRACK_TYPE_30.getValue(), "ballTrackType", bean);
MesBallTrackRule rule = mesBallTrackRuleRepository.getByProperty(bean);
if (Objects.isNull(rule) || Objects.isNull(rule.getEquipVariableId())) {
MesPcnException.throwMesBusiException("设备【%s】辊道设备配置信息不存在请检查", model.getMesPartShippingGroup().getEquipmentCode());
}
return rule;
}
@Override
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);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue(), "status", detailPackBean);
shippingOrderManagementDetails = shippingOrderManagementDetailRepository.findByHqlWhere(detailPackBean);
}
//当前装车单所有发运单明细 需要报工的数据
return jisShippingService.getJisShipping(mesShippingOrderManagement, shippingOrderManagementDetails, userName);
}
@Override
@MonitorLog
public void update(MesShippingOrderManagement item) {
shippingOrderManagementRepository.update(item);
}
@Override
@MonitorLog
public void updateDetail(MesShippingOrderManagementDetail item) {
shippingOrderManagementDetailRepository.update(item);
}
@Override
public void checkPassword(String password, String organizeCode) {
String configPassword = mesConfigService.getCfgValue(organizeCode, MesCommonConstant.SECOND_SHIPPING_CHECK_PASSWORD);
if (!Objects.equals(password, configPassword)) {
MesPcnException.throwMesBusiException("密码错误,请重新输入!");
}
}
private void updateShippingOrderDetails(String organizeCode, String userName, long id) {
if(StringUtils.isEmpty(id) || StringUtils.isEmpty(organizeCode)) {
return;
}
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(id, "pid",packBean);
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.setMesPartList(mesPartService.findMesPartByPartNo(sortShippingModel.getPartNoAllList(), organizeCode));
sortShippingModel.setMesMoveRuleList(mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(shippingGroupCode, organizeCode,MesExtEnumUtil.MOVE_RULE_GROUP_TYPE.MOVE_RULE_GROUP_TYPE_10.getValue()));
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(MesSortShippingModel sortShippingModel, MesShippingOrderManagementDetail detail) {
detail.setSaveFlag(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
// 宁德配置了移库规则为二次发运后则第一次发运时不写入jis_Shipping表二次发运才写入否则第一次写入二次发运后不写入。
if (!CollectionUtils.isEmpty(sortShippingModel.getMesMoveRuleList())) {
MesMoveRule moveRule = sortShippingModel.getMesMoveRuleList().get(0);
if (moveRule != null && Objects.equals(moveRule.getMoveNum(), MesExtEnumUtil.MOVE_RULE_MOVE_NUM.MOVE_RULE_MOVE_NUM_40.getValue())) {
detail.setSaveFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
}
}
}
private void doCreateReworkMove(String organizeCode,String userName, String srcLocate, String destLocate, String workCenterCode, String partNo, double qty, String sn) {
MesPartSap mesPartSap = mesPartService.getMesPartSapByPartNo(partNo, organizeCode);
MesMove move = new MesMove();
move.setMatnr(mesPartSap.getPartNo());
move.setOrganizeCode(organizeCode);
move.setFactoryCode(organizeCode);
move.setLgort(srcLocate);
move.setUmlgo(destLocate);
move.setPartInspectionId(0L);
move.setMenge(qty);
move.setMeins(mesPartSap.getUnit());
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.RETURN_MOVE.getValue());
move.setProductSn(sn);
move.setWorkCenter(workCenterCode);
ConvertBean.serviceModelInitialize(move, userName);
moveRepository.insert(move);
}
private void saveShippingQueue(MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, String userInfo) {
if (StringUtil.isEmpty(detail.getVin())) {
MesPcnException.throwMesBusiException("发运单【%s】零件号【%s】vin号为空请检查数据", orderManagement.getShippingCode(), detail.getPartNo());
}
final boolean matchCfgValue = mesConfigService.checkCfgValueIsContainItem(orderManagement.getOrganizeCode(), MesPcnExtConstWords.MES_SHIPPING_QUEUE_SAVE_CFG, MesPcnExtConstWords.MES_SHIPPING_QUEUE_SAVE_CFG, null, ",", orderManagement.getShippingGroupCode());
if (!matchCfgValue) {
return;
}
int limitValue = 0;
List<MesConfig> limitConfig = mesConfigService.getConfigList(orderManagement.getOrganizeCode(), MesPcnExtConstWords.MES_SHIPPING_QUEUE_SAVE_CFG, "LIMIT", null);
if (!CollectionUtils.isEmpty(limitConfig)) {
String strLimitValue = limitConfig.get(0).getCfgValue();
if (!StringUtil.isEmpty(strLimitValue)) {
try {
limitValue = Integer.parseInt(strLimitValue);
} catch (Exception ignored) {
}
}
}
if (limitValue > 0) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue(), "queueStatus", packBean);
int count = shippingQueueRDao.findByHqlWhereCount(packBean);
if (count >= limitValue) {
MesPcnException.throwMesBusiException("当前发运组【%s】的发运队列已满请稍后重试", orderManagement.getShippingGroupCode());
}
}
MesShippingQueue mesShippingQueue = new MesShippingQueue();
mesShippingQueue.setOrganizeCode(orderManagement.getOrganizeCode());
mesShippingQueue.setShippingCode(orderManagement.getShippingCode());
mesShippingQueue.setShippingGroupCode(orderManagement.getShippingGroupCode());
mesShippingQueue.setShippingType(orderManagement.getShippingType());
mesShippingQueue.setWorkOrderNo(detail.getVisualOrderNo());
mesShippingQueue.setCustSn(detail.getBarcode());
mesShippingQueue.setPartNo(detail.getPartNo());
mesShippingQueue.setPartName(detail.getPartName());
mesShippingQueue.setVin(detail.getVin());
mesShippingQueue.setQueueStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
ConvertBean.serviceModelInitialize(mesShippingQueue, userInfo);
shippingQueueRDao.insert(mesShippingQueue);
}
private String getConfirmPartType(MesShippingOrderManagement orderManagement) {
if (StringUtils.isEmpty(orderManagement.getShippingGroupCode())) {
return "";
}
MesPartShippingGroup shippingGroup = mesPartShippingGroupService.getMesPartShippingGroup(orderManagement.getOrganizeCode(), orderManagement.getShippingGroupCode());
if (shippingGroup == null) {
return "";
}
return shippingGroup.getConfirmPartType();
}
}

@ -410,7 +410,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
throw new ImppBusiException(String.format("【%s】此发运单不存在请检查数据", shippingOrderManagement.getShippingCode()));
}
//校验发运单状态 必须是未装车条码
if (!Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue(),MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue(),MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue()).collect(Collectors.toList()).contains(orderManagement.getStatus())) {
if (!Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue(),MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue()).collect(Collectors.toList()).contains(orderManagement.getStatus())) {
throw new ImppBusiException(String.format("【%s】此发运单状态为【%s】,请选择状态为【%s】或【%s】状态的发运单请检查数据", shippingOrderManagement.getShippingCode(),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.valueOfDescription(orderManagement.getStatus()),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getDescription(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getDescription()));
@ -493,7 +493,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
//45550 PDA-MES-PDA发运扫描排序方式修改
List<MesConfig> shippingBusiSoftCfgList = mesConfigService.getConfigList(orderManagement.getOrganizeCode(),
MesCommonConstant.SHIPPING_BUSI_SOFT_CFG, mesPartShippingGroup.getShippingGroupCode(), null);
DdlPackBean orderDetailPackBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode(), orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue() ? CommonEnumUtil.IS_VAILD.INVAILD.getValue() : CommonEnumUtil.IS_VAILD.VAILD.getValue());
DdlPackBean orderDetailPackBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderDetailPackBean);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.CLOSE.getValue(),"status",orderDetailPackBean);
if (CollectionUtils.isEmpty(shippingBusiSoftCfgList)) {
@ -510,14 +510,12 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
if(CollectionUtils.isEmpty(detailList)){
throw new ImppBusiException(String.format("发运单【%s】明细信息不存在请检查数据", orderManagement.getShippingCode()));
}
if (orderManagement.getStatus() != MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue()) {
//已扫描数据
detailList.forEach(k -> {
if (Stream.of(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue(),MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue()).collect(Collectors.toList()).contains(k.getStatus())){
k.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
}
});
}
//已扫描数据
detailList.forEach(k -> {
if (Stream.of(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue(),MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue()).collect(Collectors.toList()).contains(k.getStatus())){
k.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
}
});
//序号,总成类型顺序
if(!Objects.isNull(mesPartShippingGroup.getScanSeqWay()) && !StringUtil.isEmpty(mesPartShippingGroup.getPartType()) && mesPartShippingGroup.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE_40.getValue()){
@ -654,11 +652,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
public void saveDate(MesShippingOrderManagement orderManagement, MesSortShippingCheckModel model, String organizeCode, String userInfo) {
boolean isUnpack = orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue();
//若发运单状态为创建或发布 则写入开始扫描时间
if (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue()) {
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue()) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
MesLoadingList loadingList = null;
@ -696,7 +692,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
orderManagement.setRackNo(model.getVolvoRackNo());
//发运单明细状态修改为校验完成
DdlPackBean orderManagementDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode, isUnpack? CommonEnumUtil.IS_VAILD.INVAILD.getValue() : CommonEnumUtil.IS_VAILD.VAILD.getValue());
DdlPackBean orderManagementDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> orderManagementDetailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> detailList = model.getDetailList();
@ -776,14 +772,12 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
shippingOrderManagementDetailRepository.saveAll(orderManagementDetailList);
}
if (StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())) {
if (!isUnpack) {
//发送数据给辊道线
sendShippingFinishedCmd(model, organizeCode);
//保存当前发运单明细
List<MesJisShipping> mesJisShippings = getMesJisShippings(orderManagement, orderManagementDetailList, userInfo);
if (!CollectionUtils.isEmpty(mesJisShippings)) {
shippingList.addAll(mesJisShippings);
}
//发送数据给辊道线
sendShippingFinishedCmd(model, organizeCode);
//保存当前发运单明细
List<MesJisShipping> mesJisShippings = getMesJisShippings(orderManagement, orderManagementDetailList, userInfo);
if (!CollectionUtils.isEmpty(mesJisShippings)) {
shippingList.addAll(mesJisShippings);
}
} else if (isFirstInstall){
//查询装车单明细
@ -891,39 +885,6 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
shippingOrderManagementDetailRepository.update(item);
}
@Override
public void saveSecondShipScanOrder(MesSortShippingCheckModel model) {
MesShippingOrderManagement shippingOrder = checkMesShippingOrderManagement(model);
if (!Objects.equals(shippingOrder.getShippingGroupCode(), model.getMesPartShippingGroup().getShippingGroupCode())) {
MesPcnException.throwMesBusiException("发运单【%s】设不属于发运组【%s】请检查", shippingOrder.getShippingCode(), model.getMesPartShippingGroup().getShippingGroupCode());
}
if (!Objects.equals(shippingOrder.getStatus(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue())) {
MesPcnException.throwMesBusiException("发运单【%s】的状态不为已发运请检查", shippingOrder.getShippingCode());
}
DdlPackBean orderManagementDetailPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(shippingOrder.getId(), "pid", orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> detailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderManagementDetailPackBean);
for (MesShippingOrderManagementDetail detail : detailList) {
detail.setBarcode(null);
detail.setIsValid(CommonEnumUtil.IS_VAILD.INVAILD.getValue());
ConvertBean.serviceModelUpdate(detail, model.getUserInfo());
}
model.setDetailList(detailList);
// 更新条码状态为发运回退
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
if (detailList.size() == 1) DdlPreparedPack.getStringEqualPack(detailList.get(0).getBarcode(), MesPcnExtConstWords.CUST_SN, packBean);
else DdlPreparedPack.getInPackList(detailList.stream().map(MesShippingOrderManagementDetail::getBarcode).filter(barCode -> !StringUtil.isEmptyAndNull(barCode)).collect(Collectors.toList()), MesPcnExtConstWords.CUST_SN, packBean);
produceSnRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.SN_STATUS,
MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED_BACK.getValue(), model.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY},
packBean);
shippingOrder.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue());
ConvertBean.serviceModelUpdate(shippingOrder, model.getUserInfo());
}
private void updateShippingOrderDetails(String organizeCode, String userName, long id) {
if(StringUtils.isEmpty(id) || StringUtils.isEmpty(organizeCode)) {
return;
@ -956,6 +917,14 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
private void customerSupplyMove(MesShippingOrderManagement orderManagement, String userInfo, MesSortShippingModel sortShippingModel, List<MesJisShipping> shippingList, MesShippingOrderManagementDetail detail, MesPartShippingGroup mesPartShippingGroup) {
// 宁德配置了移库规则为二次发运后则第一次发运时不写入jis_Shipping表。
if (!CollectionUtils.isEmpty(sortShippingModel.getMesMoveRuleList())) {
MesMoveRule moveRule = sortShippingModel.getMesMoveRuleList().get(0);
if (moveRule != null && Objects.equals(moveRule.getMoveNum(), MesExtEnumUtil.MOVE_RULE_MOVE_NUM.MOVE_RULE_MOVE_NUM_40.getValue())) {
detail.setSaveFlag(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
return;
}
}
if (!StringUtils.isEmpty(detail.getVisualOrderNo()) && !Objects.isNull(sortShippingModel.getMesWorkOrderMap()) && sortShippingModel.getMesWorkOrderMap().containsKey(detail.getVisualOrderNo())) {
MesWorkOrder workOrder = sortShippingModel.getMesWorkOrderMap().get(detail.getVisualOrderNo());
//散件发运

@ -119,12 +119,14 @@ public class WorkOrderAssemblyPrintQueueStrategyService implements IPrintQueueSt
MesWorkOrder mesWorkOrder = (StringUtils.isEmpty(printQueue.getWorkOrderNo()) || CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(printQueue.getWorkOrderNo())) ? null : workOrderMap.get(printQueue.getWorkOrderNo()).get(0);
if (mesWorkOrder == null) {
printQueue.setRemark("生产工单不存在");
/*printQueue.setRemark("生产工单不存在");
printQueue.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.FAILURE.getValue());
printQueue.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(printQueue, model.getModifyUser());
log.info("打印队列查询 --- {} --- 工单[{}]不存在 暂不输出打印 ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()), printQueue.getWorkOrderNo());
continue;
continue;*/
log.info("打印队列查询 --- {} --- 工单[{}]不存在 暂不输出打印 ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()), printQueue.getWorkOrderNo());
break;
}
MesPartProdGroup mesPartProdGroup = (StringUtils.isEmpty(printQueue.getPartProdGroupCode()) || CollectionUtils.isEmpty(partProdGroupMap) || !partProdGroupMap.containsKey(printQueue.getPartProdGroupCode())) ? null : partProdGroupMap.get(printQueue.getPartProdGroupCode());

@ -74,10 +74,16 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
@Override
public MesSortShippingCheckModel doScan(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup) {
//校验条码
MesProduceSn produceSn = checkSn(model, orderManagement);
MesProduceSn produceSn = Objects.equals(model.getSecondShipping(), true) ? checkSecondSn(model) : checkSn(model, orderManagement);
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)) {
boolean notScan;
if (Objects.equals(model.getSecondShipping(), true)) {
notScan = !Objects.equals(detail.getSecondScanFlg(), MesCommonConstant.TRUE_INTEGER) && Objects.equals(detail.getBarcode(), model.getSn());
} else {
notScan = StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER);
}
if (detail.getPartNo().equals(produceSn.getPartNo()) && notScan) {
//校验发运明细
checkShippingDetails(model, orderManagement, shippingGroup, produceSn, detail);
scanFlg = true;
@ -85,12 +91,16 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
detail.setBarcode(model.getSn());
}
updateOrderManagementDetails(produceSn, orderManagement, detail, model.getUserInfo());
updateOrderManagementDetails(produceSn, orderManagement, detail, model);
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
if (Objects.equals(model.getSecondShipping(), true)) {
throw new ImppBusiException(String.format("【%s】此条码不在原发运单中若要通过请强过", model.getSn()));
} else {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
}
model.setMsg(String.format("条码【%s】扫描完成请扫描下一个条码", model.getSn()));
return model;
@ -147,6 +157,33 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
}
/**
*
* @param model
*/
private MesProduceSn checkSecondSn(MesSortShippingCheckModel model) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (produceSn == null) {
throw new ImppBusiException(String.format("【%s】此条码无效,请检查数据!", model.getSn()));
}
//校验产品条码状态 必须是状态为已下线条码
if (produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择状态为【%s】或【%s】或【%s】状态的条码请检查数据", model.getSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()),
MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue()));
}
//校验产品质量状态 必须是状态为合格条码
List<Integer> statusList = Stream.of(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue(), MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue()).collect(Collectors.toList());
if (!statusList.contains(produceSn.getQcStatus())){
throw new ImppBusiException(String.format("【%s】此条码质量状态为【%s】,请选择【%s】状态的条码请检查数据", model.getSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()),
MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getDescription()));
}
return produceSn;
}
private MesProduceSn checkSn(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement) {
//校验条码是否重复扫描 (不区分大小写)
Optional<MesShippingOrderManagementDetail> optional = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getBarcode()) && k.getBarcode().equalsIgnoreCase(model.getSn())).findFirst();
@ -158,16 +195,8 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (!StringUtils.isEmpty(produceSn)) {
if (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.UNPACKING.getValue()) {
//校验产品条码状态 必须是状态为已下线条码
if (produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED_BACK.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择状态为【%s】状态的条码请检查数据", model.getSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()),
MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED_BACK.getDescription()));
}
} else {
//校验状态
checkStatus(model, produceSn);
}
//校验状态
checkStatus(model, produceSn);
} else {
//外部条码解析
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = getMesShippingOrderManagementDetail(model);
@ -226,38 +255,49 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
return mesShippingOrderManagementDetail;
}
private void updateOrderManagementDetails(MesProduceSn produceSn, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, String userInfo) {
private void updateOrderManagementDetails(MesProduceSn produceSn, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, MesSortShippingCheckModel model) {
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
detail.setRemark("扫描完成");
if (Objects.equals(model.getSecondShipping(), true)) {
detail.setSecondScanFlg(MesCommonConstant.TRUE_INTEGER);
}
//根据是否启动记忆判断 若启用记忆,则根据保存数据库
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
//若发运单状态为创建或发布 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
if (Objects.equals(model.getSecondShipping(), true)) {
//若发运单状态为已发运 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue()) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
} else {
//若发运单状态为创建或发布 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
}
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
if (!Objects.equals(model.getSecondShipping(), true)) {
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
}
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
ConvertBean.serviceModelUpdate(orderManagement, model.getUserInfo());
update(orderManagement);
detail.setActualQty(1);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
ConvertBean.serviceModelUpdate(detail, model.getUserInfo());
updateDetail(detail);
//内部条码更新条码状态
if (!Objects.isNull(produceSn.getId())) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(produceSn, userInfo);
ConvertBean.serviceModelUpdate(produceSn, model.getUserInfo());
produceSnExtService.update(produceSn);
}else{
//记录唯一性校验表
mesShippingSnUniqueService.insertMesShippingSnUnique(orderManagement.getOrganizeCode(),detail.getBarcode(),orderManagement.getShippingCode(),userInfo);
mesShippingSnUniqueService.insertMesShippingSnUnique(orderManagement.getOrganizeCode(),detail.getBarcode(),orderManagement.getShippingCode(), model.getUserInfo());
}
}
}

@ -35,4 +35,7 @@ public class MesCommonConstant {
//PDA发运校验-排序字段参数配置
public static final String SHIPPING_BUSI_SOFT_CFG = "SHIPPING_BUSI_SOFT_CFG";
//二次发运校验密码
public static final String SECOND_SHIPPING_CHECK_PASSWORD = "SECOND_SHIPPING_CHECK_PASSWORD";
}

@ -63,6 +63,9 @@ public class MesSortShippingCheckModel {
@ApiParam("待发运列表")
private List<MesSortShippingListModel> sortShippingListModelList;
@ApiParam("是否为二次发运")
private Boolean secondShipping;
public void setDetailList(List<MesShippingOrderManagementDetail> detailList) {
this.detailList = detailList;
this.isScanCount = (int) detailList.stream().filter(k -> Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).count();

@ -0,0 +1,20 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* @Description :
* @Reference :
* @Author :
* @CreateDate : 2024-04-26 15:44
* @Modify:
**/
@Data
public class MesSortShippingPasswordModel {
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("密码")
private String password;
}
Loading…
Cancel
Save