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

tags/yfai-pcn-ext-v2.3
臧学普 8 months ago
commit a0e27add57

@ -64,6 +64,9 @@ public interface IMesWorkOrderService {
@ApiOperation("排序汇报job")
void doMesWorkOrderSortReport(String organizeCode, Integer pageSize, String userName);
@ApiOperation("非排序汇报job")
void doMesWorkOrderNoSortReport(String organizeCode, Integer pageSize, String userName);
@ApiOperation("根据工单查询工单零件信息")
List<MesWorkOrderPart> findMesWorkOrderPartByOrderNo(String organizeCode,List<String> workOrderNoList);
}

@ -0,0 +1,9 @@
package cn.estsh.i3plus.ext.mes.pcn.api.job;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
public interface IMesOffLineDataSyncJobService {
String doOffLineDataSync(MesPcnSyncOfflineLog pcnSyncOfflineLog);
}

@ -0,0 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.api.job;
import cn.estsh.i3plus.pojo.mes.bean.MesDatasource;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
import java.util.List;
import java.util.Map;
public interface IMesOffLineDataSyncService {
List<MesPcnSyncOfflineLog> getPcnSyncOfflineLogList(String organizeCode);
List<String> filterPcnSyncOfflineLogList(List<MesPcnSyncOfflineLog> pcnSyncOfflineLogList, Boolean flag);
Map<String, String> filterFaulurePcnSyncOfflineLog(List<MesPcnSyncOfflineLog> pcnSyncOfflineLogList);
MesPcnSyncOfflineLog insertPcnSyncOfflineLog(MesPcnSyncOfflineLog pcnSyncOfflineLog, String tableName);
void insertBaseBeanData(MesPcnSyncOfflineLog pcnSyncOfflineLog, List<Map<String, Object>> resultList, String objectCode, String tableName) throws Exception;
}

@ -1,4 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.api.job;
public class TestJobApi {
}

@ -0,0 +1,57 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.config;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesDatasource;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnTask;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@ConditionalOnExpression("'${mes.offline.sync.open:false}' == 'true'")
@Data
@Configuration
@ConfigurationProperties(prefix = "mes.offline.sync")
public class MesOffLineConfig {
//离线数据源配置
private MesDatasourceModel dataSource = new MesDatasourceModel();
//离线数据同步JOB配置
private MesPcnTaskModel pcnTask = new MesPcnTaskModel();
//sql参数注入值
private Map<String, String> sqlParameter = new HashMap<>();
//同步sql
private Map<String, String> sql = new HashMap<>();
public class MesDatasourceModel extends MesDatasource implements Serializable {
private static final long serialVersionUID = 7825562788566047534L;
@ApiParam("主机端口")
private String dsHostPort;
public void setDsHostPort(String dsHostPort) {
this.dsHostPort = dsHostPort;
if (!StringUtils.isEmpty(this.dsHostPort)) setDsPort(Integer.valueOf(this.dsHostPort));
}
}
public class MesPcnTaskModel extends MesPcnTask implements Serializable {
private static final long serialVersionUID = -521750700257233487L;
public MesPcnTaskModel() {
this.isDeleted = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
this.isValid = CommonEnumUtil.IS_VAILD.VAILD.getValue();
}
}
}

