tags/yfai-pcn-ext-v1.0
gsz 11 months ago
commit de09ab75cc

@ -4,6 +4,7 @@ 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.apiservice.schedulejob.MesReportNoSortJob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportWorkByPreDayJob;
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;
@ -36,6 +37,8 @@ public class TestController {
@Autowired
private MesReportNoSortJob mesReportNoSortJob;
@Autowired
private MesReportWorkByPreDayJob mesReportWorkByPreDayJob;
@Autowired
private IMesWorkOrderService workOrderService;
@ -109,4 +112,11 @@ public class TestController {
mesReportNoSortJob.executeMesJob(null, null);
}
@GetMapping("/reportOrder1")
@ApiOperation(value = "报工")
public void reportOrder1() {
mesReportWorkByPreDayJob.executeMesJob(null, null);
}
}

@ -17,6 +17,7 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
@ -72,6 +73,10 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
private void handlerNoOrder(String organizeCode, String userName) {
List<MesProductionRecord> unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode);
if (CollectionUtils.isEmpty(unReportMesProduceSn)) {
LOGGER.error("没有加工记录,无需处理");
return;
}
try {
Map<String, Integer> map = new HashMap<>();
workOrderService.doProductReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName);
@ -84,6 +89,10 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
private void handlerHasOrder(String organizeCode, String userName) {
List<MesProductionRecord> unReportMesProduceSn = workOrderService.getUnReportHasOrderMesProduceSn(organizeCode);
if (CollectionUtils.isEmpty(unReportMesProduceSn)) {
LOGGER.error("没有加工记录,无需处理");
return;
}
try {
Map<String, Integer> map = new HashMap<>();
workOrderService.doProductHasOrderReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName);

@ -57,7 +57,7 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob {
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
String jobParam = this.getJobParam();
JSONObject jsonObject = JSONUtil.parseObj(jobParam);
String organizeCode = jsonObject.getStr("organizeCode");
String organizeCode = jsonObject.getStr("organizeCode") == null ? "CK01" : jsonObject.getStr("organizeCode");
String userName = "REPORT_PRE_DAY_JOB";
if (null == organizeCode) {
log.error("请添加需要报工的工厂代码!");
@ -87,6 +87,7 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob {
List<MesWorkOrder> mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList, organizeCode, userName);
if (CollectionUtils.isEmpty(mesWorkOrders)) {
continue;
}
LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, mesWorkOrders);
//4.根据产线+物料产生的工单报工

@ -449,7 +449,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
private void updateProductionRecord(String organizeCode, String userName, String sn) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean);
DdlPreparedPack.getStringEqualPack(sn, "custSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue()},ddlPackBean);
}
@ -461,6 +461,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode);
if (oldMesWorkOrder == null) {
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
return;
}
report(productionRecord, organizeCode, userName, oldMesWorkOrder);
@ -578,6 +579,9 @@ public class MesWorkOrderService implements IMesWorkOrderService {
* 线
*/
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
return null;
}
// 获取当前班次
String shiftCode = productionRecord.getShiftCode();
String workCenterCode = productionRecord.getWorkCenterCode();
@ -653,9 +657,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
// 新增班次逻辑
//DdlPreparedPack.
List<MesWorkOrder> oldMesWorkOrders = workOrderRepository.findByHqlWhere(ddlPackBean);
if(CollectionUtils.isEmpty(oldMesWorkOrders)){
throw new ImppBusiException(String.format("物料【%s】状态已发布的工单信息不存在", productionRecord.getPartNo()));
}
return oldMesWorkOrders;
}
@ -703,9 +705,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
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);
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER");
List<String> centerList = Arrays.asList(workCenterCodes.split(","));
DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);
@ -720,6 +723,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
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.getIsNotNull("workOrderNo",ddlPackBean);
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER");
List<String> centerList = Arrays.asList(workCenterCodes.split(","));
DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1);

