|
|
|
@ -10,7 +10,6 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.tool.MathOperation;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.util.MesConstWords;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
|
|
|
@ -20,6 +19,7 @@ import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.DateUtilExt;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
|
|
|
|
|
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
|
|
|
|
@ -30,10 +30,9 @@ import org.springframework.beans.BeanUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
@ -77,6 +76,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
private IMesPartSapService mesPartSapService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesMoveRepository mesMoveRDao;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesWorkOrder insert(MesWorkOrder bean) {
|
|
|
|
|
//插入前构造数据
|
|
|
|
@ -341,7 +341,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//校验零件生产组信息
|
|
|
|
|
if(StringUtil.isEmpty(item.getPartProdGroupCode())){
|
|
|
|
|
if (StringUtil.isEmpty(item.getPartProdGroupCode())) {
|
|
|
|
|
MesPartProdGroup mesPartProdGroup = getMesPartProdGroup(item);
|
|
|
|
|
item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode());
|
|
|
|
|
item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName());
|
|
|
|
@ -366,7 +366,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) {
|
|
|
|
|
packPlanTime(item);
|
|
|
|
|
}
|
|
|
|
|
if(StringUtil.isEmpty(item.getCustPartNo())){
|
|
|
|
|
if (StringUtil.isEmpty(item.getCustPartNo())) {
|
|
|
|
|
getCustomerPart(item);
|
|
|
|
|
}
|
|
|
|
|
//校验物料生产版本是否存在
|
|
|
|
@ -380,7 +380,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
}
|
|
|
|
|
if(StringUtil.isEmpty(item.getCustPartNo())){
|
|
|
|
|
if (StringUtil.isEmpty(item.getCustPartNo())) {
|
|
|
|
|
getCustomerPart(item);
|
|
|
|
|
}
|
|
|
|
|
//拼接
|
|
|
|
@ -393,7 +393,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
item.setPartName(mesPart.getPartName());
|
|
|
|
|
item.setUnit(mesPart.getUnit());
|
|
|
|
|
//生产时间新增取当天
|
|
|
|
|
if(StringUtil.isEmpty(item.getProduceTime())){
|
|
|
|
|
if (StringUtil.isEmpty(item.getProduceTime())) {
|
|
|
|
|
item.setProduceTime(TimeTool.getToday());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -405,9 +405,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
mesPartProdGroupDetail.setPartNo(item.getPartNo());
|
|
|
|
|
mesPartProdGroupDetail.setOrganizeCode(item.getOrganizeCode());
|
|
|
|
|
List<MesPartProdGroup> mesPartProdGroupList = mesPartProdGroupService.findMesPartProdGroup(mesPartProdGroupDetail);
|
|
|
|
|
if(CollectionUtils.isEmpty(mesPartProdGroupList)){
|
|
|
|
|
if (CollectionUtils.isEmpty(mesPartProdGroupList)) {
|
|
|
|
|
MesException.throwMesBusiException("生产线代码【%s】零件号【%s】对应的零件生产组信息没有维护",
|
|
|
|
|
item.getWorkCenterCode(),item.getPartNo());
|
|
|
|
|
item.getWorkCenterCode(), item.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
MesPartProdGroup mesPartProdGroup = mesPartProdGroupList.iterator().next();
|
|
|
|
|
return mesPartProdGroup;
|
|
|
|
@ -417,7 +417,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "erpPartNo", ddlPackBean);
|
|
|
|
|
MesCustomerPart customerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if(!Objects.isNull(customerPart)){
|
|
|
|
|
if (!Objects.isNull(customerPart)) {
|
|
|
|
|
item.setCustPartNo(customerPart.getCustPartNo());
|
|
|
|
|
item.setCustomerPartName(customerPart.getCustPartName());
|
|
|
|
|
}
|
|
|
|
@ -457,9 +457,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
if (DateUtilExt.compareDateTime(DateUtil.SHORT_FORMAT, item.getPlanDate(), TimeTool.getToday()) < 0) {
|
|
|
|
|
MesException.throwMesBusiException("导入工单计划日期不能小于今天");
|
|
|
|
|
}
|
|
|
|
|
}catch (ImppBusiException busExcep) {
|
|
|
|
|
} catch (ImppBusiException busExcep) {
|
|
|
|
|
MesException.throwMesBusiException(busExcep.getErrorDetail());
|
|
|
|
|
}catch (Exception e) {
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
MesException.throwMesBusiException("计划日期格式异常");
|
|
|
|
|
}
|
|
|
|
|
//查询班次信息
|
|
|
|
@ -504,7 +504,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
List<MesBom> mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//报工类型
|
|
|
|
|
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) {
|
|
|
|
|
mesWorkOrder.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getReportedQty()));
|
|
|
|
@ -538,50 +538,93 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
|
|
|
|
|
//生成条码
|
|
|
|
|
List<String> resultList = getStringList(mesWorkOrder);
|
|
|
|
|
//bom子零件是虚零件 继续拆他下面的零件
|
|
|
|
|
recursionBomList(mesBoms);
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false));
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mesProductOffLineService.insertBatch(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 递归查询bom
|
|
|
|
|
*/
|
|
|
|
|
private List<MesBom> recursionBomList(List<MesBom> bomList) {
|
|
|
|
|
if (!org.springframework.util.CollectionUtils.isEmpty(bomList)) {
|
|
|
|
|
for (MesBom bom : bomList) {
|
|
|
|
|
// if (bom.getItemPartNo().equals(bom.getPartNo())){
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
if (!bom.getPartType().contains("V")){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<MesBom> resultList = mesBomRDao.findByProperty(
|
|
|
|
|
new String[]{MesConstWords.IS_VALID, MesConstWords.IS_DELETED, MesConstWords.ORGANIZE_CODE, "partNo"},
|
|
|
|
|
new Object[]{CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(),
|
|
|
|
|
bom.getOrganizeCode(), bom.getItemPartNo()});
|
|
|
|
|
|
|
|
|
|
recursionBomList(resultList);
|
|
|
|
|
// bom.setChildTreeList(resultList);
|
|
|
|
|
|
|
|
|
|
public List<MesBom> getBomList(String organizeCode, MesPart mesPart, String bomVersion) {
|
|
|
|
|
List<MesBom> bomData = new ArrayList<>();
|
|
|
|
|
// 递归展开 BOM
|
|
|
|
|
expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData);
|
|
|
|
|
|
|
|
|
|
if (bomData.size() == 0) {
|
|
|
|
|
MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Iterator<MesBom> iterator = bomData.iterator();
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
|
MesBom item = iterator.next();
|
|
|
|
|
// 删除虚零件
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
iterator.remove();
|
|
|
|
|
} else {
|
|
|
|
|
item.setPartNo(mesPart.getPartNo());
|
|
|
|
|
item.setPartName(mesPart.getPartName());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return bomList;
|
|
|
|
|
|
|
|
|
|
Map<String, MesBom> summaryBomMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomData) {
|
|
|
|
|
String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(),
|
|
|
|
|
item.getItemPartNo().toUpperCase().trim());
|
|
|
|
|
if (!summaryBomMap.containsKey(key)) {
|
|
|
|
|
summaryBomMap.put(key, item);
|
|
|
|
|
} else {
|
|
|
|
|
MesBom tempItem = summaryBomMap.get(key);
|
|
|
|
|
// 子零件重复的累加数量
|
|
|
|
|
tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 返回汇总数据
|
|
|
|
|
return new ArrayList<>(summaryBomMap.values());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 递归展开 BOM
|
|
|
|
|
*
|
|
|
|
|
* @param organizeCode 工厂代码
|
|
|
|
|
* @param partNo 父零件号
|
|
|
|
|
* @param bomData 存放 BOM 数据的集合
|
|
|
|
|
*/
|
|
|
|
|
private void expendBomChild(String organizeCode, String partNo, String bomVersion, List<MesBom> bomData) {
|
|
|
|
|
List<MesBom> bomDetails = getMesBoms(partNo, organizeCode, bomVersion);
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomDetails) {
|
|
|
|
|
MesBom newItem = new MesBom();
|
|
|
|
|
BeanUtils.copyProperties(item, newItem);
|
|
|
|
|
// 处理父零件用量不为 1 的情况
|
|
|
|
|
if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) {
|
|
|
|
|
Double rateQty = divide(newItem.getItemQty(), newItem.getQty(), 8);
|
|
|
|
|
newItem.setQty(1.0);
|
|
|
|
|
newItem.setItemQty(rateQty);
|
|
|
|
|
}
|
|
|
|
|
// 加入到 BOM 清单中
|
|
|
|
|
bomData.add(newItem);
|
|
|
|
|
// 如果有子阶,继续递归
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doProductReportExt(MesWorkOrder mesWorkOrderNew) {
|
|
|
|
|
MesWorkOrder mesWorkOrder = baseRDao.getById(mesWorkOrderNew.getId());
|
|
|
|
|
if(Objects.isNull(mesWorkOrder)){
|
|
|
|
|
MesException.throwMesBusiException("工单id为【%s】工单信息不存在",mesWorkOrderNew.getId());
|
|
|
|
|
if (Objects.isNull(mesWorkOrder)) {
|
|
|
|
|
MesException.throwMesBusiException("工单id为【%s】工单信息不存在", mesWorkOrderNew.getId());
|
|
|
|
|
}
|
|
|
|
|
//查询物料信息
|
|
|
|
|
MesPart mesPart = iMesPartService.getPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
|
|
|
|
|
if(mesWorkOrderNew.getNum() <= 0){
|
|
|
|
|
if (mesWorkOrderNew.getNum() <= 0) {
|
|
|
|
|
MesException.throwMesBusiException("工单报工数量不能为0,不允许报工");
|
|
|
|
|
}
|
|
|
|
|
//报工类型
|
|
|
|
@ -612,7 +655,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
List<MesBom> mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//生成条码
|
|
|
|
|
List<String> resultList = getStringList(mesWorkOrderNew);
|
|
|
|
|
//保存数据
|
|
|
|
@ -621,67 +664,67 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
boolean isReport = false;
|
|
|
|
|
boolean isMove = false;
|
|
|
|
|
//排序工单
|
|
|
|
|
if(MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()){
|
|
|
|
|
if (MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()) {
|
|
|
|
|
//报工类型
|
|
|
|
|
if (MesExtEnumUtil.REPORT_TYPE.WRITE_OFF.getValue() == mesWorkOrder.getReportType()) {
|
|
|
|
|
MesException.throwMesBusiException("工单【%s】为排序工单不允许冲销",mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
MesException.throwMesBusiException("工单【%s】为排序工单不允许冲销", mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
}
|
|
|
|
|
//排序加工规则
|
|
|
|
|
MesProdRuleSortCfg mesProdRuleSortCfg = getMesProdRuleSortCfg(mesWorkOrder);
|
|
|
|
|
if(MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue() == mesProdRuleSortCfg.getReportType()){
|
|
|
|
|
if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
isReport = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MES_REPORT_TYPE.MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
isMove = true;
|
|
|
|
|
}else if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
} else if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
isReport = true;
|
|
|
|
|
isMove = true;
|
|
|
|
|
}else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
} else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
customerSupplyMove(mesWorkOrder, mesProductVersion, mesBoms, resultList, mesProductOffLineList, mesMoveList);
|
|
|
|
|
}else{
|
|
|
|
|
log.info("工单{}排序加工规则报工类型未维护",mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
} else {
|
|
|
|
|
log.info("工单{}排序加工规则报工类型未维护", mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()){
|
|
|
|
|
if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
//查询SAP物料信息
|
|
|
|
|
MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
//成品汇报
|
|
|
|
|
if(isReport){
|
|
|
|
|
if (isReport) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false));
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//成品移库
|
|
|
|
|
if(isMove){
|
|
|
|
|
MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d,sn,MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue());
|
|
|
|
|
if (isMove) {
|
|
|
|
|
MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d, sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesWorkOrder.getPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) {
|
|
|
|
|
MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(),mesWorkOrder.getPartNo(),mesWorkOrder.getOrganizeCode());
|
|
|
|
|
if( CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()){
|
|
|
|
|
MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
|
|
|
|
|
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()) {
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom,false));
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
log.info("工单{}排序规则不属于排序工单和非排序工单",mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
} else {
|
|
|
|
|
log.info("工单{}排序规则不属于排序工单和非排序工单", mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新工单
|
|
|
|
|
update(mesWorkOrder);
|
|
|
|
|
//保存报工记录
|
|
|
|
|
if(CollectionUtils.isNotEmpty(mesProductOffLineList)){
|
|
|
|
|
if (CollectionUtils.isNotEmpty(mesProductOffLineList)) {
|
|
|
|
|
mesProductOffLineService.insertBatch(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
//保存移库记录
|
|
|
|
|
if(CollectionUtils.isNotEmpty(mesMoveList)){
|
|
|
|
|
if (CollectionUtils.isNotEmpty(mesMoveList)) {
|
|
|
|
|
mesMoveRDao.saveAll(mesMoveList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -689,11 +732,64 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
@Override
|
|
|
|
|
public void deleteUnSortOrder(String userName, String organizeCode) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue(),"workOrderType",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerNotEqualPack(TimeTool.getToday(),"planStartTime",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(),"workOrderStatus",ddlPackBean);
|
|
|
|
|
baseRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderStatus"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true),MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()},ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue(), "workOrderType", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerNotEqualPack(TimeTool.getToday(), "planStartTime", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), "workOrderStatus", ddlPackBean);
|
|
|
|
|
baseRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"},
|
|
|
|
|
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doReportWorkReversal(WmsProductModel model) {
|
|
|
|
|
//查询物料信息
|
|
|
|
|
MesPart mesPart = iMesPartService.getPartByPartNo(model.getPartNo(), model.getOrganizeCode());
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(model);
|
|
|
|
|
//获取bom
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(getMesProductOffLine(model, mesPart, mesProductVersion, mesBom));
|
|
|
|
|
}
|
|
|
|
|
mesProductOffLineService.insertBatch(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProductOffLine getMesProductOffLine(WmsProductModel model, MesPart mesPart, MesProductVersion mesProductVersion, MesBom mesBom) {
|
|
|
|
|
MesProductOffLine newMesProductOffLine = new MesProductOffLine();
|
|
|
|
|
newMesProductOffLine.setReportPartNo(mesPart.getPartNo());
|
|
|
|
|
newMesProductOffLine.setReportPartNameRdd(mesPart.getPartName());
|
|
|
|
|
newMesProductOffLine.setReportSn(model.getSn());
|
|
|
|
|
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
newMesProductOffLine.setItemQty(MathOperation.mul(model.getQty(), mesBom.getItemQty()));
|
|
|
|
|
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setQty(model.getQty());
|
|
|
|
|
newMesProductOffLine.setBomVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
newMesProductOffLine.setSerialNumber(model.getSn());
|
|
|
|
|
newMesProductOffLine.setUnit(mesBom.getUnit());
|
|
|
|
|
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
|
|
|
|
|
newMesProductOffLine.setReportType(MesExtEnumUtil.REPORT_TYPE.CBR.getValue());
|
|
|
|
|
newMesProductOffLine.setOrganizeCode(model.getOrganizeCode());
|
|
|
|
|
newMesProductOffLine.setOrderNo(model.getShipOrderNo());
|
|
|
|
|
newMesProductOffLine.setCustNo(model.getCustNo());
|
|
|
|
|
newMesProductOffLine.setCustOrder(model.getCustOrderNo());
|
|
|
|
|
|
|
|
|
|
ConvertBean.serviceModelInitialize(newMesProductOffLine, model.getUserName());
|
|
|
|
|
return newMesProductOffLine;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProductVersion getMesProductVersion(WmsProductModel model) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(model.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderBy(null, null, ddlPackBean);
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (null == mesProductVersion) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】生产版本信息不存在", model.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List<MesBom> mesBoms, List<String> resultList, List<MesProductOffLine> mesProductOffLineList, List<MesMove> mesMoveList) {
|
|
|
|
@ -713,9 +809,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
isItemReport = false;
|
|
|
|
|
isItemMove = false;
|
|
|
|
|
moveRule = null;
|
|
|
|
|
if(itemPartMap.containsKey(mesBom.getItemPartNo())){
|
|
|
|
|
if (itemPartMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
if(!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())){
|
|
|
|
|
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;
|
|
|
|
@ -728,16 +824,16 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//汇报
|
|
|
|
|
if(isItemReport){
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,true));
|
|
|
|
|
if (isItemReport) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true));
|
|
|
|
|
}
|
|
|
|
|
//移库
|
|
|
|
|
if(isItemMove){
|
|
|
|
|
if (isItemMove) {
|
|
|
|
|
MesPartSap mesPartSap = null;
|
|
|
|
|
if(mesPartSapMap.containsKey(mesBom.getItemPartNo())){
|
|
|
|
|
if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
}
|
|
|
|
|
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(),"",MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue());
|
|
|
|
|
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesBom.getItemPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
}
|
|
|
|
@ -759,10 +855,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
|
|
|
|
|
private MesProdRuleSortCfg getMesProdRuleSortCfg(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(),"reportPartNo",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(),"workCenterCode",ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "reportPartNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean);
|
|
|
|
|
MesProdRuleSortCfg mesProdRuleSortCfg = mesProdRuleSortCfgRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if(Objects.isNull(mesProdRuleSortCfg)){
|
|
|
|
|
if (Objects.isNull(mesProdRuleSortCfg)) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】物料【%s】排序加工规则未维护", mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
return mesProdRuleSortCfg;
|
|
|
|
@ -774,17 +870,15 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return resultList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesBom> getMesBoms(MesWorkOrder mesWorkOrder, MesPart mesPart, MesProductVersion mesProductVersion) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean);
|
|
|
|
|
private List<MesBom> getMesBoms(String partNo, String organizeCode, String bomVersion) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderBy("effStartTime",CommonEnumUtil.ASC_OR_DESC.DESC.getValue(),ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean);
|
|
|
|
|
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesBoms)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在",
|
|
|
|
|
mesWorkOrder.getPartNo(), mesProductVersion.getProductVersion());
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion);
|
|
|
|
|
}
|
|
|
|
|
MesBom next = mesBoms.iterator().next();
|
|
|
|
|
//如果存在多个bomCode取最新的一个
|
|
|
|
@ -805,10 +899,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion,
|
|
|
|
|
String sn, MesBom mesBom,boolean isItemReport) {
|
|
|
|
|
String sn, MesBom mesBom, boolean isItemReport) {
|
|
|
|
|
MesProductOffLine newMesProductOffLine;
|
|
|
|
|
newMesProductOffLine = new MesProductOffLine();
|
|
|
|
|
if(!isItemReport){
|
|
|
|
|
if (!isItemReport) {
|
|
|
|
|
newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo());
|
|
|
|
|
newMesProductOffLine.setReportPartNameRdd(mesWorkOrder.getPartName());
|
|
|
|
|
}
|
|
|
|
@ -843,6 +937,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//查询汇总工单数量
|
|
|
|
|
return mesWorkOrderDao.sumMesWorkOrderQtyToSap(organizeCode, statusList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesWorkOrder> queryMesWorkOrderProcessToSap(String organizeCode) {
|
|
|
|
|
List<Integer> statusList = new ArrayList<>();
|
|
|
|
@ -854,9 +949,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return mesWorkOrderRDao.findByHqlWhere(packBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesMove createMove(MesPartSap mesPart , String source, String target, String org,double qty,String sn,Integer moveType) {
|
|
|
|
|
private MesMove createMove(MesPartSap mesPart, String source, String target, String org, double qty, String sn, Integer moveType) {
|
|
|
|
|
MesMove move = new MesMove();
|
|
|
|
|
if(!Objects.isNull(mesPart)){
|
|
|
|
|
if (!Objects.isNull(mesPart)) {
|
|
|
|
|
move.setMeins(mesPart.getUnit());
|
|
|
|
|
}
|
|
|
|
|
move.setOrganizeCode(org);
|
|
|
|
@ -871,4 +966,21 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
|
|
|
|
|
return move;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
|
|
|
|
|
*
|
|
|
|
|
* @param dividend 被除数
|
|
|
|
|
* @param divisor 除数
|
|
|
|
|
* @param scale 表示表示需要精确到小数点以后几位。
|
|
|
|
|
* @return 两个参数的商
|
|
|
|
|
*/
|
|
|
|
|
public Double divide(Double dividend, Double divisor, Integer scale) {
|
|
|
|
|
if (scale < 0) {
|
|
|
|
|
throw new IllegalArgumentException("The scale must be a positive integer or zero");
|
|
|
|
|
}
|
|
|
|
|
BigDecimal b1 = new BigDecimal(Double.toString(dividend));
|
|
|
|
|
BigDecimal b2 = new BigDecimal(Double.toString(divisor));
|
|
|
|
|
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|