@ -0,0 +1,72 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesOffLineDataSyncJobService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.config.MesOffLineConfig;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping(MesCommonConstant.MES_YANFEN + "/offline-data-sync")
public class MesOffLineDataSyncController {
@Autowired
private IMesOffLineDataSyncJobService offLineDataSyncJobService;
@GetMapping("/cfg/get")
@ApiOperation(value = "获取离线配置")
public ResultBean getOffLineCfg() {
try {
MesOffLineConfig offLineConfig = (MesOffLineConfig) SpringContextsUtil.getBean("mesOffLineConfig");
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("dataSource", offLineConfig.getDataSource());
resultMap.put("pcnTask", offLineConfig.getPcnTask());
resultMap.put("sqlParameter", offLineConfig.getSqlParameter());
resultMap.put("sql", offLineConfig.getSql());
return ResultBean.success("查询成功").setResultMap(resultMap);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/do")
@ApiOperation(value = "执行离线同步")
public ResultBean doOffLineDataSync() {
try {
MesOffLineConfig offLineConfig = (MesOffLineConfig) SpringContextsUtil.getBean("mesOffLineConfig");
String param = offLineConfig.getPcnTask().getTaskParam();
String[] params = StringUtils.isEmpty(param) ? null : param.split(MesPcnExtConstWords.COLON);
if (null == params || params.length != 4) return ResultBean.fail("参数配置错误,参数正确格式[ mes.offline.sync.pcnTask.taskParam = 工厂:区域:生产线:工位 ]");
MesPcnSyncOfflineLog pcnSyncOfflineLog = new MesPcnSyncOfflineLog(params[0], params[1], params[2], params[3]);
pcnSyncOfflineLog.setSyncTarget(InetAddress.getLocalHost().getHostAddress());
return ResultBean.success(offLineDataSyncJobService.doOffLineDataSync(pcnSyncOfflineLog));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -57,7 +57,7 @@ public class MesPullingOrderInfoController {
throw new ImppBusiException("拉动单号不能为空");
}
mesPullingOrderInfoService.doMesPullingOrderInfoScan(mesPullingOrderInfo, !StringUtils.isEmpty(mesPullingOrderInfo.getModifyUser())?mesPullingOrderInfo.getModifyUser(): AuthUtil.getSessionUser().getUserName());
return ResultBean.success("拉动单扫描成功")
return ResultBean.success(String.format("拉动单【%s】扫描成功",mesPullingOrderInfo.getPullingOrderNo()))
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException e) {
return ResultBean.fail(e).build();

@ -4,7 +4,6 @@ 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.apiservice.schedulejob.MesReportNoSortJob;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportWorkByPreDayJob;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.test.TestService;
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;
@ -42,13 +41,12 @@ public class TestController {
@Autowired
private MesProductionRecordRepository productionRecordRao;
@Autowired
private MesShiftRepository mesShiftRepository;
@Autowired
private IMesConfigService configService;
@Autowired
private TestService testService;
private IMesConfigService configService;
@GetMapping("/reportWorkByPreDayJob")
@ApiOperation(value = "查询设备交互")

@ -15,5 +15,5 @@ import java.util.List;
public interface IMesProductionRecordDao {
@ApiOperation("查询汇报的加工记录")
List<MesProductionRecord> findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize);
List<MesProductionRecord> findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize, List<String> workCenterList);
}

@ -13,10 +13,7 @@ import org.springframework.util.StringUtils;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.*;
/**
* @Description :
@ -54,7 +51,7 @@ public class MesInsertBatchDaoImpl implements IMesInsertBatchDao {
public void insertMesRecyclablePackageBindingLogLimit(List<MesRecyclablePackageBindingLog> logList, String organizeCode) {
String fieldStr = "`id`,`create_date_time`,`create_user`,`description`,`is_deleted`,`is_valid`,`organize_code`,`remark`,`system_sync_date_time`,`system_sync_status`,`hanger_code`,`hanger_package_sn`,`hanger_rule_code`,`lot_number`,`modify_type`,`order_code`,`package_sn`,`part_name`,`part_no`,`product_sn`,`qty`,`status`,`total_qty`,`type_code`";
String fieldStr = "id,create_date_time,create_user,description,is_deleted,is_valid,organize_code,remark,system_sync_date_time,system_sync_status,hanger_code,hanger_package_sn,hanger_rule_code,lot_number,modify_type,order_code,package_sn,part_name,part_no,product_sn,qty,status,total_qty,type_code";
//拼接字段
StringBuilder fieldBuilder = new StringBuilder();
String[] splitField = fieldStr.split(MesPcnExtConstWords.COMMA);
@ -66,11 +63,9 @@ public class MesInsertBatchDaoImpl implements IMesInsertBatchDao {
if (!StringUtils.isEmpty(mesShardingAppendOrg) && mesShardingAppendOrg.toUpperCase().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.name())) insertStr.append(MesPcnExtConstWords.E_UNDERLINE).append(organizeCode.toLowerCase());
insertStr.append("(").append(fieldStr).append(") VALUES( ");
//sql组装
Map<String, Object> parameterMap = new HashMap<>();
StringBuilder builder = new StringBuilder();
for (int i = MesPcnExtConstWords.ZERO; i < logList.size(); i++) {
Map<String, Object> parameterMap = new LinkedHashMap<>();
int j = MesPcnExtConstWords.ZERO;
builder.append(insertStr).append(fieldBuilder.substring(MesPcnExtConstWords.ZERO, fieldBuilder.lastIndexOf(MesPcnExtConstWords.COMMA) - MesPcnExtConstWords.ONE).replaceAll("%s", String.valueOf(i))).append(" ); ");
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j++]).add(String.valueOf(i)).toString(), snowflakeIdMaker.nextId());
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j++]).add(String.valueOf(i)).toString(), logList.get(i).getCreateDatetime());
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j++]).add(String.valueOf(i)).toString(), logList.get(i).getCreateUser());
@ -95,12 +90,12 @@ public class MesInsertBatchDaoImpl implements IMesInsertBatchDao {
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j++]).add(String.valueOf(i)).toString(), logList.get(i).getStatus());
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j++]).add(String.valueOf(i)).toString(), logList.get(i).getTotalQty());
parameterMap.put(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(splitField[j]).add(String.valueOf(i)).toString(), logList.get(i).getTypeCode());
Query queryObject = entityManager.createNativeQuery(insertStr + fieldBuilder.substring(MesPcnExtConstWords.ZERO, fieldBuilder.lastIndexOf(MesPcnExtConstWords.COMMA) - MesPcnExtConstWords.ONE).replaceAll("%s", String.valueOf(i)) + " ); ");
//数据填充
for (String key : parameterMap.keySet()) {
queryObject.setParameter(key, parameterMap.get(key));
}
queryObject.executeUpdate();
}
Query queryObject = entityManager.createNativeQuery(builder.toString());
//数据填充
for (String key : parameterMap.keySet()) {
queryObject.setParameter(key, parameterMap.get(key));
}
queryObject.executeUpdate();
}
}

@ -8,6 +8,7 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.persistence.EntityManager;
import javax.persistence.Query;
@ -31,12 +32,15 @@ public class MesProductionRecordImpl implements IMesProductionRecordDao {
private EntityManager entityManager;
@Override
public List<MesProductionRecord> findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize) {
public List<MesProductionRecord> findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize, List<String> workCenterList) {
StringBuilder hql = new StringBuilder();
hql.append(" select record from MesProductionRecord record left join MesWorkCenter center on record.workCenterCode = center.workCenterCode where 1=1");
hql.append(" and record.organizeCode = :organizeCode and record.isValid = :isValid and record.isDeleted = :isDeleted ");
hql.append(" and center.organizeCode = :organizeCode and center.isValid = :isValid and center.isDeleted = :isDeleted ");
hql.append(" and center.centerType = :centerType and record.reportStatus in (:reportStatus) and record.reportType != :reportType ");
if (!CollectionUtils.isEmpty(workCenterList)) {
hql.append(" and record.workCenterCode not in (:workCenterList)");
}
hql.append(" order by record.reportStatus asc,record.createDatetime asc ");
Query hqlQuery = entityManager.createQuery(hql.toString(), MesProductionRecord.class);
hqlQuery.setParameter("organizeCode", organizeCode);
@ -45,6 +49,9 @@ public class MesProductionRecordImpl implements IMesProductionRecordDao {
hqlQuery.setParameter("centerType", workOrderType);
hqlQuery.setParameter("reportType", MesExtEnumUtil.MES_REPORT_TYPE.NO_REPORT.getValue());
hqlQuery.setParameter("reportStatus", Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()));
if (!CollectionUtils.isEmpty(workCenterList)) {
hqlQuery.setParameter("workCenterList",workCenterList);
}
hqlQuery.setFirstResult(MesPcnExtConstWords.ZERO).setMaxResults(Objects.isNull(pageSize) ? MesPcnExtConstWords.ONE_HUNDRED : pageSize);
return hqlQuery.getResultList();
}

@ -0,0 +1,78 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesOffLineDataSyncJobService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StopWatch;
import java.net.InetAddress;
/**
* @Author: Wynne.Lu
* @CreateDate: 2019/12/17 1:18
* @Description:
**/
@Slf4j
@ApiOperation("MES同步离线数据JOB")
@DisallowConcurrentExecution
public class MesOffLineDataSyncJob implements Job {
@Autowired
private IMesOffLineDataSyncJobService offLineDataSyncJobService;
public MesOffLineDataSyncJob() {}
@Override
public void execute(JobExecutionContext jobExecutionContext) {
log.info("MES同步离线数据JOB --- START ---");
StopWatch stopWatch = new StopWatch();
stopWatch.start();
try {
Object param = jobExecutionContext.getJobDetail().getJobDataMap().get("param");
if (null == param) {
log.info("MES同步离线数据JOB --- ERROR --- 未配置参数 ---");
return;
}
String[] params = param.toString().split(MesPcnExtConstWords.COLON);
if (null == params || params.length != 4) {
log.info("MES同步离线数据JOB --- ERROR --- 参数配置错误,参数正确格式[ mes.offline.sync.pcnTask.taskParam = 工厂:区域:生产线:工位 ] ---");
return;
}
MesPcnSyncOfflineLog pcnSyncOfflineLog = new MesPcnSyncOfflineLog(params[0], params[1], params[2], params[3]);
pcnSyncOfflineLog.setSyncTarget(InetAddress.getLocalHost().getHostAddress());
String success = offLineDataSyncJobService.doOffLineDataSync(pcnSyncOfflineLog);
log.info("MES同步离线数据JOB --- EXEC --- {} ---", success);
} catch (Exception e) {
log.info("MES同步离线数据JOB --- ERROR --- {} ---", JSONObject.toJSONString(e));
} finally {
stopWatch.stop();
log.info("MES同步离线数据JOB --- END --- 耗时:{} ms ---", stopWatch.getTotalTimeMillis());
}
}
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.model.wms.WmsJobParamModel;
import cn.estsh.impp.framework.boot.init.ApplicationProperties;
@ -24,14 +25,14 @@ import java.util.List;
@Slf4j
@DisallowConcurrentExecution
@Component
@ApiOperation("排序报工job")
public class MesReportSortJob extends BaseMesScheduleJob {
@ApiOperation("MES汇报报工job")
public class MesProductReportJob extends BaseMesScheduleJob {
@Autowired
private IMesWorkOrderService workOrderService;
public MesReportSortJob() {
super(MesReportSortJob.class, "排序报工job");
public MesProductReportJob() {
super(MesProductReportJob.class, "MES汇报报工job");
}
@Override
@ -39,14 +40,24 @@ public class MesReportSortJob extends BaseMesScheduleJob {
List<WmsJobParamModel> wmsJobParamModelList = JsonUtilTool.toList(this.getJobParam(), WmsJobParamModel.class);
if (!CollectionUtils.isEmpty(wmsJobParamModelList)) {
for (WmsJobParamModel wmsJobParamModel : wmsJobParamModelList) {
//排序汇报
try {
long startTime = System.currentTimeMillis();
workOrderService.doMesWorkOrderSortReport(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), "job");
workOrderService.doMesWorkOrderSortReport(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), MesPcnExtConstWords.JOB);
long endTime = System.currentTimeMillis();
log.info("工厂{}排序报工job --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime);
} catch (Exception e) {
log.info("工厂{}排序报工job 执行失败{}", wmsJobParamModel.getOrganizeCode(), e);
}
//非排序汇报
try {
long startTime = System.currentTimeMillis();
workOrderService.doMesWorkOrderNoSortReport(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), MesPcnExtConstWords.JOB);
long endTime = System.currentTimeMillis();
log.info("工厂{}非排序报工JOB --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime);
} catch (Exception e) {
log.info("工厂{}非排序报工JOB 执行失败{}", wmsJobParamModel.getOrganizeCode(), e);
}
}
}else{
log.info("排序报工job 参数不能为空");

@ -1,10 +1,11 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdShiftRecordService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
@ -13,12 +14,16 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.repository.MesConfigRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesDowntimeRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProdShiftRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
@ -37,16 +42,19 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
@Autowired
private MesProdShiftRecordRepository mesProdShiftRecordRDao;
@Autowired
private MesConfigRepository configRepository;
@Autowired
private MesDowntimeRecordRepository mesDowntimeRecordRDao;
@Autowired
private MesEquipmentRepository mesEquipmentRDao;
@Autowired
private MesWcEquipmentRepository wcEquipmentRepository;
@Autowired
private IMesEquipmentExtService mesEquipmentExtService;
@Override
public ListPager<MesProdShiftRecord> queryMesProdShiftRecordByPager(MesProdShiftRecord bean, Pager pager) {
@ -84,7 +92,7 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
.build();
}
ConvertBean.serviceModelInitialize(item, AuthUtil.getSessionUser().getUserName());
mesProdShiftRecordRDao.save(item);
mesProdShiftRecordRDao.insert(item);
}
@Override
@ -108,8 +116,9 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
mesProdShiftRecord.setShiftGroup(item.getShiftGroup());
mesProdShiftRecord.setShiftCode(item.getShiftCode());
mesProdShiftRecord.setEndTime(item.getEndTime());
mesProdShiftRecord.setWorkStatus(item.getWorkStatus());
ConvertBean.serviceModelUpdate(mesProdShiftRecord, AuthUtil.getSessionUser().getUserName());
mesProdShiftRecordRDao.save(mesProdShiftRecord);
mesProdShiftRecordRDao.update(mesProdShiftRecord);
//结班后, 系统生产一条停机记录,原因:无订单停机
MesConfig reasonCfg = configRepository.getByProperty(
new String[]{"cfgKey", "organizeCode", "isValid", "isDeleted"},
@ -129,16 +138,12 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
List<MesWcEquipment> wcEquipmentDbList = wcEquipmentRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), item.getWorkCenterCode()});
if (CollectionUtils.isEmpty(wcEquipmentDbList)) {
MesPcnException.throwMesBusiException("产线【%s】工位设备信息不存在", item.getWorkCenterCode());
}
for (MesWcEquipment mesWcEquipment : wcEquipmentDbList) {
MesEquipment mesEquipment = mesEquipmentRDao.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesPcnExtConstWords.EQUIPMENT_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID},
new Object[]{organizeCode, mesWcEquipment.getEquipmentCode(),
CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(),
CommonEnumUtil.IS_VAILD.VAILD.getValue()});
DdlPackBean ddlPackBeanDowntime = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesEquipment.getEquipmentCode(), "equipmentCode", ddlPackBeanDowntime);
DdlPreparedPack.getStringEqualPack(mesWcEquipment.getEquipmentCode(), "equipmentCode", ddlPackBeanDowntime);
if (!StringUtil.isEmpty(reason)) {
DdlPreparedPack.getStringEqualPack(reason, "reasonCode", ddlPackBeanDowntime);
}
@ -146,7 +151,11 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
DdlPreparedPack.getStringEqualPack(type, "reasonTypeCode", ddlPackBeanDowntime);
}
MesDowntimeRecord mesDowntimeRecordDao = mesDowntimeRecordRDao.getByProperty(ddlPackBeanDowntime);
if (StringUtil.isEmpty(mesDowntimeRecordDao)) {
if (Objects.isNull(mesDowntimeRecordDao)) {
MesEquipment mesEquipment = mesEquipmentExtService.getMesEquipment(organizeCode, mesWcEquipment.getEquipmentCode());
if (Objects.isNull(mesEquipment)) {
MesPcnException.throwMesBusiException("设备【%s】信息不存在", mesWcEquipment.getEquipmentCode());
}
//新增设备停机记录
MesDowntimeRecord mesDowntimeRecord = new MesDowntimeRecord();
mesDowntimeRecord.setOrganizeCode(organizeCode);

@ -386,7 +386,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
new Object[]{userName, TimeTool.getNowTime(true),sn.getProductSn(),sn.getDescription()},packBean);
//更新返工记录
packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn.getProductSn(),"sn",packBean);
DdlPreparedPack.getStringEqualPack(requestModel.getSn(),"sn",packBean);
DdlPreparedPack.getStringEqualPack(sn.getPartNo(),"partNo",packBean);
mesReworkTaskRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime","sn","description"},
new Object[]{userName, TimeTool.getNowTime(true),sn.getProductSn(),sn.getDescription()},packBean);

@ -266,8 +266,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
}
private List<MesPackingDefineDetails> getMesPackingDefineDetails(String organizeCode, String packCode) {
DdlPackBean ddlPackBean;
ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packCode, "packCode", ddlPackBean);
List<MesPackingDefineDetails> defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(defineDetails)) {

@ -243,7 +243,7 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
" AND EXISTS (select 1 from MesPullingOrderInfo po where po.organizeCode = '"+ bean.getOrganizeCode() +"' and po.pullingOrderNo = model.pullingOrderNo" +
" and po.pullOrderType=20 and po.workCenterCode ='" + bean.getWorkCenterCode() + "' ";
packBean.setWhereAppend(append + " )");
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"status", "pullingOrderNo"}, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"pullingOrderNo"}, packBean);
pager = PagerHelper.getPager(pager, mesPullingOrderPartInfoRepository.findByHqlWhereCount(packBean));

