Merge remote-tracking branch 'origin/dev' into dev

tags/yfai-pcn-ext-v1.0
jun 11 months ago
commit 1ce8b4b480

@ -6,6 +6,8 @@ import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import java.util.List;
/** /**
* @Description: 线 * @Description: 线
* @Author: gsz * @Author: gsz
@ -18,4 +20,7 @@ public interface IMesShiftService {
@ApiOperation(value = "查询产线与班次的对应关系") @ApiOperation(value = "查询产线与班次的对应关系")
public ListPager<MesShift> queryMesShiftByPager(MesShift mesShift, Pager pager); public ListPager<MesShift> queryMesShiftByPager(MesShift mesShift, Pager pager);
@ApiOperation(value = "查询产线与班次的对应关系")
public List<MesShift> queryMesShift(String organizeCode, String workCenterCode);
} }

@ -3,6 +3,8 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; 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.MesWorkOrder;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -35,5 +37,25 @@ public interface IMesWorkOrderService {
* @param organizeCode * @param organizeCode
* @return * @return
*/ */
List<MesProduceSn> getUnReportMesProduceSn(String organizeCode); public List<MesProductionRecord> getUnReportMesProduceSn(String organizeCode);
List<MesProductionRecord> getPreDayReportMesProductionRecord(String organizeCode , List<MesShift> mesShiftList, String workCenterCode);
List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode ,List<MesProductionRecord> mesProductionRecordList );
public List<MesWorkOrder> insertMesWorkOrder(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName );
void doPcnJobProductReport(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName, MesWorkOrder mesWorkOrder);
void doProductReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName);
void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName);
/**
*
* @param organizeCode
* @return
*/
List<MesProductionRecord> getUnReportHasOrderMesProduceSn(String organizeCode);
} }

@ -1,23 +1,32 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportNoSortJob; import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportNoSortJob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog; import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask; import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository;
import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/test") @RequestMapping(MesCommonConstant.MES_YANFEN + "/test")
@ -26,6 +35,17 @@ public class TestController {
private IMesEquipmentLogExtService mesEquipmentLogExtService; private IMesEquipmentLogExtService mesEquipmentLogExtService;
@Autowired @Autowired
private MesReportNoSortJob mesReportNoSortJob; private MesReportNoSortJob mesReportNoSortJob;
@Autowired
private IMesWorkOrderService workOrderService;
@Autowired
private MesProductionRecordRepository productionRecordRao;
@Autowired
private MesShiftRepository mesShiftRepository;
@Autowired
private IMesConfigService configService;
@GetMapping("/equipment/log/query") @GetMapping("/equipment/log/query")
@ApiOperation(value = "查询设备交互") @ApiOperation(value = "查询设备交互")
public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) { public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) {
@ -38,6 +58,50 @@ public class TestController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e); return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
} }
} }
@GetMapping("/reportWorkByPreDayJob")
@ApiOperation(value = "查询设备交互")
public ResultBean queryReworkTaskByPager(String organizeCode) {
try {
//遍历系统参数指定的产线获取对应班次,找到早班的开始时间,
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO");
List<String> workCenterCodeList = Arrays.asList(workCenterCodes.split(","));
String userName = "REPORT_PRE_DAY_JOB";
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
List<MesShift> mesShiftListAll = mesShiftRepository.findByHqlWhere(packBean);
for (String workCenterCode : workCenterCodeList) {
List<MesShift> mesShiftList = mesShiftListAll.stream().filter(s -> s.getWorkCenterCode().equalsIgnoreCase(workCenterCode)).collect(Collectors.toList());
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
List<MesProductionRecord> mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode,mesShiftList,workCenterCode);
if(CollectionUtils.isEmpty(mesProductionRecordList)){
continue;
}
//2. 查询 mesProduceSn
List<MesProduceSn> unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList);
if(CollectionUtils.isEmpty(unReportMesProduceSn)){
continue;
}
List<MesWorkOrder> mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName);
if(CollectionUtils.isEmpty(mesWorkOrders)){
continue;
}
//根据产线+物料产生的工单报工
for (MesWorkOrder mesWorkOrder : mesWorkOrders) {
List<MesProduceSn> mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList());
workOrderService.doPcnJobProductReport(mesProduceSnList,mesShiftList,organizeCode,userName, mesWorkOrder);
}
for (MesProductionRecord mesProductionRecord : mesProductionRecordList) {
mesProductionRecord.setReportStatus(20);
ConvertBean.serviceModelUpdate(mesProductionRecord, userName);
}
productionRecordRao.saveAll(mesProductionRecordList);
}
return ResultBean.success("查询成功").setResultList(null);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/reportOrder") @GetMapping("/reportOrder")
@ApiOperation(value = "报工") @ApiOperation(value = "报工")

