diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java index 6a95442..6a88e8c 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java @@ -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 findMesWorkOrderPartByOrderNo(String organizeCode,List workOrderNoList); } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncJobService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncJobService.java new file mode 100644 index 0000000..67fb6f4 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncJobService.java @@ -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); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncService.java new file mode 100644 index 0000000..718a584 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesOffLineDataSyncService.java @@ -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 getPcnSyncOfflineLogList(String organizeCode); + + List filterPcnSyncOfflineLogList(List pcnSyncOfflineLogList, Boolean flag); + + Map filterFaulurePcnSyncOfflineLog(List pcnSyncOfflineLogList); + + MesPcnSyncOfflineLog insertPcnSyncOfflineLog(MesPcnSyncOfflineLog pcnSyncOfflineLog, String tableName); + + void insertBaseBeanData(MesPcnSyncOfflineLog pcnSyncOfflineLog, List> resultList, String objectCode, String tableName) throws Exception; + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/TestJobApi.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/TestJobApi.java deleted file mode 100644 index 2d19a6a..0000000 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/TestJobApi.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.api.job; - -public class TestJobApi { -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/MesOffLineConfig.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/MesOffLineConfig.java new file mode 100644 index 0000000..907b775 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/MesOffLineConfig.java @@ -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 sqlParameter = new HashMap<>(); + + //同步sql + private Map 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(); + } + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesOffLineDataSyncController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesOffLineDataSyncController.java new file mode 100644 index 0000000..f978b46 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesOffLineDataSyncController.java @@ -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 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); + } + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPullingOrderInfoController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPullingOrderInfoController.java index 3a68523..8fcbd00 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPullingOrderInfoController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPullingOrderInfoController.java @@ -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(); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java index 716d5bd..3c7d8f4 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java @@ -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 = "查询设备交互") diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProductionRecordDao.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProductionRecordDao.java index d5ecaab..9d4e76b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProductionRecordDao.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProductionRecordDao.java @@ -15,5 +15,5 @@ import java.util.List; public interface IMesProductionRecordDao { @ApiOperation("查询汇报的加工记录") - List findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize); + List findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize, List workCenterList); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesInsertBatchDaoImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesInsertBatchDaoImpl.java index a888b3c..6696fc0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesInsertBatchDaoImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesInsertBatchDaoImpl.java @@ -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 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 parameterMap = new HashMap<>(); - StringBuilder builder = new StringBuilder(); for (int i = MesPcnExtConstWords.ZERO; i < logList.size(); i++) { + Map 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(); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProductionRecordImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProductionRecordImpl.java index 0818163..e0af0cf 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProductionRecordImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProductionRecordImpl.java @@ -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 findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize) { + public List findMesProductionRecordNoReport(String organizeCode, Integer workOrderType, Integer pageSize, List 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(); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesOffLineDataSyncJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesOffLineDataSyncJob.java new file mode 100644 index 0000000..ce2e4fe --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesOffLineDataSyncJob.java @@ -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()); + + } + + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProductReportJob.java similarity index 66% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProductReportJob.java index 3ea7347..dbeb440 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProductReportJob.java @@ -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 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 参数不能为空"); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdShiftRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdShiftRecordServiceImpl.java index 4e1abe9..e400a83 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdShiftRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdShiftRecordServiceImpl.java @@ -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 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 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); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java index da3df81..dc7ef38 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java @@ -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); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java index 26a5b45..c994a8f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java @@ -266,8 +266,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer } private List getMesPackingDefineDetails(String organizeCode, String packCode) { - DdlPackBean ddlPackBean; - ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(packCode, "packCode", ddlPackBean); List defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean); if (CollectionUtils.isEmpty(defineDetails)) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPullingOrderInfoService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPullingOrderInfoService.java index 0383f81..0fc5afb 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPullingOrderInfoService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPullingOrderInfoService.java @@ -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)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java index d95016c..b83fd58 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java @@ -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())); } } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index 7b264ca..72bf7d6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -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 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 recordNoReportNotHasOrderNoList = recordNoReportList.stream().filter(item -> StringUtils.isEmpty(item.getWorkOrderNo())).collect(Collectors.toList()); + List 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())); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/shippingscan/strategy/MesShippingScanSnAndOrderStrategyServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/shippingscan/strategy/MesShippingScanSnAndOrderStrategyServiceImpl.java index ccd4142..f605f27 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/shippingscan/strategy/MesShippingScanSnAndOrderStrategyServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/shippingscan/strategy/MesShippingScanSnAndOrderStrategyServiceImpl.java @@ -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 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())); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncJobService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncJobService.java new file mode 100644 index 0000000..a85e38e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncJobService.java @@ -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 loadJobs(Boolean pcnScheduleJob, Boolean mesOffLineSyncOpen) { + List 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 sqlMap = offLineConfig.getSql(); + Map sqlParameterMap = offLineConfig.getSqlParameter(); + + if (CollectionUtils.isEmpty(sqlMap) || CollectionUtils.isEmpty(sqlParameterMap)) return "SQL CFG IS NULL"; + + List pcnSyncOfflineLogList = offLineDataSyncService.getPcnSyncOfflineLogList(pcnSyncOfflineLog.getOrganizeCode()); + + List successedList = offLineDataSyncService.filterPcnSyncOfflineLogList(pcnSyncOfflineLogList, true); + + if (!CollectionUtils.isEmpty(successedList) && successedList.containsAll(sqlMap.keySet())) return String.format("%s已同步成功,无需重复执行!", sqlMap.keySet().toString()); + + Map 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 successTableNameList = new ArrayList<>(); + List 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 paramMap = new HashMap<>(); + + for (Map.Entry 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> 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 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 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); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncService.java new file mode 100644 index 0000000..610c422 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesOffLineDataSyncService.java @@ -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 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 filterPcnSyncOfflineLogList(List 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 filterFaulurePcnSyncOfflineLog(List pcnSyncOfflineLogList) { + List 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> 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 historyList = baseRepository.findAll(); + Map 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 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); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/AssemblyVisualListPrintStrategy.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/AssemblyVisualListPrintStrategy.java index eb532eb..2d81c98 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/AssemblyVisualListPrintStrategy.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/AssemblyVisualListPrintStrategy.java @@ -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()); // 工单标识 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSnService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSnService.java index 11ce868..573fd61 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSnService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSnService.java @@ -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 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; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortDoubleCheckService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortDoubleCheckService.java new file mode 100644 index 0000000..bd459cb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortDoubleCheckService.java @@ -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 matchNumberRule(String organizeCode, String sn, Object... params) { + + Map 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 produceSnList = produceSnExtService.getProduceSnList(organizeCode, sn); + if (CollectionUtils.isEmpty(produceSnList)) { + result.put(MesPcnExtConstWords.MESSAGE, String.format("零件条码[%s]信息不存在!", sn)); + return result; + } + + List 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 productionAssemblyList = assemblyExtService.getProductionAssemblyList(organizeCode, sn); + + Optional 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortSnGmService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortSnGmService.java index 17e989a..5d9ea70 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortSnGmService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchSortSnGmService.java @@ -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; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionEquDowntimeService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionEquDowntimeService.java index 8822731..730744f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionEquDowntimeService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionEquDowntimeService.java @@ -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)) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java index 9f29d2c..35bceec 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java @@ -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(); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline-bak.properties b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline-bak.properties new file mode 100644 index 0000000..d840eb7 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline-bak.properties @@ -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 ; + diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline.properties b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline.properties new file mode 100644 index 0000000..8242b32 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-offline.properties @@ -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 ; \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 6449932..0046cac 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -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";