@ -206,7 +206,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
//查询发运单信息 发运跳过
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(shippingOrderManagement.getShippingCode(), "shippingCode", orderManagementPackBean);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderManagementPackBean);
// DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderManagementPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (StringUtils.isEmpty(orderManagement)) {
throw new ImppBusiException(String.format("【%s】此发运单不存在请检查数据", shippingOrderManagement.getShippingCode()));
@ -247,15 +247,17 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", orderManagementPackBean);
DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PRINTED.getValue()).collect(Collectors.toList()), "status", orderManagementPackBean);
if (shippingOrderManagementRepository.isExitByHql(orderManagementPackBean)) {
DdlPreparedPack.getOrderBy("seq", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), orderManagementPackBean);
MesShippingOrderManagement shippingOrder = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (!Objects.isNull(shippingOrder)) {
//1强过
if ((!Objects.isNull(shippingOrderManagement.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE, shippingOrderManagement.getIsPass()))) {
orderManagement.setRemark(MesPcnExtConstWords.STRONGER_PASS);
ConvertBean.serviceModelUpdate(orderManagement, shippingOrderManagement.getModifyUser());
vehiclesOrderRepository.update(orderManagement);
} else {
throw new ImppBusiException(String.format("【%s】发运单对应排序【%s】前存在未扫描发运的发运单,请检查数据!",
orderManagement.getShippingCode(), orderManagement.getSeq()));
throw new ImppBusiException(String.format("【%s】发运单对应排序【%s】前存在未扫描发运的发运单【%s】序号【%s】,请检查数据!",
orderManagement.getShippingCode(), orderManagement.getSeq(),shippingOrder.getShippingCode(),shippingOrder.getSeq()));
}
}
}