@ -23,7 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author castle, * @author castle,
@ -61,31 +63,49 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
if (null == userName){ if (null == userName){
userName = "JOB"; userName = "JOB";
} }
List<MesProduceSn> unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode); // 处理无工单
for (MesProduceSn mesProduceSn : unReportMesProduceSn) { handlerNoOrder(organizeCode, userName);
// 处理有工单
handlerHasOrder(organizeCode, userName);
// }
}
private void handlerNoOrder(String organizeCode, String userName) {
List<MesProductionRecord> unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode);
try { try {
workOrderService.doProductReport(Arrays.asList(mesProduceSn), organizeCode, userName); Map<String, Integer> map = new HashMap<>();
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单 workOrderService.doProductReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName);
updateProductionRecord(organizeCode, userName, mesProduceSn);
} catch (ImppBusiException e) { } catch (ImppBusiException e) {
LOGGER.error("条码:{}报工失败", mesProduceSn.getProductSn(), e.getErrorDetail()); LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
updateProductionRecord(organizeCode, userName, mesProduceSn, e.getErrorDetail()); updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
continue;
} }
} }
private void handlerHasOrder(String organizeCode, String userName) {
List<MesProductionRecord> unReportMesProduceSn = workOrderService.getUnReportHasOrderMesProduceSn(organizeCode);
try {
Map<String, Integer> map = new HashMap<>();
workOrderService.doProductHasOrderReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName);
} catch (ImppBusiException e) {
LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
} }
}
private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn) { private void updateProductionRecord(String organizeCode, String userName, String sn) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean); DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"}, productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() },ddlPackBean); new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() },ddlPackBean);
} }
private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn, String errorMsg) { private void updateProductionRecord(String organizeCode, String userName, String sn, String errorMsg) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean); DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus", "remark"}, productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus", "remark"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue(), errorMsg },ddlPackBean); new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue(), errorMsg },ddlPackBean);
} }

