非排序拆解功能

tags/yfai-pcn-ext-v1.9
jun 8 months ago
parent 463a365660
commit 43ba2569c1

@ -7,10 +7,8 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskRequestModel;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel;
import io.swagger.annotations.ApiOperation;
import java.util.List;
@ -34,6 +32,9 @@ public interface IMesReworkTaskService {
List<MesProductionAssembly> assemblyQuery(MesReworkTaskRequestModel requestModel);
@ApiOperation(value = "装配件树查询")
List<MesProductionAssemblyModel> queryAssemblyTree(MesReworkTaskRequestModel requestModel);
boolean validateSn(MesReworkTaskRequestModel requestModel);
void doAssemblySnRepeat(MesReworkTaskRequestModel requestModel);

@ -2,10 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.*;
import io.swagger.annotations.ApiOperation;
import java.util.List;
@ -24,6 +21,9 @@ public interface IMesWorkOrderService {
public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder);
@ApiOperation(value = "查询工单")
MesWorkOrder findMesWorkOrderList(String organizeCode,String workOrderNo);
@ApiOperation(value = "查询工单")
public List<MesWorkOrder> queryMesWorkOrderList(MesWorkOrder workOrder);
@ApiOperation(value = "查询工单")
@ -61,4 +61,7 @@ public interface IMesWorkOrderService {
@ApiOperation(value = "生产报工")
void doProductReport(MesWorkOrder mesWorkOrder,String userName);
@ApiOperation(value = "报工调整")
void doProductReportReversal(MesWorkOrder mesWorkOrder,MesProductVersion mesProductVersion,String userName);
}

@ -96,6 +96,19 @@ public class MesReworkTaskController {
}
}
@PostMapping("/queryAssemblyTree")
@ApiOperation(value = "装配件树查询")
public ResultBean queryAssemblyTree(@RequestBody MesReworkTaskRequestModel requestModel) {
try {
ValidatorBean.checkNotNull(requestModel.getCustSn(), "客户条码不能为空");
return ResultBean.success("查询成功").setResultList(mesReworkTaskService.queryAssemblyTree(requestModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/assemblySnRepeat")
@ApiOperation(value = "装配件替换")
public ResultBean assemblySnRepeat(MesReworkTaskRequestModel requestModel) {
@ -135,9 +148,9 @@ public class MesReworkTaskController {
}
}
@GetMapping("/reworkSuccess")
@PostMapping("/reworkSuccess")
@ApiOperation(value = "返工成功")
public ResultBean reworkSuccess(MesReworkTaskRequestModel requestModel) {
public ResultBean reworkSuccess(@RequestBody MesReworkTaskRequestModel requestModel) {
// 数据校验
//ValidatorBean.checkNotNull(requestModel.getSn(), "条码不能为空");
try {

@ -4,9 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesReworkTaskService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesAssemblyExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
@ -31,11 +29,13 @@ import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTaskDetail;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger;
@ -118,6 +118,18 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
@Autowired
private MesProductionAssemblyUniqueRepository mesProductionAssemblyUniqueRepository;
@Autowired
private IMesConfigService mesConfigService;
@Autowired
private IMesProductionRecordService mesProductionRecordService;
@Autowired
private IMesWorkOrderService mesWorkOrderService;
@Autowired
private IMesProductVersionService mesProductVersionService;
@Override
public ListPager<MesReworkTask> queryReworkTask(MesReworkTask mesReworkTask, Pager pager) {
String organizeCode = !StringUtils.isEmpty(mesReworkTask.getOrganizeCode())?mesReworkTask.getOrganizeCode():AuthUtil.getOrganizeCode();
@ -221,22 +233,21 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
return mesProductionAssemblies;
}
public void recursionAssemblySn(List<MesProductionAssembly> mesProductionAssemblyList,MesReworkTaskRequestModel requestModel){
@Override
public List<MesProductionAssemblyModel> queryAssemblyTree(MesReworkTaskRequestModel requestModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode());
DdlPreparedPack.getInPackList(mesProductionAssemblyList.stream().map(MesProductionAssembly::getAssemblySn).distinct().collect(Collectors.toList()), "productSn", packBean);
DdlPreparedPack.getNumEqualPack(requestModel.getIsOrigSn(), "isOrigSn", packBean);
if (!StringUtils.isEmpty(requestModel.getAssemblyPartNo())) {
DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean);
}
if (!Objects.isNull(requestModel.getAssemblyPartStatus())) {
DdlPreparedPack.getNumEqualPack(requestModel.getAssemblyPartStatus(), "assemblyStatus", packBean);
}
DdlPreparedPack.getStringEqualPack(requestModel.getCustSn(), "custSn", packBean);
DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(), "assemblyStatus", packBean);
List<MesProductionAssembly> mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean);
if(!CollectionUtils.isEmpty(mesProductionAssemblies)){
recursionAssemblySn(mesProductionAssemblies,requestModel);
mesProductionAssemblyList.addAll(mesProductionAssemblies);
if (CollectionUtils.isEmpty(mesProductionAssemblies)) {
MesPcnException.throwFlowException("装配件信息不存在");
}
//查询装配树
List<MesProductionAssemblyModel> assemblyTree = parseArray(mesProductionAssemblies);
recursionAssemblySnTree(assemblyTree, requestModel);
return assemblyTree;
}
@Override
@ -254,6 +265,11 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
mesReworkTask.setReworkedQty(requestModel.getReworkedQty());
mesReworkTask.setScrapQty(requestModel.getScrapQty());
} else {
//拆解
if(!CollectionUtils.isEmpty(requestModel.getAssemblyModelList())){
doAssemblyDisassembly(requestModel, mesReworkTask.getSn());
}
if (MesExtEnumUtil.NC_TYPE.REWORK.getValue() == requestModel.getType()) {
mesReworkTask.setReworkedQty(mesReworkTask.getQty());
} else if (MesExtEnumUtil.NC_TYPE.SCRAP.getValue() == requestModel.getType()) {
@ -279,7 +295,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
if (!CollectionUtils.isEmpty(reworkTaskDetails)) {
MesPcnException.throwFlowException("还有位置未返工完成,请检查");
}
MesProduceSn sn = checkProduceSn(requestModel.getSn(), organizeCode);
MesProduceSn sn = getMesProduceSn(organizeCode,requestModel.getSn());
//查询物料信息
MesPart mesPart = mesPartService.getMesPartByPartNo(sn.getPartNo(), organizeCode);
String prodLabelTemplate = sn.getProdLabelTemplate();
@ -383,67 +399,6 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
}
}
private void updateProductSn(MesReworkTaskRequestModel requestModel, MesProductionAssembly assembly, MesProductionAssemblyContext context) {
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(requestModel.getOrganizeCode(), requestModel.getSn());
if (CollectionUtils.isEmpty(produceSnList)) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn());
Optional<MesProduceSn> optional = produceSnList.stream().filter(sn->sn.getId().equals(context.getProductSnId())).findFirst();
if (!optional.isPresent()) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn());
// 更新新替换得条码为已装配
updateNewSn(optional.get(), requestModel.getUserName());
//更新原条码状态为已拆解
updateOldSn(assembly);
}
private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN, MesProductionAssembly productionAssembly) {
//绑定数据解绑
saveProductionAssemblyUnique(requestModel, assemblySN);
//唯一性校验数据保存
saveProductionAssemblyUnique(productionAssembly);
}
private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN) {
List<MesProductionAssemblyUnique> assemblyUniqueList = mesAssemblyExtService.getProductionAssemblyUniqueList(requestModel.getOrganizeCode(), assemblySN);
if(!CollectionUtils.isEmpty(assemblyUniqueList)){
assemblyUniqueList.forEach(t->{
t.setSystemSyncStatus(CommonEnumUtil.FALSE);
t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue());
ConvertBean.serviceModelUpdate(t, requestModel.getUserName());
});
mesProductionAssemblyUniqueRepository.saveAll(assemblyUniqueList);
}
}
private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) {
MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique();
BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID);
productionAssemblyUnique.setPid(productionAssembly.getId());
mesProductionAssemblyUniqueRepository.insert(productionAssemblyUnique);
}
private Object getContext(MesReworkTaskRequestModel requestModel, MesProductionAssembly mesProductionAssembly,Map<String,MesWorkCenter> mesWorkCenterMap) {
if(StringUtils.isEmpty(mesProductionAssembly.getWorkCenterCode())) MesPcnException.throwFlowException("产线代码不存在");
Object context = null;
MesWorkCenter workCenterDb = null;
//产线类型
if(!mesWorkCenterMap.containsKey(mesProductionAssembly.getWorkCenterCode())){
workCenterDb = prodOrgExtService.getWorkCenterDb(requestModel.getOrganizeCode(), mesProductionAssembly.getWorkCenterCode());
if(Objects.isNull(workCenterDb)) MesPcnException.throwFlowException("产线【%s】信息不存在", mesProductionAssembly.getWorkCenterCode());
mesWorkCenterMap.put(mesProductionAssembly.getWorkCenterCode(),workCenterDb);
}else{
workCenterDb = mesWorkCenterMap.get(mesProductionAssembly.getWorkCenterCode());
}
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenterDb.getCenterType()) context = new MesProductionAssemblySortContext().copy(mesProductionAssembly);
else context = new MesProductionAssemblyNosortContext().copy(mesProductionAssembly);
return context;
}
private String doGererateSerialNo(MesPart part,String organizeCode,String userName) {
if(StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo());
return syncFuncService.syncSerialNo(
new GenSerialNoModel(part.getProductMatchRule()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(organizeCode),
userName, organizeCode, 1).getResultList().get(0).toString();
}
@Override
public boolean validateSn(MesReworkTaskRequestModel requestModel) {
//
@ -564,7 +519,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
updateNewSn(mesProduceSn,requestModel.getUserName());
// 更新原条码状态为已拆解
ConvertBean.serviceModelUpdate(mesProductionAssembly,requestModel.getUserName());
updateOldSn(mesProductionAssembly);
updateOldSn(mesProductionAssembly.getOrganizeCode(),mesProductionAssembly.getAssemblySn(),requestModel.getUserName(), null);
// 原装配件记录为已解绑
mesProductionAssemblyRepository.update(mesProductionAssembly);
// 新装配件记录为已装配
@ -588,35 +543,233 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
}
public void recursionAssemblySnTree(List<MesProductionAssemblyModel> assemblyTree, MesReworkTaskRequestModel requestModel) {
for (MesProductionAssemblyModel assembly : assemblyTree) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(assembly.getAssemblySn(), "productSn", packBean);
DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(), "assemblyStatus", packBean);
List<MesProductionAssembly> mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(mesProductionAssemblies)) {
assembly.setChildTreeList(parseArray(mesProductionAssemblies));
recursionAssemblySnTree(assembly.getChildTreeList(), requestModel);
}
}
}
private List<MesProductionAssemblyModel> parseArray(List<MesProductionAssembly> mesProductionAssemblies) {
return JSONArray.parseArray(JSONArray.toJSONString(mesProductionAssemblies), MesProductionAssemblyModel.class);
}
public void recursionAssemblySn(List<MesProductionAssembly> mesProductionAssemblyList,MesReworkTaskRequestModel requestModel){
DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode());
DdlPreparedPack.getInPackList(mesProductionAssemblyList.stream().map(MesProductionAssembly::getAssemblySn).distinct().collect(Collectors.toList()), "productSn", packBean);
DdlPreparedPack.getNumEqualPack(requestModel.getIsOrigSn(), "isOrigSn", packBean);
if (!StringUtils.isEmpty(requestModel.getAssemblyPartNo())) {
DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean);
}
if (!Objects.isNull(requestModel.getAssemblyPartStatus())) {
DdlPreparedPack.getNumEqualPack(requestModel.getAssemblyPartStatus(), "assemblyStatus", packBean);
}
List<MesProductionAssembly> mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean);
if(!CollectionUtils.isEmpty(mesProductionAssemblies)){
recursionAssemblySn(mesProductionAssemblies,requestModel);
mesProductionAssemblyList.addAll(mesProductionAssemblies);
}
}
private void updateNewSn(MesProduceSn mesProduceSn,String userName) {
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue());
ConvertBean.serviceModelUpdate(mesProduceSn, userName);
mesProduceSnRepository.update(mesProduceSn);
}
private void updateOldSn(MesProductionAssembly mesProductionAssembly) {
DdlPackBean oldSnPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(mesProductionAssembly.getAssemblySn(), "productSn", oldSnPackBean);
private void updateOldSn(String organizeCode, String productSn, String userName, Integer qcStatus) {
MesProduceSn oldProduceSn = getMesProduceSn(organizeCode,productSn);
if(!Objects.isNull(qcStatus)){
oldProduceSn.setQcStatus(qcStatus);
}
oldProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue());
ConvertBean.serviceModelUpdate(oldProduceSn,userName);
mesProduceSnRepository.update(oldProduceSn);
}
private void doAssemblyDisassembly(MesReworkTaskRequestModel requestModel, String productSn) {
//总成拆解
doProductReportReversal(requestModel,productSn);
//装配件数据处理
recursionCheck(requestModel.getAssemblyModelList(), requestModel.getOrganizeCode(), requestModel.getUserName(),mesConfigService.getCfgValue(requestModel.getOrganizeCode(), MesPcnExtConstWords.DISASSEMBLY_DEST_LOCATE));
}
private void doProductReportReversal(MesReworkTaskRequestModel requestModel, String productSn) {
//更新条码状态为总成拆解
MesProduceSn produceSnDb = getMesProduceSn(requestModel.getOrganizeCode(), productSn);
produceSnDb.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_DISASSEMBLY.getValue());
ConvertBean.serviceModelUpdate(produceSnDb, requestModel.getUserName());
mesProduceSnRepository.update(produceSnDb);
//拆解返工单完成后总成反向移库NC责任人对应库位MesMove最后一条记录的库位-->默认库位生产版本中的receive_inventory_point若总成已汇报自动做一个报工调整
List<MesProductionRecord> productionRecordList = mesProductionRecordService.findProductionRecordList(produceSnDb.getOrganizeCode(), produceSnDb.getProductSn(), produceSnDb.getPartNo());
if(CollectionUtils.isEmpty(productionRecordList)){
return;
}
Optional<MesProductionRecord> optional = productionRecordList.stream().filter(o -> (null != o && MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() == o.getReportStatus())).findFirst();
if (!optional.isPresent() || StringUtils.isEmpty(optional.get().getWorkOrderNo())) {
return;
}
//报工调整
MesWorkOrder mesWorkOrderDb = mesWorkOrderService.findMesWorkOrderList(requestModel.getOrganizeCode(), optional.get().getWorkOrderNo());
MesProductVersion productVersion = getProductVersion(mesWorkOrderDb);
mesWorkOrderDb.setNum(MesPcnExtConstWords.ONE);
mesWorkOrderService.doProductReportReversal(mesWorkOrderDb,productVersion, requestModel.getUserName());
//移库
requestModel.setSn(produceSnDb.getProductSn());
createMove(requestModel,getDestLocateNo(requestModel.getOrganizeCode(), produceSnDb.getProductSn()),productVersion.getReceiveInventoryPoint(),mesWorkOrderDb.getErpWorkCenter(),mesWorkOrderDb.getPartNo());
}
private MesProductVersion getProductVersion(MesWorkOrder mesWorkOrderDb) {
MesProductVersion mesProductVersion = mesProductVersionService.getMesProductVersion(mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getProductVersion());
if (null == mesProductVersion) {
MesPcnException.throwMesBusiException("物料【%s】生产版本【%s】信息不存在", mesWorkOrderDb.getPartNo(), mesWorkOrderDb.getProductVersion());
}
return mesProductVersion;
}
public void recursionCheck(List<MesProductionAssemblyModel> assemblyModelList,String organizeCode,String userName,String destLocate){
for (MesProductionAssemblyModel assemblyModel : assemblyModelList) {
//勾选
if (assemblyModel.getFlag() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
//报废
if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_10.getValue() == assemblyModel.getMatchType()){
updateOldSn(organizeCode,assemblyModel.getAssemblySn(), userName, MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue());
}
//对于已勾选报废的子件,对于有零件号的项,产生移库(产线的材料库位->报废库(系统参数配置))。移库数量为报废时的明细数量;
createMove(getMesWorkCenter(organizeCode, assemblyModel.getWorkCenterCode()),destLocate, assemblyModel,userName);
//循环处理数据
if(!CollectionUtils.isEmpty(assemblyModel.getChildTreeList())){
recursionCheck(assemblyModel.getChildTreeList(),organizeCode,userName,destLocate);
}
} else if (assemblyModel.getFlag() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) {
//装配解绑
saveProductionAssembly(organizeCode, userName, assemblyModel.getAssemblySn());
//自制件更新条码状态 条码状态可用
if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_10.getValue() == assemblyModel.getMatchType()){
updateOldSn(organizeCode,assemblyModel.getAssemblySn(), userName, null);
//唯一性表中删除
}else if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_30.getValue() == assemblyModel.getMatchType()){
saveProductionAssemblyUnique(organizeCode, userName, assemblyModel.getAssemblySn());
}
}
}
}
private void updateProductSn(MesReworkTaskRequestModel requestModel, MesProductionAssembly assembly, MesProductionAssemblyContext context) {
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(requestModel.getOrganizeCode(), requestModel.getSn());
if (CollectionUtils.isEmpty(produceSnList)) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn());
Optional<MesProduceSn> optional = produceSnList.stream().filter(sn->sn.getId().equals(context.getProductSnId())).findFirst();
if (!optional.isPresent()) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn());
// 更新新替换得条码为已装配
updateNewSn(optional.get(), requestModel.getUserName());
//更新原条码状态为已拆解
updateOldSn(assembly.getOrganizeCode(),assembly.getAssemblySn(),requestModel.getUserName(), null);
}
private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN, MesProductionAssembly productionAssembly) {
//绑定数据解绑
saveProductionAssemblyUnique(requestModel.getOrganizeCode(),requestModel.getUserName(), assemblySN);
//唯一性校验数据保存
saveProductionAssemblyUnique(productionAssembly);
}
private void saveProductionAssemblyUnique(String organizeCode,String userName, String assemblySN) {
List<MesProductionAssemblyUnique> assemblyUniqueList = mesAssemblyExtService.getProductionAssemblyUniqueList(organizeCode, assemblySN);
if(!CollectionUtils.isEmpty(assemblyUniqueList)){
assemblyUniqueList.forEach(t->{
t.setSystemSyncStatus(CommonEnumUtil.FALSE);
t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue());
ConvertBean.serviceModelUpdate(t, userName);
});
mesProductionAssemblyUniqueRepository.saveAll(assemblyUniqueList);
}
}
private void saveProductionAssembly(String organizeCode,String userName, String assemblySN) {
List<MesProductionAssembly> assemblyList = mesAssemblyExtService.getProductionAssemblyList(organizeCode, assemblySN);
if(CollectionUtils.isEmpty(assemblyList)){
return;
}
assemblyList = assemblyList.stream().filter(o->MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue() == o.getAssemblyStatus()).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(assemblyList)){
assemblyList.forEach(t->{
t.setSystemSyncStatus(CommonEnumUtil.FALSE);
t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue());
ConvertBean.serviceModelUpdate(t, userName);
});
mesProductionAssemblyRepository.saveAll(assemblyList);
}
}
private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) {
MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique();
BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID);
productionAssemblyUnique.setPid(productionAssembly.getId());
mesProductionAssemblyUniqueRepository.insert(productionAssemblyUnique);
}
private Object getContext(MesReworkTaskRequestModel requestModel, MesProductionAssembly mesProductionAssembly,Map<String,MesWorkCenter> mesWorkCenterMap) {
if(StringUtils.isEmpty(mesProductionAssembly.getWorkCenterCode())) MesPcnException.throwFlowException("产线代码不存在");
Object context = null;
MesWorkCenter workCenterDb = null;
//产线类型
if(!mesWorkCenterMap.containsKey(mesProductionAssembly.getWorkCenterCode())){
workCenterDb = getMesWorkCenter(requestModel.getOrganizeCode(), mesProductionAssembly.getWorkCenterCode());
mesWorkCenterMap.put(mesProductionAssembly.getWorkCenterCode(),workCenterDb);
}else{
workCenterDb = mesWorkCenterMap.get(mesProductionAssembly.getWorkCenterCode());
}
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenterDb.getCenterType()) context = new MesProductionAssemblySortContext().copy(mesProductionAssembly);
else context = new MesProductionAssemblyNosortContext().copy(mesProductionAssembly);
return context;
}
private MesProduceSn getMesProduceSn(String organizeCode, String productSn) {
DdlPackBean oldSnPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productSn, "productSn", oldSnPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, oldSnPackBean);
MesProduceSn oldProduceSn = mesProduceSnRepository.getByProperty(oldSnPackBean);
if (oldProduceSn == null) {
MesPcnException.throwFlowException(String.format("原条码信息不存在【%s】", mesProductionAssembly.getProductSn()));
MesProduceSn produceSnDb = mesProduceSnRepository.getByProperty(oldSnPackBean);
if (produceSnDb == null) {
MesPcnException.throwFlowException(String.format("条码【%s】信息不存在", productSn));
}
return produceSnDb;
}
ConvertBean.serviceModelUpdate(oldProduceSn, mesProductionAssembly.getModifyUser());
oldProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue());
mesProduceSnRepository.update(oldProduceSn);
private MesWorkCenter getMesWorkCenter(String organizeCode, String workCenterCode) {
MesWorkCenter workCenterDb = prodOrgExtService.getWorkCenterDb(organizeCode,workCenterCode);
if(Objects.isNull(workCenterDb)) MesPcnException.throwFlowException("产线【%s】信息不存在", workCenterCode);
return workCenterDb;
}
private String doGererateSerialNo(MesPart part,String organizeCode,String userName) {
if(StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo());
return syncFuncService.syncSerialNo(
new GenSerialNoModel(part.getProductMatchRule()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(organizeCode),
userName, organizeCode, 1).getResultList().get(0).toString();
}
private String getDestLocateNo(String organizeCode, String productSn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productSn, "productSn", packBean);
DdlPreparedPack.getOrderBy(null, null, packBean);
MesMove mesMove = moveRepository.getByProperty(packBean);
return Objects.isNull(mesMove) ? null : mesMove.getUmlgo();
}
private MesPartInspection getMesPartInspection(MesReworkTask mesReworkTask) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesReworkTask.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesReworkTask.getSn(), "sn", packBean);
MesPartInspection mesPartInspection = mesPartInspectionRepository.getByProperty(packBean);
return mesPartInspection;
return mesPartInspectionRepository.getByProperty(packBean);
}
private List<MesPartInspectionDetail> getMesPartInspectionDetail(List<MesReworkTaskDetail> reworkTaskDetails) {
@ -668,27 +821,12 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
}
private void updateMesProduceSn(MesReworkTaskRequestModel requestModel) {
MesProduceSn produceSn = checkProduceSn(requestModel.getSn(), requestModel.getOrganizeCode());
MesProduceSn produceSn = getMesProduceSn(requestModel.getOrganizeCode(),requestModel.getSn());
produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue());
ConvertBean.serviceModelUpdate(produceSn,requestModel.getUserName());
mesProduceSnRepository.update(produceSn);
}
private MesProduceSn checkProduceSn(String serialNumber, String org) {
//根据扫描的条码查询条码是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getStringEqualPack(serialNumber, "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = mesProduceSnRepository.getByProperty(packBean);
//若不存在则提示条码不存在
if (StringUtils.isEmpty(produceSn)) {
throw new ImppBusiException(String.format("【%s】此条码不存在请检查数据", serialNumber));
}
return produceSn;
}
private MesMove createMove(String oldSn, String sn, String organizeCode, String userName) {
MesMove move = new MesMove();
move.setOrganizeCode(organizeCode);
@ -701,4 +839,40 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
ConvertBean.serviceModelInitialize(move, userName);
return moveRepository.insert(move);
}
private void createMove(MesWorkCenter mesWorkCenter, String destLocate, MesProductionAssemblyModel assemblyModel,String userName) {
MesMove move = new MesMove();
move.setMatnr(assemblyModel.getAssemblyPartNo());
move.setOrganizeCode(mesWorkCenter.getOrganizeCode());
move.setFactoryCode(mesWorkCenter.getOrganizeCode());
move.setLgort(mesWorkCenter.getRawLocate());
move.setUmlgo(destLocate);
move.setMenge(assemblyModel.getScrapQty());
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE.getValue());
move.setProductSn(assemblyModel.getAssemblySn());
move.setWorkCenter(mesWorkCenter.getErpWorkCenter());
ConvertBean.serviceModelInitialize(move, userName);
moveRepository.insert(move);
}
private void createMove(MesReworkTaskRequestModel requestModel,String srcLocate, String destLocate,String workCenterCode,String partNo) {
MesPartSap mesPartSap = mesPartService.getMesPartSapByPartNo(partNo, requestModel.getOrganizeCode());
MesMove move = new MesMove();
move.setMatnr(mesPartSap.getPartNo());
move.setOrganizeCode(requestModel.getOrganizeCode());
move.setFactoryCode(requestModel.getOrganizeCode());
move.setLgort(srcLocate);
move.setUmlgo(destLocate);
move.setMenge(1d);
move.setMeins(mesPartSap.getUnit());
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE.getValue());
move.setProductSn(requestModel.getSn());
move.setWorkCenter(workCenterCode);
ConvertBean.serviceModelInitialize(move, requestModel.getUserName());
moveRepository.insert(move);
}
}