@ -1080,6 +1080,38 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
}
@Override
public void doMesWorkOrderNoSortReport(String organizeCode, Integer pageSize, String userName) {
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER");
//查询所有非排序工单
List<MesProductionRecord> recordNoReportList = mesProductionRecordDao.findMesProductionRecordNoReport(organizeCode, MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue(), pageSize, !StringUtils.isEmpty(workCenterCodes) ? Arrays.asList(workCenterCodes.split(",")) : null);
if (CollectionUtils.isEmpty(recordNoReportList)) {
LOGGER.error("非排序加工单加工记录中没有数据,无需处理");
return;
}
List<MesProductionRecord> recordNoReportNotHasOrderNoList = recordNoReportList.stream().filter(item -> StringUtils.isEmpty(item.getWorkOrderNo())).collect(Collectors.toList());
List<MesProductionRecord> recordNoReportHasOrderNoList = recordNoReportList.stream().filter(item -> !StringUtils.isEmpty(item.getWorkOrderNo())).collect(Collectors.toList());
//处理无工单加工记录
if(!CollectionUtils.isEmpty(recordNoReportNotHasOrderNoList)){
for (MesProductionRecord mesProductionRecord : recordNoReportNotHasOrderNoList) {
LOGGER.info("----------处理无工单加工记录报工开始-------{}", mesProductionRecord.getProductSn());
doProductReportByRecord(mesProductionRecord, organizeCode, userName);
LOGGER.info("----------处理无工单加工记录报工结束-------{}", mesProductionRecord.getProductSn());
}
}
//处理有工单加工记录
if(!CollectionUtils.isEmpty(recordNoReportHasOrderNoList)){
try {
for (MesProductionRecord mesProductionRecord : recordNoReportHasOrderNoList) {
LOGGER.info("----------处理有工单加工记录报工开始-------{}", mesProductionRecord.getProductSn());
doProductHasOrderReportByRecord(mesProductionRecord, organizeCode, userName);
LOGGER.info("----------处理有工单加工记录报工结束-------{}", mesProductionRecord.getProductSn());
}
} catch (ImppBusiException e) {
}
}
}
private MesProductVersion getProductVersion(String organizeCode,String partNo,String productVersion) {
MesProductVersion mesProductVersion = mesProductVersionService.getMesProductVersion(organizeCode,partNo,productVersion);
if (null == mesProductVersion) {
@ -1317,7 +1349,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
}
public MesWorkOrderSortReportModel initMesWorkOrderSortReportModel(String organizeCode, Integer pageSize, String userName) {
MesWorkOrderSortReportModel model = new MesWorkOrderSortReportModel(organizeCode, userName, mesProductionRecordDao.findMesProductionRecordNoReport(organizeCode, MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue(), pageSize));
MesWorkOrderSortReportModel model = new MesWorkOrderSortReportModel(organizeCode, userName, mesProductionRecordDao.findMesProductionRecordNoReport(organizeCode, MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue(), pageSize,null));
model.setMesWorkOrderList(workOrderExtService.getWorkOrderList(organizeCode, model.getWorkOrderList()));
model.setMesMoveRuleList(mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(model.getPartProdGroupCodeList(), organizeCode));
model.setMesWorkOrderPartList(findMesWorkOrderPartByOrderNo(organizeCode, model.getWorkOrderList()));

@ -5,7 +5,6 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.aspect.MonitorLog;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.IMesShippingScanStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
@ -30,8 +29,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.Comparator;
import java.util.Objects;
import java.util.Optional;
import java.util.StringJoiner;
/**
* @Description :
@ -91,7 +92,7 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
String partNo = getPartNo(model, workOrder);
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(partNo) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
if (detail.getCustPartNo().equals(partNo) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
//校验发运明细
checkShippingDetails(model, orderManagement, shippingGroup, partNo, detail);
detail.setBarcode(model.getSn());
@ -118,7 +119,7 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
//校验条码是否已经扫描
checkIsScan(model);
//如果扫描的是条码,校验条码
return checkSn(model).getPartNo();
return checkSn(model).getCustPartNo();
}else{
//校验目视单是否已经扫描
checkVisualOrderNoIsScan(model);
@ -126,7 +127,7 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
if (MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue() != workOrder.getWorkOrderStatus() || MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != workOrder.getQcStatus()) {
throw new ImppBusiException(String.format("目视单【%s】状态为【%s】质量状态为【%s】不允许发运", model.getSn(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(workOrder.getQcStatus())));
}
return workOrder.getPartNo();
return workOrder.getCustPartNo();
}
}
@ -144,8 +145,8 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
throw new ImppBusiException(String.format("目视单【%s】条码【%s】与扫描条码【%s】不匹配", detail.getVisualOrderNo(), workOrder.getCustSn(), produceSn.getCustSn()));
}
//校验零件是否匹配
if (!Objects.equals(produceSn.getPartNo(), workOrder.getPartNo())) {
throw new ImppBusiException(String.format("目视单【%s】零件【%s】与发运单零件【%s】不匹配", detail.getVisualOrderNo(), workOrder.getPartNo(), detail.getPartNo()));
if (!Objects.equals(produceSn.getCustPartNo(), workOrder.getCustPartNo())) {
throw new ImppBusiException(String.format("目视单【%s】零件【%s】与发运单零件【%s】不匹配", detail.getVisualOrderNo(), workOrder.getCustPartNo(), detail.getCustPartNo()));
}
return workOrder;
}
@ -162,7 +163,7 @@ public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippin
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER))
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getPartNo);
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getCustPartNo);
//若扫描的不是最小顺序 则报错
if (minPartNo.isPresent() && !minPartNo.get().equals(partNo)) {
throw new ImppBusiException(String.format("【%s】此条码扫描顺序错误请检查数据", model.getSn()));

@ -0,0 +1,218 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.job;
import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesOffLineDataSyncJobService;
import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesOffLineDataSyncService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.config.MesOffLineConfig;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.PcnJobService;
import cn.estsh.i3plus.mes.pcn.util.BsJdbcTemplate;
import cn.estsh.i3plus.mes.pcn.util.BsJdbcTemplateConfig;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.mes.bean.MesDatasource;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnTask;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
@Slf4j
@Primary
@Service
public class MesOffLineDataSyncJobService extends PcnJobService implements IMesOffLineDataSyncJobService {
private MesOffLineConfig offLineConfig;
private BsJdbcTemplateConfig jdbcTemplateConfig;
@Autowired
private IMesOffLineDataSyncService offLineDataSyncService;
@Override
public List<MesPcnTask> loadJobs(Boolean pcnScheduleJob, Boolean mesOffLineSyncOpen) {
List<MesPcnTask> list = super.loadJobs(pcnScheduleJob, mesOffLineSyncOpen);
if (!mesOffLineSyncOpen) return list;
try {
offLineConfig = (MesOffLineConfig) SpringContextsUtil.getBean("mesOffLineConfig");
jdbcTemplateConfig = (BsJdbcTemplateConfig) SpringContextsUtil.getBean("bsJdbcTemplateConfig");
list.add(offLineConfig.getPcnTask());
} catch (Exception e) {
}
return list;
}
@Override
public String doOffLineDataSync(MesPcnSyncOfflineLog pcnSyncOfflineLog) {
if (null == offLineConfig) offLineConfig = (MesOffLineConfig) SpringContextsUtil.getBean("mesOffLineConfig");
if (null == offLineConfig) return "MesOffLineConfig IS NULL";
MesDatasource datasource = offLineConfig.getDataSource();
pcnSyncOfflineLog.setSyncSource(String.format("mysql://%s:%s/%s", datasource.getDsHost(), datasource.getDsPort(), datasource.getDsDbName()));
pcnSyncOfflineLog.setSyncPattern("全量同步");
pcnSyncOfflineLog.setSyncDate(TimeTool.getToday());
ConvertBean.serviceModelInitialize(pcnSyncOfflineLog, MesPcnExtConstWords.JOB);
pcnSyncOfflineLog.setSystemSyncDatetime(pcnSyncOfflineLog.getModifyDatetime());
String error = checkDataSourceIsValid(datasource);
if (!StringUtils.isEmpty(error)) return error;
Map<String, String> sqlMap = offLineConfig.getSql();
Map<String, String> sqlParameterMap = offLineConfig.getSqlParameter();
if (CollectionUtils.isEmpty(sqlMap) || CollectionUtils.isEmpty(sqlParameterMap)) return "SQL CFG IS NULL";
List<MesPcnSyncOfflineLog> pcnSyncOfflineLogList = offLineDataSyncService.getPcnSyncOfflineLogList(pcnSyncOfflineLog.getOrganizeCode());
List<String> successedList = offLineDataSyncService.filterPcnSyncOfflineLogList(pcnSyncOfflineLogList, true);
if (!CollectionUtils.isEmpty(successedList) && successedList.containsAll(sqlMap.keySet())) return String.format("%s已同步成功,无需重复执行!", sqlMap.keySet().toString());
Map<String, String> failuredMap = offLineDataSyncService.filterFaulurePcnSyncOfflineLog(pcnSyncOfflineLogList);
if (null == jdbcTemplateConfig) jdbcTemplateConfig = (BsJdbcTemplateConfig) SpringContextsUtil.getBean("bsJdbcTemplateConfig");
BsJdbcTemplate bsJdbcTemplate = null != jdbcTemplateConfig ? jdbcTemplateConfig.getJdbcTemplate(datasource) : null;
Boolean isConn = null != jdbcTemplateConfig ? jdbcTemplateConfig.checkDbConn(datasource) : false;
String tableName;
Boolean success = true;
List<String> successTableNameList = new ArrayList<>();
List<String> failureTableNameList = new ArrayList<>();
for (String objectCode : sqlMap.keySet()) {
if (StringUtils.isEmpty(objectCode)) continue;
if (!objectCode.contains(MesPcnExtConstWords.DECIMAL_POINT)) {
tableName = objectCode;
} else {
//如果pojo在 DEFAULT_POJO_ROUTE 下面还有包, 配置的时候需带上除去 DEFAULT_POJO_ROUTE 以外的包
String[] suffix = objectCode.split(MesPcnExtConstWords.DECIMAL_POINT_ESCAPE);
tableName = suffix[suffix.length - 1];
}
if (!CollectionUtils.isEmpty(successedList) && successedList.contains(tableName)) continue;
Boolean status = false;
String remark = null;
try {
String sql = sqlMap.get(objectCode);
if (StringUtils.isEmpty(sql)) {
remark = "SQL IS NULL";
continue;
}
if (null == jdbcTemplateConfig) {
remark = "BsJdbcTemplateConfig IS NULL";
continue;
}
if (null == bsJdbcTemplate) {
remark = "BsJdbcTemplate IS NULL";
continue;
}
if (!isConn) {
remark = "checkDbConn IS FALSE";
continue;
}
Map<String, Object> paramMap = new HashMap<>();
for (Map.Entry<String, String> sqlParameter : sqlParameterMap.entrySet()) {
if (null == sqlParameter || StringUtils.isEmpty(sqlParameter.getValue())) continue;
if (!sql.contains(MesPcnExtConstWords.COLON + sqlParameter.getKey())) continue;
if (sqlParameter.getKey().contains("_int")) paramMap.put(sqlParameter.getKey(), Integer.valueOf(sqlParameter.getValue()));
else if (sqlParameter.getKey().contains("_list")) paramMap.put(sqlParameter.getKey(), Arrays.asList(sqlParameter.getValue().split(MesPcnExtConstWords.COMMA)));
// TODO else if
else paramMap.put(sqlParameter.getKey(), sqlParameter.getValue());
}
List<Map<String, Object>> resultList = bsJdbcTemplate.getJdbcTemplate().queryForList(sql, paramMap);
if (CollectionUtils.isEmpty(resultList)) remark = "未查询到数据";
else {
offLineDataSyncService.insertBaseBeanData(pcnSyncOfflineLog, resultList, objectCode, tableName);
successTableNameList.add(tableName);
status = true;
}
} catch (Exception e) {
remark = e.toString();
success = false;
log.info("MES同步离线数据JOB --- ERROR --- {} ---", JSONObject.toJSONString(e));
} finally {
if (!status) {
insertPcnSyncOfflineLog2Failure(pcnSyncOfflineLog, tableName, failuredMap, remark);
failureTableNameList.add(String.format("[%s]同步失败原因[%s]", tableName, remark));
success = false;
}
}
}
if (!CollectionUtils.isEmpty(successTableNameList) && success) {
StringBuilder builder = new StringBuilder();
builder.append(" insert into mes_pcn_sync_offline_log ");
builder.append("( id, organize_code, is_valid, is_deleted, create_user, create_date_time, modify_user, modify_date_time, system_sync_date_time, system_sync_status,");
builder.append(" area_code, work_center_code, work_cell_code, object_code, effect_num, sync_date, sync_pattern, sync_source, sync_target, sync_result )");
builder.append(" values ( :id , :organizeCode , :isValid , :isDeleted , :createUser , :createDatetime , :modifyUser , :modifyDatetime , :systemSyncDatetime , :systemSyncStatus ,");
builder.append(" :areaCode , :workCenterCode , :workCellCode , :objectCode , :effectNum , :syncDate , :syncPattern , :syncSource , :syncTarget , :syncResult ); ");
Map<String, Object> paramMap = JSONObject.parseObject(JSONObject.toJSONString(pcnSyncOfflineLog), Map.class);
paramMap.put(MesPcnExtConstWords.OBJECT_CODE, sqlMap.keySet().toString());
paramMap.put(MesPcnExtConstWords.EFFECT_NUM, MesPcnExtConstWords.ZERO);
bsJdbcTemplate.getJdbcTemplate().update(builder.toString(), paramMap);
}
return (CollectionUtils.isEmpty(successTableNameList) ? MesPcnExtConstWords.EMPTY : String.format("%s同步成功!", successTableNameList.toString())) +
(CollectionUtils.isEmpty(failureTableNameList) ? MesPcnExtConstWords.EMPTY : failureTableNameList.toString());
}
private String checkDataSourceIsValid(MesDatasource datasource) {
if (null == datasource) return "MesDatasource IS NULL";
if (StringUtils.isEmpty(datasource.getDsCode())) return "离线边端数据库[dsCode]未配置!";
if (StringUtils.isEmpty(datasource.getDsName())) return "离线边端数据库[dsName]未配置!";
if (StringUtils.isEmpty(datasource.getDsType())) return "离线边端数据库[dsType]未配置!";
if (StringUtils.isEmpty(datasource.getDsHost())) return "离线边端数据库[dsHost]未配置!";
if (StringUtils.isEmpty(datasource.getDsPort())) return "离线边端数据库[dsHostPort]未配置!";
if (StringUtils.isEmpty(datasource.getDsUser())) return "离线边端数据库[dsUser]未配置!";
if (StringUtils.isEmpty(datasource.getDsPassword())) return "离线边端数据库[dsPassword]未配置!";
if (StringUtils.isEmpty(datasource.getDsDbName())) return "离线边端数据库[dsDbName]未配置!";
return null;
}
private void insertPcnSyncOfflineLog2Failure(MesPcnSyncOfflineLog pcnSyncOfflineLog, String objectCode, Map<String, String> failuredMap, String remark) {
if (!CollectionUtils.isEmpty(failuredMap) && failuredMap.containsKey(objectCode) && failuredMap.get(objectCode).equals(remark)) return;
offLineDataSyncService.insertPcnSyncOfflineLog(pcnSyncOfflineLog.syncResult(MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_FAILURE.getValue()).remark(remark), objectCode);
}
}

@ -0,0 +1,136 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.job;
import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesOffLineDataSyncService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.platform.common.tool.ReflectTool;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.BaseBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPcnSyncOfflineLog;
import cn.estsh.i3plus.pojo.mes.repository.MesPcnSyncOfflineLogRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.persistence.Column;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MesOffLineDataSyncService implements IMesOffLineDataSyncService {
@Autowired
private MesPcnSyncOfflineLogRepository pcnSyncOfflineLogRepository;
private static String DEFAULT_POJO_ROUTE = "cn.estsh.i3plus.pojo.mes.bean.";
@Override
public List<MesPcnSyncOfflineLog> getPcnSyncOfflineLogList(String organizeCode) {
return pcnSyncOfflineLogRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.SYNC_DATE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), TimeTool.getToday()});
}
@Override
public List<String> filterPcnSyncOfflineLogList(List<MesPcnSyncOfflineLog> pcnSyncOfflineLogList, Boolean flag) {
return CollectionUtils.isEmpty(pcnSyncOfflineLogList) ? null : pcnSyncOfflineLogList.stream().filter(o -> (
null != o && o.getSyncResult().compareTo(MesExtEnumUtil.MES_LOG_DEAL_STATUS.getValueByFlag(flag)) == 0)).map(MesPcnSyncOfflineLog::getObjectCode).collect(Collectors.toList());
}
@Override
public Map<String, String> filterFaulurePcnSyncOfflineLog(List<MesPcnSyncOfflineLog> pcnSyncOfflineLogList) {
List<MesPcnSyncOfflineLog> filterList = CollectionUtils.isEmpty(pcnSyncOfflineLogList) ? null :
pcnSyncOfflineLogList.stream().filter(o -> (null != o && o.getSyncResult().compareTo(MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_FAILURE.getValue()) == 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) return null;
filterList = filterList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPcnSyncOfflineLog::getCreateDatetime).reversed()).collect(Collectors.toList());
filterList = filterList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesPcnSyncOfflineLog::getObjectCode))), ArrayList::new));
return filterList.stream().filter(o -> null != o).collect(Collectors.toMap(MesPcnSyncOfflineLog::getObjectCode, MesPcnSyncOfflineLog::getRemark));
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
public MesPcnSyncOfflineLog insertPcnSyncOfflineLog(MesPcnSyncOfflineLog pcnSyncOfflineLog, String tableName) {
pcnSyncOfflineLog.setObjectCode(tableName);
pcnSyncOfflineLog.setId(null);
pcnSyncOfflineLog = pcnSyncOfflineLogRepository.insert(pcnSyncOfflineLog);
log.info("MES同步离线数据JOB --- EXEC --- TABLE_NAME: {} --- {} ---", tableName, JSONObject.toJSONString(pcnSyncOfflineLog));
return pcnSyncOfflineLog;
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
public void insertBaseBeanData(MesPcnSyncOfflineLog pcnSyncOfflineLog, List<Map<String, Object>> resultList, String objectCode, String tableName) throws Exception {
String daoName = StringUtil.lineToHump(tableName);
String pojoName = StringUtil.toUpperCaseFirst(daoName);
String pojoRoute = DEFAULT_POJO_ROUTE + (!objectCode.contains(MesPcnExtConstWords.DECIMAL_POINT) ? pojoName : objectCode.replace(tableName, pojoName));
BaseRepository baseRepository = (BaseRepository) SpringContextsUtil.getBean(daoName + MesPcnExtConstWords.Repository);
List<BaseBean> historyList = baseRepository.findAll();
Map<Long, BaseBean> historyMap = CollectionUtils.isEmpty(historyList) ? null : historyList.stream().filter(o -> null != o).collect(Collectors.toMap(BaseBean::getId, o -> o));
Class clazz = Class.forName(pojoRoute);
Field[] fields = ArrayUtils.addAll(clazz.getFields(), clazz.getDeclaredFields());
String fieldName;
for (Map<String, Object> map : resultList) {
BaseBean baseBean = (BaseBean) clazz.newInstance();
for (Field field : fields) {
if (null == field) continue;
Column column = field.getAnnotation(Column.class);
if (null == column) continue;
fieldName = column.name().toLowerCase();
if (!map.containsKey(fieldName)) continue;
ReflectTool.setFieldValue(baseBean, field, map.get(fieldName));
}
baseBean.setSystemSyncDatetime(pcnSyncOfflineLog.getSystemSyncDatetime());
if (!CollectionUtils.isEmpty(historyMap) && historyMap.containsKey(baseBean.getId())) {
baseRepository.updateNoSync(baseBean);
historyMap.remove(baseBean.getId());
} else {
baseRepository.insert(baseBean);
}
}
historyList = CollectionUtils.isEmpty(historyMap) ? null :
historyMap.values().stream().filter(o -> (null != o && o.getIsDeleted().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(historyList)) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(pcnSyncOfflineLog.getOrganizeCode());
DdlPreparedPack.getInPackList(historyList.stream().filter(o -> null != o).map(BaseBean::getId).collect(Collectors.toList()), MesPcnExtConstWords.ID, packBean);
baseRepository.updateByProperties(MesPcnExtConstWords.IS_DELETED, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), packBean);
}
insertPcnSyncOfflineLog(pcnSyncOfflineLog.syncResult(MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_SUCCESS.getValue()).effectNum(CollectionUtils.isEmpty(resultList) ? 0 : resultList.size()).remark(null), tableName);
}
}

@ -65,7 +65,7 @@ public class AssemblyVisualListPrintStrategy implements IPrintTemplateStrategySe
// vinCode
resultMap.put(MesPcnExtConstWords.VIN_CODE, workOrder.getVinCode());
// vinCode 后四位
resultMap.put(MesPcnExtConstWords.VIN_CODE_AFTER_FOUR, workOrder.getVinCode());
resultMap.put(MesPcnExtConstWords.VIN_CODE_AFTER_FOUR, !StringUtils.isEmpty(workOrder.getVinCode()) && workOrder.getVinCode().length() > MesPcnExtConstWords.FOUR ? workOrder.getVinCode().substring(workOrder.getVinCode().length() - MesPcnExtConstWords.FOUR) : workOrder.getVinCode());
// 总成零件号
resultMap.put(MesPcnExtConstWords.PART_NO, workOrder.getPartNo());
// 工单标识

@ -7,8 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -27,9 +25,6 @@ import java.util.stream.Collectors;
@Service
public class MesNumberRuleMatchSnService implements IMesNumberRuleMatchDispatchService {
private static final Logger LOGGER = LoggerFactory.getLogger(MesNumberRuleMatchSnService.class);
@Autowired
private IMesProduceSnExtService produceSnExtService;
@ -45,7 +40,7 @@ public class MesNumberRuleMatchSnService implements IMesNumberRuleMatchDispatchS
}
//验证是否离线
MesProductionAssemblyContext context = (MesProductionAssemblyContext) params[0];
MesProductionAssemblyContext context = (MesProductionAssemblyContext) params[0];
if (context.getIsClosedCheck()) return result;
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(organizeCode, sn);
@ -74,13 +69,12 @@ public class MesNumberRuleMatchSnService implements IMesNumberRuleMatchDispatchS
}
//创建/已完成/已拆解都可以被装配
if (produceSn.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) != 0 &&
produceSn.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()) != 0 && produceSn.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue()) != 0) {
if (!MesExtEnumUtil.PRODUCE_SN_STATUS.checkAllowAssembly(produceSn.getSnStatus())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息条码状态[%s]!", sn, MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus())));
return result;
}
if (!((MesProductionAssemblyContext) params[0]).getAssemblyPartNo().equals(produceSn.getPartNo())) {
if (!context.getAssemblyPartNo().equals(produceSn.getPartNo())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息零件号[%s]!", sn, produceSn.getPartNo()));
return result;
}

@ -0,0 +1,122 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch;
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.pojo.context.MesProductionAssemblyContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
*
*/
@Slf4j
@Service
public class MesNumberRuleMatchSortDoubleCheckService implements IMesNumberRuleMatchDispatchService {
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private IMesAssemblyExtService assemblyExtService;
@Override
public Map<String, Object> matchNumberRule(String organizeCode, String sn, Object... params) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, true);
if (!MesProductionAssemblySortContext.class.isAssignableFrom(params[0].getClass())) {
result.put(MesPcnExtConstWords.RESULT, false);
result.put(MesPcnExtConstWords.MESSAGE, "参数匹配规则信息不是排序线装配件匹配规则!");
return result;
}
//验证是否离线
MesProductionAssemblySortContext context = (MesProductionAssemblySortContext) params[0];
//校验正则表达式
if (!StringUtils.isEmpty(context.getMatchRule())) {
result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass())).matchNumberRule(organizeCode, sn, params);
if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) return result;
}
if (context.getIsClosedCheck()) return result;
result.put(MesPcnExtConstWords.RESULT, false);
//验证零件号
if (!StringUtils.isEmpty(context.getAssemblyPartNo())) {
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(organizeCode, sn);
if (CollectionUtils.isEmpty(produceSnList)) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息不存在!", sn));
return result;
}
List<MesProduceSn> standardList = produceSnList.stream()
.filter(o -> (null != o && !StringUtils.isEmpty(o.getSnStatus()) && o.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()) != 0))
.sorted(Comparator.comparing(MesProduceSn::getCreateDatetime).reversed()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(standardList)) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息状态[未知]!", sn));
return result;
}
MesProduceSn produceSn = standardList.get(0);
if (StringUtils.isEmpty(produceSn.getSnStatus()) || StringUtils.isEmpty(produceSn.getQcStatus()) || StringUtils.isEmpty(produceSn.getPartNo())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息异常:状态[%s]质量[%s]零件号[%s]!", sn, produceSn.getSnStatus(), produceSn.getQcStatus(), produceSn.getPartNo()));
return result;
}
if (produceSn.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) != 0 && produceSn.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue()) != 0) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息质量状态[%s]!", sn, MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus())));
return result;
}
if (!context.getAssemblyPartNo().equals(produceSn.getPartNo())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息零件号[%s]!", sn, produceSn.getPartNo()));
return result;
}
//非已装配情况下
if (MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue() != produceSn.getSnStatus()) {
//创建/已完成/已拆解都可以被装配
if (MesExtEnumUtil.PRODUCE_SN_STATUS.checkAllowAssembly(produceSn.getSnStatus())) {
((MesProductionAssemblyContext) params[0]).setProductSnId(produceSn.getId());
result.put(MesPcnExtConstWords.RESULT, true);
return result;
} else {
result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息条码状态[%s]!", sn, MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus())));
return result;
}
}
}
//已装配状态或者外协件情况下 --- 自制件:验证绑定的条码是否等于当前工单 外协件:验证绑定的条码是否是当前工单 或者 没有绑定记录
List<MesProductionAssembly> productionAssemblyList = assemblyExtService.getProductionAssemblyList(organizeCode, sn);
Optional<MesProductionAssembly> optional = CollectionUtils.isEmpty(productionAssemblyList) ? null :
productionAssemblyList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue()) == 0)).findFirst();
if (null != optional && optional.isPresent() && !optional.get().getProductSn().equals(context.getWorkOrderNo())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("装配件条码[%s]已被加工单[%s]装配!", sn, optional.get().getProductSn()));
return result;
}
result.put(MesPcnExtConstWords.RESULT, true);
return result;
}
}