@ -0,0 +1,113 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
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.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.init.ApplicationProperties;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author
* @version 1.0
* @date 2024/6/26 10:26
**/
@Slf4j
@DisallowConcurrentExecution
@Component
@ApiOperation("根据前一天待报工记录数插入工单并报工job")
public class MesReportWorkByPreDayJob extends BaseMesScheduleJob {
@Autowired
private IMesWorkOrderService workOrderService;
@Autowired
private MesProductionRecordRepository productionRecordRao;
@Autowired
private MesShiftRepository mesShiftRepository;
@Autowired
private IMesConfigService configService;
public MesReportWorkByPreDayJob() {
super(MesReportWorkByPreDayJob.class, "根据前一天待报工记录数插入工单并报工JOB");
}
@Override
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
String jobParam = this.getJobParam();
JSONObject jsonObject = JSONUtil.parseObj(jobParam);
String organizeCode = jsonObject.getStr("organizeCode");
String userName = "REPORT_PRE_DAY_JOB";
if (null == organizeCode) {
log.error("请添加需要报工的工厂代码!");
return;
}
//遍历系统参数指定的产线获取对应班次,找到早班的开始时间,
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO");
List<String> workCenterCodeList = Arrays.asList(workCenterCodes.split(","));
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
List<MesShift> mesShiftListAll = mesShiftRepository.findByHqlWhere(packBean);
for (String workCenterCode : workCenterCodeList) {
List<MesShift> mesShiftList = mesShiftListAll.stream().filter(s -> s.getWorkCenterCode().equalsIgnoreCase(workCenterCode)).collect(Collectors.toList());
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
List<MesProductionRecord> mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode, mesShiftList, workCenterCode);
if (CollectionUtils.isEmpty(mesProductionRecordList)) {
continue;
}
//2. 查询 mesProduceSn
List<MesProduceSn> unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode, mesProductionRecordList);
if (CollectionUtils.isEmpty(unReportMesProduceSn)) {
continue;
}
LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, unReportMesProduceSn);
//3.插入生产工单表
List<MesWorkOrder> mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList, organizeCode, userName);
if (CollectionUtils.isEmpty(mesWorkOrders)) {
continue;
}
LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, mesWorkOrders);
//4.根据产线+物料产生的工单报工
try {
for (MesWorkOrder mesWorkOrder : mesWorkOrders) {
List<MesProduceSn> mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList());
workOrderService.doPcnJobProductReport(mesProduceSnList, mesShiftList, organizeCode, userName, mesWorkOrder);
for (MesProductionRecord mesProductionRecord : mesProductionRecordList) {
mesProductionRecord.setReportStatus(20);
ConvertBean.serviceModelUpdate(mesProductionRecord, userName);
}
productionRecordRao.saveAll(mesProductionRecordList);
}
} catch (ImppBusiException e) {
LOGGER.error("产线:{}报工失败:{}", workCenterCode, e.getErrorDetail());
// for (MesProductionRecord mesProductionRecord : mesProductionRecordList) {
// mesProductionRecord.setReportStatus(40);
// ConvertBean.serviceModelUpdate(mesProductionRecord, userName);
// }
// productionRecordRao.saveAll(mesProductionRecordList);
continue;
}
}
}
}

@ -43,4 +43,10 @@ public class MesShiftServiceImpl implements IMesShiftService {
return new ListPager<>(resultList, pager); return new ListPager<>(resultList, pager);
} }
@Override
public List<MesShift> queryMesShift(String organizeCode, String workCenterCode) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean);
return mesShiftRepository.findByHqlWhere(packBean);
}
} }