@ -131,6 +131,17 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
@Override
public MesWorkOrder findMesWorkOrderList(String organizeCode,String workOrderNo) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", packBean);
MesWorkOrder mesWorkOrder = workOrderRepository.getByProperty(packBean);
if(Objects.isNull(mesWorkOrder)){
MesPcnException.throwMesBusiException("工单【%s】信息不存在",workOrderNo);
}
return mesWorkOrder;
}
@Override
public List<MesWorkOrder> queryMesWorkOrderList(MesWorkOrder workOrder) {
DdlPackBean packBean = getDdlPackBean(workOrder);
@ -351,14 +362,14 @@ public class MesWorkOrderService implements IMesWorkOrderService {
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName,double qty) {
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName,MesExtEnumUtil.WORK_ORDER_LOG_TYPE type,double qty) {
//修改工单,需要重新同步
mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelUpdate(mesWorkOrder, userName);
mesWorkOrder.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date()));
workOrderExtService.update(mesWorkOrder);
//保存记录
saveMesWorkOrderLog(mesWorkOrder,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT.getValue(),qty);
saveMesWorkOrderLog(mesWorkOrder,type.getValue(),qty);
}
public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder,int type,double qty) {
@ -1011,9 +1022,9 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
mesWorkOrderDb.setCompleteQty(mesWorkOrderDb.getReportedQty());
mesWorkOrderDb.setRemark(mesWorkOrder.getRemark());
String sn = getOrderNo(mesWorkOrder.getOrganizeCode(),userName);
String sn = getReportSn(mesWorkOrder.getOrganizeCode(),userName);
//更新工单
updateMesWorkOrder(mesWorkOrderDb, userName,mesWorkOrder.getNum());
updateMesWorkOrder(mesWorkOrderDb, userName,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT,mesWorkOrder.getNum());
//记录条码表&加工记录表
//insertMesProductionRecord(insertMesProduceSn(mesPart, sn, userName, mesWorkOrder),mesWorkOrderDb);
insertMesProduceSn(mesPart, sn, userName, mesWorkOrder);
@ -1029,6 +1040,33 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
}
@Override
public void doProductReportReversal(MesWorkOrder mesWorkOrder,MesProductVersion mesProductVersion, String userName) {
//查询物料信息
MesPart mesPart = iMesPartService.getMesPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
//物料+生产版本获取bom信息
List<MesBom> mesBomList = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
//报工调整数量加-
mesWorkOrder.setAdjustQty((MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getAdjustQty())));
//冲销数量大于工单完成数量报错
if (mesWorkOrder.getAdjustQty() > mesWorkOrder.getReportedQty()) {
MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销", mesWorkOrder.getAdjustQty(), mesWorkOrder.getReportedQty());
}
String sn = getReportSn(mesWorkOrder.getOrganizeCode(), userName);
//更新工单
updateMesWorkOrder(mesWorkOrder, userName, MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT_ADJUST,mesWorkOrder.getNum());
//试制单不报工
if (Objects.isNull(mesWorkOrder.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrder.getOrderFlag())) {
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
String nowTime = TimeTool.getNowTime(true);
for (MesBom mesBom : mesBomList) {
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, nowTime));
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
}
private MesProductVersion getProductVersion(MesWorkOrder mesWorkOrderDb) {
MesProductVersion mesProductVersion = mesProductVersionService.getMesProductVersion(mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getProductVersion());
if (null == mesProductVersion) {
@ -1252,7 +1290,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT);
}
private String getOrderNo(String organizeCode,String userName) {
private String getReportSn(String organizeCode,String userName) {
return syncFuncService.syncSerialNo(new GenSerialNoModel(MesCommonConstant.REPORT_SN).organizeCode(organizeCode),userName, organizeCode, 1).getResultList().iterator().next().toString();
}

@ -1,8 +1,11 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class MesReworkTaskRequestModel {
@ -58,4 +61,7 @@ public class MesReworkTaskRequestModel {
@ApiModelProperty("ids")
private Long[] ids;
@ApiModelProperty("装配拆解List")
private List<MesProductionAssemblyModel> assemblyModelList;
}

@ -412,4 +412,7 @@ public class MesPcnExtConstWords {
//发运解析条码最大长度
public static final String MAX_SHIPPING_BARCODE_LENGTH = "MAX_SHIPPING_BARCODE_LENGTH";
//拆解目标库位
public static final String DISASSEMBLY_DEST_LOCATE = "DISASSEMBLY_DEST_LOCATE";
}

Loading…
Cancel
Save