@ -7,8 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -23,8 +21,6 @@ import java.util.Map;
@Service
public class MesNumberRuleMatchSortSnGmService implements IMesNumberRuleMatchDispatchService {
private static final Logger LOGGER = LoggerFactory.getLogger(MesNumberRuleMatchSortSnGmService.class);
@Autowired
private IMesCustomerSnTransformService customerSnTransformService;

@ -76,12 +76,6 @@ public class MesFunctionEquDowntimeService extends BaseSwsService implements IFs
DdlPackBean ddlPackBeanDowntime = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesEquipment.getEquipmentCode(), "equipmentCode", ddlPackBeanDowntime);
if (!StringUtil.isEmpty(reason)) {
DdlPreparedPack.getStringEqualPack(reason, "reasonCode", ddlPackBeanDowntime);
}
if (!StringUtil.isEmpty(type)) {
DdlPreparedPack.getStringEqualPack(type, "reasonTypeCode", ddlPackBeanDowntime);
}
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, ddlPackBeanDowntime);
MesDowntimeRecord mesDowntimeRecordDao = mesDowntimeRecordRDao.getByProperty(ddlPackBeanDowntime);
if (!StringUtil.isEmpty(mesDowntimeRecordDao)) {

@ -122,7 +122,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//判断是否按序扫描【离线默认有序】
private Integer getIsCheckBindSeq(MesWorkCell workCell) {
if (mesOffLineOpen) return (null != workCell && !StringUtils.isEmpty(workCell.getIsSeqScan())) ? workCell.getIsSeqScan() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
if (!mesOffLineOpen) return (null != workCell && !StringUtils.isEmpty(workCell.getIsSeqScan())) ? workCell.getIsSeqScan() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
return CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
}

@ -0,0 +1,35 @@
##\u79BB\u7EBF\u5F00\u5173
mes.offline.open = false
##\u79BB\u7EBF\u540C\u6B65\u5F00\u5173
mes.offline.sync.open = true
##\u79BB\u7EBF\u540C\u6B65\u8FB9\u7AEF\u6570\u636E\u5E93JOB
mes.offline.sync.pcnTask.taskCode = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskName = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskGroupName = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskDescription = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskClass = MesOffLineDataSyncJob
mes.offline.sync.pcnTask.taskPackage = cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob
mes.offline.sync.pcnTask.pcnCode = PCN001
mes.offline.sync.pcnTask.taskCycleExps = 0 0/2 * * * ?
mes.offline.sync.pcnTask.taskCycleDescription = \u6BCF2\u5206\u949F\u6267\u884C\u4E00\u6B21
mes.offline.sync.pcnTask.taskParam = CR01:CH218:CH218-B
##\u79BB\u7EBF\u8FB9\u7AEF\u6570\u636E\u5E93\u914D\u7F6E
mes.offline.sync.dataSource.dsCode = impp_i3_mes_offline
mes.offline.sync.dataSource.dsName = impp_i3_mes_offline
mes.offline.sync.dataSource.dsType = SOURCE_MARIA_DB
mes.offline.sync.dataSource.dsHost = 10.193.30.20
mes.offline.sync.dataSource.dsHostPort = 3306
mes.offline.sync.dataSource.dsUser = root
mes.offline.sync.dataSource.dsPassword = (mfLEu7@9kmfdsTy
mes.offline.sync.dataSource.dsDbName = impp_i3_mes_offline
##\u79BB\u7EBF\u8BBF\u95EE\u8FB9\u7AEF\u6570\u636E\u5E93SQL\u8BED\u53E5\u5360\u4F4D\u7B26\u5BF9\u5E94\u503C
mes.offline.sync.sqlParameter.organize_code = CR01
##\u79BB\u7EBF\u8BBF\u95EE\u8FB9\u7AEF\u6570\u636E\u5E93SQL\u8BED\u53E5
##\u7EC4\u7EC7\u6A21\u578B
mes.offline.sync.sql.mes_datasource = select * from mes_datasource where organize_code = :organize_code ;

@ -0,0 +1,81 @@
##\u79BB\u7EBF\u5F00\u5173
mes.offline.open = false
##\u79BB\u7EBF\u540C\u6B65\u5F00\u5173
mes.offline.sync.open = true
##\u79BB\u7EBF\u540C\u6B65\u8FB9\u7AEF\u6570\u636E\u5E93JOB
mes.offline.sync.pcnTask.taskCode = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskName = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskGroupName = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskDescription = OFFLINE_DATA_SYNC_JOB
mes.offline.sync.pcnTask.taskClass = MesOffLineDataSyncJob
mes.offline.sync.pcnTask.taskPackage = cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob
mes.offline.sync.pcnTask.pcnCode = PCN001
#mes.offline.sync.pcnTask.taskCycleExps = 0 0 */1 * * ?
mes.offline.sync.pcnTask.taskCycleExps = 0 0/10 * * * ?
mes.offline.sync.pcnTask.taskCycleDescription = \u6BCF\u5C0F\u65F6\u6267\u884C\u4E00\u6B21
mes.offline.sync.pcnTask.taskParam = CR01:CH218:CH218-B
##\u79BB\u7EBF\u8FB9\u7AEF\u6570\u636E\u5E93\u914D\u7F6E
mes.offline.sync.dataSource.dsCode = impp_i3_mes
mes.offline.sync.dataSource.dsName = impp_i3_mes
mes.offline.sync.dataSource.dsType = SOURCE_MARIA_DB
mes.offline.sync.dataSource.dsHost = 10.193.30.20
mes.offline.sync.dataSource.dsHostPort = 3306
mes.offline.sync.dataSource.dsUser = root
mes.offline.sync.dataSource.dsPassword = (mfLEu7@9kmfdsTy
mes.offline.sync.dataSource.dsDbName = impp_i3_mes
##\u79BB\u7EBF\u8BBF\u95EE\u8FB9\u7AEF\u6570\u636E\u5E93SQL\u8BED\u53E5\u5360\u4F4D\u7B26\u5BF9\u5E94\u503C
mes.offline.sync.sqlParameter.organize_code = CR01
mes.offline.sync.sqlParameter.work_center_code = CH218
mes.offline.sync.sqlParameter.work_cell_code = CH218-B
##mes.offline.sync.sqlParameter.part_no_list = abc,def,ghi...
##mes.offline.sync.sqlParameter.field_int = 10
##\u79BB\u7EBF\u8BBF\u95EE\u8FB9\u7AEF\u6570\u636E\u5E93SQL\u8BED\u53E5
##\u7EC4\u7EC7\u6A21\u578B
mes.offline.sync.sql.mes_area = select * from mes_area where organize_code = :organize_code ;
mes.offline.sync.sql.mes_work_center = select * from mes_work_center where organize_code = :organize_code and work_center_code = :work_center_code ;
mes.offline.sync.sql.mes_work_cell = select * from mes_work_cell where organize_code = :organize_code and work_center_code = :work_center_code ;
##\u5DE5\u827A\u6D41\u7A0B
mes.offline.sync.sql.mes_state_machine = select * from mes_state_machine where organize_code = :organize_code and is_deleted = 2 and sm_code in (select sm_code from mes_route_process where organize_code = :organize_code and is_deleted = 2 and route_code in (select route_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code) and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code )) ;
mes.offline.sync.sql.mes_state_machine_status = select * from mes_state_machine_status where organize_code = :organize_code and is_deleted = 2 and sm_code in (select sm_code from mes_route_process where organize_code = :organize_code and is_deleted = 2 and route_code in (select route_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code) and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code )) ;
mes.offline.sync.sql.mes_step_group = select * from mes_step_group where organize_code = :organize_code and amg_id in (select trigger_amg_id from mes_state_machine_status where organize_code = :organize_code and is_deleted = 2 and sm_code in (select sm_code from mes_route_process where organize_code = :organize_code and is_deleted = 2 and route_code in (select route_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code) and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ))) ;
mes.offline.sync.sql.mes_step = select * from mes_step where organize_code = :organize_code ;
mes.offline.sync.sql.mes_step_param = select * from mes_step_param where organize_code = :organize_code ;
mes.offline.sync.sql.mes_route = select * from mes_route where organize_code = :organize_code and is_deleted = 2 and route_code in (select route_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ) ;
mes.offline.sync.sql.mes_route_process = select * from mes_route_process where organize_code = :organize_code and is_deleted = 2 and route_code in (select route_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ) ;
mes.offline.sync.sql.mes_route_process_cell = select * from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ;
mes.offline.sync.sql.mes_prod_route_cfg = select * from mes_prod_route_cfg where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code ;
mes.offline.sync.sql.mes_prod_route_opt_param = select * from mes_prod_route_opt_param where organize_code = :organize_code and is_deleted = 2 and prod_route_cfg_id in (select id from mes_prod_route_cfg where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code ) ;
mes.offline.sync.sql.mes_process = select * from mes_process where organize_code = :organize_code and is_deleted = 2 and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ) ;
mes.offline.sync.sql.mes_craft = select * from mes_craft where organize_code = :organize_code and is_deleted = 2 and craft_code in (select craft_code from mes_process_craft_cfg where organize_code = :organize_code and is_deleted = 2 and process_code in (select process_code from mes_process where organize_code = :organize_code and is_deleted = 2 and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ))) ;
mes.offline.sync.sql.mes_process_craft_cfg = select * from mes_process_craft_cfg where organize_code = :organize_code and is_deleted = 2 and process_code in (select process_code from mes_process where organize_code = :organize_code and is_deleted = 2 and process_code in (select process_code from mes_route_process_cell where organize_code = :organize_code and is_deleted = 2 and work_center_code = :work_center_code and work_cell_code = :work_cell_code )) ;
##\u7CFB\u7EDF\u914D\u7F6E
mes.offline.sync.sql.mes_config = select * from mes_config ;
##\u5DE5\u4F4D\u6309\u94AE
mes.offline.sync.sql.mes_window = select * from mes_window where organize_code = :organize_code ;
mes.offline.sync.sql.mes_window_module = select * from mes_window_module where organize_code = :organize_code ;
mes.offline.sync.sql.mes_window_module_param = select * from mes_window_module_param where organize_code = :organize_code ;
mes.offline.sync.sql.mes_work_module = select * from mes_work_module where organize_code = :organize_code ;
mes.offline.sync.sql.mes_work_module_param = select * from mes_work_module_param where organize_code = :organize_code ;
mes.offline.sync.sql.mes_work_cell_module = select * from mes_work_cell_module where organize_code = :organize_code and is_deleted = 2 and is_valid = 1 and work_center_code = :work_center_code and work_cell_code = :work_cell_code ;
##\u7269\u6599\u4FE1\u606F
mes.offline.sync.sql.mes_part = select * from mes_part where organize_code = :organize_code ;
mes.offline.sync.sql.mes_part_sap = select * from mes_part_sap where organize_code = :organize_code ;
mes.offline.sync.sql.mes_customer_part = select * from mes_customer_part where organize_code = :organize_code ;
##\u6253\u5370\u6A21\u7248
mes.offline.sync.sql.mes_label_template = select * from mes_label_template where organize_code = :organize_code and is_deleted = 2 and is_valid = 1 ;
mes.offline.sync.sql.mes_label_template_param = select * from mes_label_template_param where organize_code = :organize_code and is_deleted = 2 and is_valid = 1 ;
##\u7F16\u7801\u89C4\u5219
mes.offline.sync.sql.mes_number_rule = select * from mes_number_rule where organize_code = :organize_code and is_deleted = 2 and is_valid = 1 ;
##\u6392\u5E8F\u4EA7\u54C1\u52A0\u5DE5\u89C4\u5219
mes.offline.sync.sql.mes_prod_rule_sort_cfg = select * from mes_prod_rule_sort_cfg where organize_code = :organize_code and work_center_code = :work_center_code and work_cell_code = :work_cell_code ;

@ -259,6 +259,14 @@ public class MesPcnExtConstWords {
public static final String LOCATION_NUMBER = "locationNumber";
//提醒天数
public static final String REMIND_DAY = "REMIND_DAY";
//同步日期
public static final String SYNC_DATE = "syncDate";
//Repository
public static final String Repository = "Repository";
//对象代码
public static final String OBJECT_CODE = "objectCode";
//影响数量
public static final String EFFECT_NUM = "effectNum";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
@ -432,6 +440,10 @@ public class MesPcnExtConstWords {
public static final String E_UNDERLINE = "_";
//右斜线
public static final String SLANT_R = "/";
//.转义
public static final String DECIMAL_POINT_ESCAPE = "\\.";
//.
public static final String DECIMAL_POINT = ".";
// 分表配置
public static final String MES_SHARDING_TABLES_OBJECT_CFG = "MES_SHARDING_TABLES_OBJECT_CFG";

Loading…
Cancel
Save