@ -1,8 +1,14 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesShiftService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.Pager;
@ -11,16 +17,25 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; 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.exception.ImppBusiException;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.format.DateParser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -37,6 +52,7 @@ import java.util.stream.Stream;
@Slf4j @Slf4j
public class MesWorkOrderService implements IMesWorkOrderService { public class MesWorkOrderService implements IMesWorkOrderService {
public static final Logger LOGGER = LoggerFactory.getLogger(MesWorkOrderService.class);
@Autowired @Autowired
private MesWorkOrderRepository workOrderRepository; private MesWorkOrderRepository workOrderRepository;
@Autowired @Autowired
@ -57,6 +73,24 @@ public class MesWorkOrderService implements IMesWorkOrderService {
@Autowired @Autowired
private MesProduceSnRepository mesProduceSnRao; private MesProduceSnRepository mesProduceSnRao;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private MesWorkOrderLogRepository mesWorkOrderLogRepository;
@Autowired
private MesWorkOrderToWmsRepository mesWorkOrderToWmsRDao;
@Autowired
private MesShiftRepository mesShiftRepository;
@Autowired
private IMesConfigService configService;
@Autowired
private IMesPartService iMesPartService;
@Autowired
private IMesShiftService mesShiftService;
@Override @Override
public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) { public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) {
@ -218,10 +252,468 @@ public class MesWorkOrderService implements IMesWorkOrderService {
mesProductOffLineRDao.saveAll(mesProductOffLineList); mesProductOffLineRDao.saveAll(mesProductOffLineList);
} }
} }
public void doPcnJobProductReport(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName ,MesWorkOrder mesWorkOrderDb) {
//查询物料信息
DdlPackBean ddlPackBeanPart = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getPartNo(), "partNo", ddlPackBeanPart);
MesPart mesPart = mesPartRDao.getByProperty(ddlPackBeanPart);
if (null == mesPart) {
MesPcnException.throwMesBusiException("物料【%s】信息不存在", mesWorkOrderDb.getPartNo());
}
//查询产线信息
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getWorkCenterCode(), "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter)) {
MesPcnException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode());
}
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb);
//物料+生产版本获取bom信息
List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
//报工类型
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) {
mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty()));
//更新工单状态
double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty());
mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) {
MesPcnException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工",
mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty());
} else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
} else {
//报工调整数量加-
mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty())));
//冲销数量大于工单完成数量报错
if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) {
MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销",
mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty());
}
}
LOGGER.info("产线:{} 零件:{}更新工单", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo());
//更新工单
updateMesWorkOrder(mesWorkOrderDb, userName );
//生成条码 todo 有条码 不生成
//保存数据
// List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
// for (MesBom mesBom : mesBoms) {
// mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
// }
// mesProductOffLineService.insertBatch(mesProductOffLineList);
LOGGER.info("产线:{} 零件:{}更新工单mesProduceSns:{}", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo(),mesProduceSns.size());
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
for (MesProduceSn produceSn : mesProduceSns) {
for (MesBom mesBom : mesBoms) {
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(mesWorkOrderDb.getPartNo());
newMesProductOffLine.setReportPartNameRdd(mesWorkOrderDb.getPartName());
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
newMesProductOffLine.setItemQty(mesBom.getItemQty());
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
newMesProductOffLine.setQty(1d);
newMesProductOffLine.setReportSn(produceSn.getProductSn());
newMesProductOffLine.setBomVersion(mesWorkOrderDb.getProductVersion());
newMesProductOffLine.setSerialNumber(produceSn.getProductSn());
newMesProductOffLine.setUnit(mesBom.getUnit());
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
newMesProductOffLine.setWorkOrderNo(mesWorkOrderDb.getWorkOrderNo());
newMesProductOffLine.setWorkCenterCode(mesWorkOrderDb.getWorkCenterCode());
newMesProductOffLine.setWorkCellCode(mesWorkOrderDb.getWorkCellCode());
newMesProductOffLine.setReportType(mesWorkOrderDb.getReportType());
newMesProductOffLine.setSapWorkCenter(mesWorkOrderDb.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
mesProductOffLineList.add(newMesProductOffLine);
}
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName ) {
//修改工单,需要重新同步
mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelUpdate(mesWorkOrder, userName);
workOrderRepository.update(mesWorkOrder);
//保存记录
saveMesWorkOrderLog(mesWorkOrder);
}
public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) {
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id");
mesWorkOrderLogRepository.insert(workOrderLog);
}
public List<MesBom> findBomList(String organizeCode, MesPart mesPart, String bomVersion) {
List<MesBom> bomData = new ArrayList<>();
// 递归展开 BOM
expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData);
if (bomData.size() == 0) {
MesPcnException.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());
}
}
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 = findMesBomByPartNoAndBomVersion(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 = MathOperation.div(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);
}
}
}
public List<MesBom> findMesBomByPartNoAndBomVersion(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);
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
if (org.springframework.util.CollectionUtils.isEmpty(mesBoms)) {
MesPcnException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion);
}
MesBom next = mesBoms.iterator().next();
//如果存在多个bomCode取最新的一个
return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode());
}
private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getErpWorkCenter(), "workCenterCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkOrder.getProductVersion(), "productVersion", ddlPackBean);
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (null == mesProductVersion) {
MesPcnException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo());
}
return mesProductVersion;
}
private void updateProductionRecord(String organizeCode, String userName, String sn) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue()},ddlPackBean);
}
@Override @Override
public List<MesProduceSn> getUnReportMesProduceSn(String organizeCode) { public void doProductReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) {
List<MesProduceSn> mesProduceSnList = new ArrayList<>(); //新增初始化 todo
// 根据
//根据物料获取已发布的工单
MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode);
if (oldMesWorkOrder == null) {
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
}
report(productionRecord, organizeCode, userName, oldMesWorkOrder);
}
@Override
public void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) {
//新增初始化 todo
// 根据
//根据物料获取已发布的工单
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
}
report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0));
}
private void report(MesProductionRecord productionRecord, String organizeCode, String userName, MesWorkOrder oldMesWorkOrder) {
DdlPackBean ddlPackBean;
//查询工作中心
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter)) {
throw new ImppBusiException(String.format("产线【%s】不存在", oldMesWorkOrder.getWorkCenterCode()));
}
//获取生产版本
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getProductVersion(), "productVersion", ddlPackBean);
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (null == mesProductVersion) {
throw new ImppBusiException(String.format("物料【%s】生产版本信息不存在", productionRecord.getPartNo()));
}
//物料+生产版本获取bom信息
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean);
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesBoms)) {
throw new ImppBusiException(String.format("物料【%s】生产版本【%s】对应bom信息不存在",
productionRecord.getPartNo(), mesProductVersion.getProductVersion()));
}
oldMesWorkOrder.setNum(oldMesWorkOrder.getNum() == null ? 1 : oldMesWorkOrder.getNum() + 1);
oldMesWorkOrder.setReportedQty(MathOperation.add(oldMesWorkOrder.getNum(), oldMesWorkOrder.getReportedQty()));
//更新SAP计划完成数量
saveMesProductPlan(oldMesWorkOrder, false, true);
//更新工单状态
double unCompleteQty = MathOperation.sub(oldMesWorkOrder.getQty(), oldMesWorkOrder.getReportedQty());
oldMesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
if (oldMesWorkOrder.getReportedQty() > oldMesWorkOrder.getQty()) {
throw new ImppBusiException(String.format("工单报工数量【%s】大于工单数量【%s】,不允许报工",
oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty()));
} else if (Objects.equals(oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())) {
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
ConvertBean.serviceModelUpdate(oldMesWorkOrder, userName);
workOrderRepository.saveAndFlush(oldMesWorkOrder);
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
for (MesBom mesBom : mesBoms) {
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo());
newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName());
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
newMesProductOffLine.setItemQty(mesBom.getItemQty());
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
newMesProductOffLine.setQty(1d);
newMesProductOffLine.setReportSn(productionRecord.getProductSn());
newMesProductOffLine.setBomVersion(oldMesWorkOrder.getProductVersion());
newMesProductOffLine.setSerialNumber(productionRecord.getProductSn());
newMesProductOffLine.setUnit(mesBom.getUnit());
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
newMesProductOffLine.setWorkOrderNo(oldMesWorkOrder.getWorkOrderNo());
newMesProductOffLine.setWorkCenterCode(oldMesWorkOrder.getWorkCenterCode());
newMesProductOffLine.setWorkCellCode(oldMesWorkOrder.getWorkCellCode());
newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType());
newMesProductOffLine.setSapWorkCenter(oldMesWorkOrder.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode());
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
mesProductOffLineList.add(newMesProductOffLine);
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
// 同步工单信息给加工记录、条码信息
DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(productionRecord.getProductSn(), "productSn", snDdlPackBean);
DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", snDdlPackBean);
mesProduceSnRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo()},snDdlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo", "reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()},snDdlPackBean);
}
/**
*
* @param productionRecord
* @param organizeCode
* @return
*/
private MesWorkOrder getMesWorkOrder(MesProductionRecord productionRecord, String organizeCode) {
MesWorkOrder mesWorkOrder = new MesWorkOrder();
/**
* 线
*/
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
// 获取当前班次
String shiftCode = productionRecord.getShiftCode();
String workCenterCode = productionRecord.getWorkCenterCode();
List<MesShift> shiftList = mesShiftService.queryMesShift(organizeCode, workCenterCode);
// 如果当前班次是早班
if (CollectionUtils.isEmpty(shiftList)) {
MesPcnException.throwFlowException(String.format("班次信息未维护,产线=%s"), workCenterCode);
}
List<MesShift> shifts = shiftList.stream().filter(mesShift -> Objects.equals(mesShift.getWorkCenterCode(), workCenterCode)).collect(Collectors.toList());
MesShift currentShift = shifts.stream().filter(mesShift -> Objects.equals(mesShift.getShiftCode(), shiftCode)).findFirst().orElse(null);
String beginTime =productionRecord.getLotNo() + " " + currentShift.getStartTime();
Date beginDate = transfer(beginTime);
/*MesWorkOrder found = null;
for (MesWorkOrder oldMesWorkOrder : oldMesWorkOrders) {
if (beginDate.getTime() >= transfer(oldMesWorkOrder.getPlanStartTime()).getTime() && beginDate.getTime() < transfer(oldMesWorkOrder.getPlanEndTime()).getTime()) {
found = oldMesWorkOrder;
break;
}
}*/
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> beginDate.getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && beginDate.getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
String date = productionRecord.getLotNo();
// 如果找不到需要找 当天的其它班次
if (mesWorkOrder == null) {
// 如果开始时间大于结束时间,说明跨天了,跨天说明是晚班,需要找, 如果是晚班, 则找早中班的工单
if (currentShift.getStartTime().compareTo(currentShift.getEndTime()) > 0) {
// 如果比0点大需要找日期前一天的班次的工单号,如果是0点前date =lotNO 如果是0点后则找lot的前一天
int hours = transfer(productionRecord.getCompleteDateTime()).getHours();
if (hours < 12) {
date = getDate(productionRecord.getLotNo(), 1);
} else {
date = getDate(productionRecord.getLotNo(), 0);
}
String endTime = date + " " +currentShift.getStartTime();
String startTime = date + " " +currentShift.getEndTime();
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() > transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() < transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
} else {
// 早班或者中班 则找当天非当前班次的最早单号
String startTime = date + " " +currentShift.getEndTime();
String endTime = getDate(date, 2) + " " +currentShift.getStartTime();
for (MesWorkOrder workOrder : oldMesWorkOrders) {
if (transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()) {
break;
}
}
mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null);
}
if (mesWorkOrder == null) {
// todo 需要记录并且第二天要用job跑
return null;
}
}
return mesWorkOrder;
}
private List<MesWorkOrder> getMesWorkOrders(MesProductionRecord productionRecord, String organizeCode, String workOrderNo) {
List<Integer> list = Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList());
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean);
if (!StringUtils.isEmpty(workOrderNo)) {
DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", ddlPackBean);
}
DdlPreparedPack.getInPackList(list, "workOrderStatus", ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
// 新增班次逻辑
//DdlPreparedPack.
List<MesWorkOrder> oldMesWorkOrders = workOrderRepository.findByHqlWhere(ddlPackBean);
if(CollectionUtils.isEmpty(oldMesWorkOrders)){
throw new ImppBusiException(String.format("物料【%s】状态已发布的工单信息不存在", productionRecord.getPartNo()));
}
return oldMesWorkOrders;
}
/**
* flag = 1 1 = 2
* @param lotNo
* @param flag
* @return
*/
public String getDate(String lotNo, int flag) {
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date d = null;
try {
d = df.parse(lotNo);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal=Calendar.getInstance();
cal.setTime(d);
if (flag == 1) {
cal.add(Calendar.DATE, -1); //减1天
} else if (flag == 2) {
cal.add(Calendar.DATE, 1); //加1天
}
return df.format(cal.getTime()).substring(0, 10);
}
private MesProductVersion getMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
ddlPackBean.setOrderByStr(" order by createDatetime desc ");
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesProductVersion)) {
MesPcnException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(),
mesWorkCenter.getErpWorkCenter());
}
return mesProductVersion;
}
@Override
public List<MesProductionRecord> getUnReportMesProduceSn(String organizeCode) {
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList());
DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean);
DdlPreparedPack.getIsNull("workOrderNo",ddlPackBean);
//DdlPreparedPack.getStringEqualPack("B19CK01A", "workCenterCode",ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);
return mesProductionRecordList;
}
@Override
public List<MesProductionRecord> getUnReportHasOrderMesProduceSn(String organizeCode) {
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单 //1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()); List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList());
@ -229,15 +721,31 @@ public class MesWorkOrderService implements IMesWorkOrderService {
DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean); DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 5); List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);
if (mesProductionRecordList.isEmpty()){
return mesProduceSnList; return mesProductionRecordList;
} }
//2.根据工单查询工单下的mesProduceSn
List<String> workOrderNoList = mesProductionRecordList.stream().map(MesProductionRecord::getWorkOrderNo).collect(Collectors.toList());
//工单号 @Override
public List<MesProductionRecord> getPreDayReportMesProductionRecord(String organizeCode,List<MesShift> mesShiftList, String workCenterCode ) {
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean);
DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean);
//获取前一天的早班到当天早班的区间的所有加工记录,统计个数
DdlPreparedPack.timeBuilder(TimeTool.getToday()+" 08:00:00",
new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00",
"completeDateTime", ddlPackBean, false);
return productionRecordRao.findByHqlWhere(ddlPackBean);
}
@Override
public List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode,List<MesProductionRecord> mesProductionRecordList ) {
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(workOrderNoList,"workOrderNo",snPackBean); DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()),
"productSn",snPackBean);
return mesProduceSnRao.findByHqlWhere(snPackBean); return mesProduceSnRao.findByHqlWhere(snPackBean);
} }
@ -305,4 +813,134 @@ public class MesWorkOrderService implements IMesWorkOrderService {
} }
} }
@Override
public List<MesWorkOrder> insertMesWorkOrder(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList, String organizeCode, String userName) {
List<MesWorkOrder> mesWorkOrderList=new ArrayList<>();
Map<String, List<MesProduceSn>> snListMap = mesProduceSns.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() +"="+ sn.getPartNo()));
for (Map.Entry<String, List<MesProduceSn>> stringListEntry : snListMap.entrySet()) {
List<MesProduceSn> value = stringListEntry.getValue();
MesProduceSn mesProduceSn = value.get(0);
String[] split = stringListEntry.getKey().split("=");
String workCenterCode = split[0];
String partNo = split[1];
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter)) {
MesPcnException.throwMesBusiException("产线【%s】不存在",workCenterCode);
}
MesWorkOrder item=new MesWorkOrder();
item.setOrganizeCode(organizeCode);
item.setWorkCenterCode(workCenterCode);
item.setPartNo(partNo);
item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue());
item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue());
List<MesShift> collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList());
MesShift mesShift= collect.get(0);
item.setShiftCode(mesShift.getShiftCode());
item.setShiftCode(mesShift.getShiftName());
String today = TimeTool.getToday();
item.setPlanStartTime(today+" "+mesShift.getStartTime()+":00");
item.setPlanEndTime(today+" "+mesShift.getEndTime()+":00");
//生成工单号
List<String> orderList=new ArrayList<>();
GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_CENTER_ORDER_NO");
genSerialNoModel.setPartNo(workCenterCode);
orderList = syncFuncService.syncSerialNo(genSerialNoModel,userName, organizeCode, 1).getResultList();
String orderNo = orderList.get(0);
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean);
if (mesWorkCenterRDao.isExitByHql(orderPackBean)) {
MesPcnException.throwMesBusiException("单号流水码生成重复");
}
item.setWorkOrderNo(orderNo);
//校验标识
//若工单类型为排序
List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>();
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
//校验产线类型和工单类型是否匹配
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) {
MesPcnException.throwMesBusiException("产线【%s】类型为【%s】请选择非排序产线", mesWorkCenter.getWorkCenterCode(),
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
}
//校验物料生产版本是否存在
MesProductVersion mesProductVersion = checkMesProductVersion(item);
item.setProductVersion(mesProductVersion.getProductVersion());
//获取bom信息
List<MesBom> bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
//发送工单信息给WMS
saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList));
}
//物料名称不存在,从物料信息中获取
item.setPartName(mesProduceSn.getPartName());
//生产时间新增取当天
item.setProduceTime(TimeTool.getToday());
item.setUnCompleteQty(0d);
// if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()){
// //生产工单-非排序手工插单,关闭该零件当天之前日期非排序工单
// List<String> partNoList = Collections.singletonList(item.getPartNo());
// deleteUnSortOrder(orderNo,partNoList);
// }
item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum());
item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelInitialize(item, userName);
MesWorkOrder mesWorkOrder = workOrderRepository.insert(item);
//保存发送WMS数据
if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) {
mesWorkOrderToWmsRDao.saveAll(saveMesWorkOrderToWms);
}
saveMesWorkOrderLog(mesWorkOrder);
mesWorkOrderList.add(mesWorkOrder);
}
return mesWorkOrderList;
}
public void deleteUnSortOrder(String organizeCode, List<String> partNoList) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(partNoList, "partNo", 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);
workOrderRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"},
new Object[]{"CLOSE_JOB", TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean);
}
public List<MesWorkOrderToWms> saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List<MesBom> mesBomList) {
List<MesWorkOrderToWms> mesWorkOrderToWmsList = new ArrayList<>();
MesWorkOrderToWms mesWorkOrderToWms = null;
for (MesBom mesBom : mesBomList) {
mesWorkOrderToWms = new MesWorkOrderToWms();
BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id");
mesWorkOrderToWms.setUnit(mesBom.getUnit());
mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo());
mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName());
mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit());
mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty()));
ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser());
mesWorkOrderToWmsList.add(mesWorkOrderToWms);
}
return mesWorkOrderToWmsList;
}
private MesProductVersion checkMesProductVersion(MesWorkOrder item) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(item.getErpWorkCenter(), "workCenterCode", ddlPackBean);
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesProductVersion)) {
MesPcnException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion());
}
return mesProductVersion;
}
private Date transfer(String dateStr){
return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT);
}
} }

