diff --git a/modules/i3plus-ext-mes-api/pom.xml b/modules/i3plus-ext-mes-api/pom.xml
index 9cecd56..f4d87d9 100644
--- a/modules/i3plus-ext-mes-api/pom.xml
+++ b/modules/i3plus-ext-mes-api/pom.xml
@@ -24,6 +24,10 @@
i3plus.ext.mes
i3plus-ext-mes-pojo
+
+ i3plus.pojo
+ i3plus-pojo-model
+
diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java
index 3243b9f..f317351 100644
--- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java
+++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java
@@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
+import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
import java.util.List;
@@ -20,4 +21,6 @@ public interface IMesWorkOrderService extends IBaseMesService {
List sumMesWorkOrderQtyToSap(String organizeCode);
List queryMesWorkOrderProcessToSap(String organizeCode);
+
+ void doReportWorkReversal(WmsProductModel model);
}
diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java
index 0db6a80..dbe5f46 100644
--- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java
+++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java
@@ -9,6 +9,7 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
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;
@@ -124,6 +125,24 @@ public class MesWorkOrderController extends BaseMesController {
}
}
+ @PostMapping(value = "/report-work-reversal")
+ @ApiOperation(value = "反向冲销")
+ public ResultBean doReportWorkReversal(@RequestBody WmsProductModel model) {
+ try {
+ ValidatorBean.checkNotNull(model.getOrganizeCode(),"工厂代码不能为空");
+ ValidatorBean.checkNotNull(model.getQty(),"数量不能为空");
+ ValidatorBean.checkNotNull(model.getSn(),"条码不能为空");
+ ValidatorBean.checkNotNull(model.getPartNo(),"零件号不能为空");
+ ValidatorBean.checkNotNull(model.getPartNo(),"零件号不能为空");
+
+ mesWorkOrderService.doReportWorkReversal(model);
+ return ResultBean.success("反向冲销成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
+ } catch (ImppBusiException busExcep) {
+ return ResultBean.fail(busExcep);
+ } catch (Exception e) {
+ return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
+ }
+ }
}
diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java
index f056a09..6381bdf 100644
--- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java
+++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java
@@ -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 implements
private IMesPartSapService mesPartSapService;
@Autowired
private MesMoveRepository mesMoveRDao;
+
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
//插入前构造数据
@@ -341,7 +341,7 @@ public class MesWorkOrderService extends BaseMesService 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 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 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 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 implements
mesPartProdGroupDetail.setPartNo(item.getPartNo());
mesPartProdGroupDetail.setOrganizeCode(item.getOrganizeCode());
List 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 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 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 implements
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
//物料+生产版本获取bom信息
- List mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
+ List 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 implements
//生成条码
List resultList = getStringList(mesWorkOrder);
- //bom子零件是虚零件 继续拆他下面的零件
- recursionBomList(mesBoms);
//保存数据
List 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 recursionBomList(List 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 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 getBomList(String organizeCode, MesPart mesPart, String bomVersion) {
+ List bomData = new ArrayList<>();
+ // 递归展开 BOM
+ expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData);
+
+ if (bomData.size() == 0) {
+ MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo());
+ }
+
+ Iterator 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 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 bomData) {
+ List 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 implements
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
//物料+生产版本获取bom信息
- List mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion);
+ List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
//生成条码
List resultList = getStringList(mesWorkOrderNew);
//保存数据
@@ -621,67 +664,67 @@ public class MesWorkOrderService extends BaseMesService 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 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 mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
+ //保存数据
+ List 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 mesBoms, List resultList, List mesProductOffLineList, List mesMoveList) {
@@ -713,9 +809,9 @@ public class MesWorkOrderService extends BaseMesService 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 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 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 implements
return resultList;
}
- private List 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 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 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 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 implements
//查询汇总工单数量
return mesWorkOrderDao.sumMesWorkOrderQtyToSap(organizeCode, statusList);
}
+
@Override
public List queryMesWorkOrderProcessToSap(String organizeCode) {
List statusList = new ArrayList<>();
@@ -854,9 +949,9 @@ public class MesWorkOrderService extends BaseMesService 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 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();
+ }
}
diff --git a/modules/i3plus-ext-mes-icloud/pom.xml b/modules/i3plus-ext-mes-icloud/pom.xml
index 1485500..484f850 100644
--- a/modules/i3plus-ext-mes-icloud/pom.xml
+++ b/modules/i3plus-ext-mes-icloud/pom.xml
@@ -34,6 +34,10 @@
i3plus.ext.mes
i3plus-ext-mes-pojo
+
+ i3plus.pojo
+ i3plus-pojo-model
+
diff --git a/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java
new file mode 100644
index 0000000..1052b67
--- /dev/null
+++ b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java
@@ -0,0 +1,34 @@
+package cn.estsh.i3plus.ext.mes.icloud.sdk;
+
+import cn.estsh.i3plus.ext.mes.icloud.sdkfallback.MesForWmsFactory;
+import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
+import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
+import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @Description :
+ * @Reference :
+ * @Author : junsheng.li
+ * @CreateDate 2024/6/13 19:23
+ * @Modify:
+ **/
+@FeignClient(name = "i3mes", //对应配置文件中的spring.application.name
+ path = MesCommonConstant.MES_YANFEN + "/mesWorkOrder",
+ fallbackFactory = MesForWmsFactory.class)
+public interface IMesForWmsCloud {
+
+
+ /**
+ * MES移库cloud
+ *
+ * @return 结果封装
+ */
+ @PostMapping(value = "/report-work-reversal")
+ @ApiOperation(value = "反向冲销")
+ BaseResultBean doReportWorkReversal(@RequestBody WmsProductModel model);
+
+}
diff --git a/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java
new file mode 100644
index 0000000..b49d70d
--- /dev/null
+++ b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java
@@ -0,0 +1,35 @@
+package cn.estsh.i3plus.ext.mes.icloud.sdkfallback;
+
+import cn.estsh.i3plus.ext.mes.icloud.sdk.IMesForWmsCloud;
+import cn.estsh.i3plus.platform.common.util.CommonConstWords;
+import cn.estsh.i3plus.pojo.base.bean.BaseFallBackBean;
+import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
+import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description :
+ * @Reference :
+ * @Author : junsheng.li
+ * @CreateDate 2024/6/13 19:13
+ * @Modify:
+ **/
+@Component
+public class MesForWmsFactory extends BaseFallBackBean implements FallbackFactory {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CommonConstWords.SYSTEM_LOG);
+
+
+ @Override
+ public IMesForWmsCloud create(Throwable cause) {
+ return new IMesForWmsCloud() {
+ @Override
+ public BaseResultBean doReportWorkReversal(WmsProductModel model) {
+ return makeBaseFallBack("微服调用出错", cause);
+ }
+ };
+ }
+}