@ -11,7 +11,10 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
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.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -25,8 +28,11 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.persistence.EntityManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -52,6 +58,9 @@ public class MesWorkOrderSaveStepService extends BaseStepService {
@Autowired
private MesWorkOrderRepository workOrderRepository;
@Autowired
private EntityManager entityManager;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -96,56 +105,100 @@ public class MesWorkOrderSaveStepService extends BaseStepService {
//保存生产工单数据
private void doHandleWorkOrderData(StationRequestBean reqBean, StationResultBean resultBean, List<MesProductionPartContext> productionPartContextList, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsOutContext> productionPsOutContextList, MesWorkCenter workCenter) {
//根据生产工单分组
Map<String, List<MesProductionPartContext>> ppMap = productionPartContextList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo));
//根据生产工单分组
Map<String, List<MesProductionPsOutContext>> proMap = productionPsOutContextList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionPsOutContext::getWorkOrderNo));
//产出零件信息根据生产工单分组
Map<String, List<MesProductionPartContext>> ppMap = productionPartContextList.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo));
//产出条码 根据生产工单分组
Map<String, List<MesProductionPsOutContext>> proMap = productionPsOutContextList.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(MesProductionPsOutContext::getWorkOrderNo));
//产品加工规则 根据foreignKey分组
Map<Integer, MesProdRuleContext> prMap = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o));
//遍历产出零件信息
for(Map.Entry<String, List<MesProductionPartContext>> entry : ppMap.entrySet()) {
if (null == entry) continue;
//获取对应的加工规则
List<MesProductionPsOutContext> produceSnContextList = proMap.get(entry.getKey());
//生产数量
Integer calcCompleteQty = 0;
Integer reportQty = 0;
//遍历产出物料
for (MesProductionPsOutContext productionPsOutContext : produceSnContextList) {
if (null == productionPsOutContext) continue;
//产出零件是否是
if (productionPsOutContext.getIsCalcCompleteQty() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) calcCompleteQty += 1;
if (prMap.get(productionPsOutContext.getForeignKey()).getReportType().compareTo(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue()) != 0) reportQty += 1;
}
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) == 0 && reportQty.compareTo(MesPcnExtConstWords.ZERO) == 0) continue;
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) == 0 ) continue;
MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), entry.getValue().get(0).getId());
entityManager.detach(workOrder);
if (null == workOrder) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息不存在!", entry.getKey()));
//工单状态分 排序工单 和非排序工单; 现在必须是非排序工单
if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workCenter.getCenterType(), workOrder.getWorkOrderStatus()))
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息工单状态[%s]!", entry.getKey(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus())));
//工单产线要和当前产线一致
if (!workOrder.getWorkCenterCode().equals(reqBean.getWorkCenterCode()))
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", entry.getKey(), workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode()));
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0) workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty));
List<String> propertyNameList = new ArrayList<>();
List<Object> propertyValueList = new ArrayList<>();
//修改完成数量
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0) {
workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty));
propertyNameList.add("completeQty");
propertyValueList.add(workOrder.getCompleteQty());
}
//修改未完成数量
if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0 && workOrder.getUnCompleteQty().compareTo(new Double(0)) > 0 &&
MathOperation.compareTo(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)), new Double(0)) >= 0) workOrder.setUnCompleteQty(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)));
if (reportQty.compareTo(MesPcnExtConstWords.ZERO) > 0) workOrder.setReportedQty(MathOperation.add(workOrder.getReportedQty(), reportQty));
//TODO 可疑品数量 报废数量 上下线时间
if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo());
MathOperation.compareTo(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)), new Double(0)) >= 0) {
workOrder.setUnCompleteQty(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)));
propertyNameList.add("unCompleteQty");
propertyValueList.add(workOrder.getUnCompleteQty());
}
workOrderRepository.save(workOrder);
/**
* 线
* sql
* busiprodResult
*
*/
String prodResult = productionDispatchContextStepService.getProductResultContext(reqBean);
if (StringUtils.isEmpty(prodResult)) {
//可疑品
boolean isSuspicious = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue() == Integer.parseInt(prodResult);
if (isSuspicious && !productionPsOutContextList.isEmpty()){
int suspiciousQty = productionPsOutContextList.size();
workOrder.setSuspiciousPartQty(MathOperation.sub(workOrder.getSuspiciousPartQty(), new Double(suspiciousQty)));
propertyNameList.add("suspiciousPartQty");
propertyValueList.add(workOrder.getSuspiciousPartQty());
}
//报废数量
boolean isScrap = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue() == Integer.parseInt(prodResult);
if (isScrap && !productionPsOutContextList.isEmpty()){
int scrapQty = productionPsOutContextList.size();
workOrder.setScrapPartQty(MathOperation.sub(workOrder.getScrapPartQty(), new Double(scrapQty)));
propertyNameList.add("scrapPartQty");
propertyValueList.add(workOrder.getScrapPartQty());
}
}
if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) {
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
propertyNameList.add("workOrderStatus");
propertyValueList.add(workOrder.getWorkOrderStatus());
}
//如果数量都没有修改,不操作数据库
if (!propertyNameList.isEmpty()) {
ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo());
propertyNameList.add("modifyUser");
propertyValueList.add(reqBean.getUserInfo());
propertyNameList.add("modifyDatetime");
propertyValueList.add(TimeTool.getNowTime(true));
DdlPackBean workOrderPackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(workOrder.getId(),"id",workOrderPackBean);
workOrderRepository.updateByProperties(propertyNameList.toArray(new String[]{}), propertyValueList.toArray(), workOrderPackBean);
}
}
}
}

Loading…
Cancel
Save