@ -169,7 +169,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(snRule, "ruleCode", mesRulePackBean); DdlPreparedPack.getStringEqualPack(snRule, "ruleCode", mesRulePackBean);
List<MesNumberRule> ruleList = mesNumberRuleRao.findByHqlWhere(mesRulePackBean); List<MesNumberRule> ruleList = mesNumberRuleRao.findByHqlWhere(mesRulePackBean);
if (!ruleList.isEmpty()) { if (!ruleList.isEmpty() && !StringUtils.isEmpty(ruleList.get(0).getMethodNameExt())) {
MesNumberRule numberRule = ruleList.get(0); MesNumberRule numberRule = ruleList.get(0);
String methodNameExt = numberRule.getMethodNameExt(); String methodNameExt = numberRule.getMethodNameExt();
INumberRulePackAttributeStrategy strategy = (INumberRulePackAttributeStrategy)SpringContextsUtil.getBean(methodNameExt); INumberRulePackAttributeStrategy strategy = (INumberRulePackAttributeStrategy)SpringContextsUtil.getBean(methodNameExt);

@ -77,7 +77,7 @@ public class MesSaveProcessResultStepService extends BaseStepService {
/** /**
* *
*/ */
// mesProductResultErrorHandleStepService.execute(reqBean); mesProductResultErrorHandleStepService.execute(reqBean);
/** /**
* *
*/ */

@ -150,8 +150,8 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
StationKvBean shiftGroupKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftGroup")).findFirst().orElse(null); StationKvBean shiftGroupKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftGroup")).findFirst().orElse(null);
StationKvBean shiftCodeKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftCode")).findFirst().orElse(null); StationKvBean shiftCodeKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftCode")).findFirst().orElse(null);
mesProdShiftContext.setShiftCode(shiftGroupKvBean == null ? null : shiftGroupKvBean.getValue()); mesProdShiftContext.setShiftCode(shiftGroupKvBean == null ? null : shiftCodeKvBean.getValue());
mesProdShiftContext.setShiftGroup(shiftCodeKvBean == null ? null : shiftCodeKvBean.getValue()); mesProdShiftContext.setShiftGroup(shiftCodeKvBean == null ? null : shiftGroupKvBean.getValue());
return mesProdShiftContext; return mesProdShiftContext;
} }

@ -29,7 +29,9 @@
<log4j2.level>INFO</log4j2.level> <log4j2.level>INFO</log4j2.level>
<skipTests>true</skipTests> <skipTests>true</skipTests>
<app.charset>UTF-8</app.charset> <app.charset>UTF-8</app.charset>
<!--<impp.framework.version>1.0.0.4-patch</impp.framework.version>--> <!--
<impp.framework.version>1.0.0.4-patch</impp.framework.version>
-->
<impp.framework.version>1.0.1-YZ</impp.framework.version> <impp.framework.version>1.0.1-YZ</impp.framework.version>
<i3plus.pojo.version>1.0.0-yfai</i3plus.pojo.version> <i3plus.pojo.version>1.0.0-yfai</i3plus.pojo.version>

Loading…
Cancel
Save