package com.product.data.center.service; import cn.hutool.core.util.ArrayUtil; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.data.center.config.CmnConst; import com.product.data.center.config.ErrorCode; import com.product.data.center.entity.MoBaseEntity; import com.product.datasource.dao.Dao; import com.product.datasource.entity.DataBaseEntity; import com.product.datasource.entity.UpdateFilterEntity; import com.product.util.BaseUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * @Author cheng * @Date 2022/12/26 14:41 * @Desc 制令单数据同步 */ @Service public class MoBaseSyncService { @Resource private BaseDao baseDao; public BaseDao getBaseDao() { return baseDao; } public void runTask() { FieldSetEntity fs = getBaseDao().getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_DATA_SYNC_MES, "LENGTH(data_source)>1 limit 1", null, false); if (FieldSetEntity.isEmpty(fs)) { throw new BaseException(ErrorCode.MO_NUMBER_SYNC_DATASOURCE_ERROR); } String dataSource = fs.getString("data_source"); DataBaseEntity dbe = new DataBaseEntity(dataSource); Dao dao = dbe.getDao(); DataTableEntity dt = dao.getList(" SELECT MO_NUMBER FROM T_WIP_TRACKING WHERE IN_STATION_TIME>=TRUNC(SYSDATE) GROUP BY MO_NUMBER"); if (DataTableEntity.isEmpty(dt)) { return; } List moBaseEntities = new ArrayList<>(); Object[] moNumbers = dt.getData().stream().map(item -> item.getString("mo_number")).toArray(); StringBuilder sql = new StringBuilder(128); sql.append("\nSELECT NVL(COUNT(1),F.INPUT_QTY) COUNT,F.MO_NUMBER,F.TARGET_QTY,F.MO_CLOSE_DATE,F.MO_START_DATE "); sql.append("\nFROM T_WIP_DETAIL T"); sql.append("\nRIGHT JOIN T_PM_MO_BASE F"); sql.append("\nON T.MO_NUMBER=F.MO_NUMBER AND T.GROUP_NAME = F.DEFAULT_GROUP"); sql.append("\nWHERE t.ERROR_FLAG='0' AND "); sql.append(BaseUtil.buildQuestionMarkFilter("T.MO_NUMBER", moNumbers.length, true)); sql.append(" GROUP BY F.MO_NUMBER,F.INPUT_QTY,F.TARGET_QTY,F.MO_CLOSE_DATE,F.MO_START_DATE "); DataTableEntity list = dao.getList(sql.toString(), moNumbers); if (!DataTableEntity.isEmpty(list)) { //开始工序.替换T_PM_MO_BASE T 表中INPUT_QTY字段 for (int i = 0; i < list.getRows(); i++) { String moNumber = list.getString(i, "mo_number"); int count = list.getInt(i, "count"); MoBaseEntity moBase = getMoBase(moNumber, moBaseEntities); moBase.setTargetQTY(list.getInt(i, "target_qty")); moBase.setMoCloseDate(list.getDate(i, "mo_close_date")); moBase.setMoStartDate(list.getDate(i, "mo_start_date")); moBase.setInputQTY(count); } } sql.setLength(0); sql.append(" SELECT NVL(COUNT(1),F.OUTPUT_QTY) COUNT,F.MO_NUMBER,F.TARGET_QTY,F.MO_CLOSE_DATE,F.MO_START_DATE"); sql.append("\n FROM T_WIP_DETAIL T"); sql.append("\n RIGHT JOIN T_PM_MO_BASE F"); sql.append("\n ON T.MO_NUMBER =F.MO_NUMBER AND T.GROUP_NAME=F.END_GROUP"); sql.append("\n WHERE T.ERROR_FLAG ='0' AND "); sql.append(BaseUtil.buildQuestionMarkFilter("F.MO_NUMBER", moNumbers.length, true)); sql.append("\nGROUP BY F.MO_NUMBER,F.OUTPUT_QTY ,F.TARGET_QTY,F.MO_CLOSE_DATE,F.MO_START_DATE"); list = dao.getList(sql.toString(), moNumbers); if (!DataTableEntity.isEmpty(list)) { //开始工序.替换T_PM_MO_BASE T 表中OUTPUT_QTY字段 for (int i = 0; i < list.getRows(); i++) { String moNumber = list.getString(i, "mo_number"); int count = list.getInt(i, "count"); MoBaseEntity moBase = getMoBase(moNumber, moBaseEntities); moBase.setTargetQTY(list.getInt(i, "target_qty")); moBase.setMoCloseDate(list.getDate(i, "mo_close_date")); moBase.setMoStartDate(list.getDate(i, "mo_start_date")); moBase.setOutputQTY(count); } } //更新开始日期的moNumber Object[] updateStartDateMoNumber = moBaseEntities.stream().filter(moBaseEntity -> moBaseEntity.getInputQTY() == moBaseEntity.getTargetQTY()).map(item -> item.getMoNumber()).toArray(); if (!ArrayUtil.isEmpty(updateStartDateMoNumber)) { sql.setLength(0); sql.append(" select MAX(IN_STATION_TIME) MAX,F.MO_NUMBER"); sql.append("\nFROM T_WIP_DETAIL T"); sql.append("\nRIGHT JOIN T_PM_MO_BASE F"); sql.append("\nON T.MO_NUMBER = F.MO_NUMBER"); sql.append("\nAND T.GROUP_NAME = F.DEFAULT_GROUP"); sql.append("\nWHERE T.ERROR_FLAG = '0' AND "); sql.append(BaseUtil.buildQuestionMarkFilter("F.MO_NUMBER", updateStartDateMoNumber.length, true)); sql.append(" GROUP BY F.MO_NUMBER "); list = dao.getList(sql.toString(), updateStartDateMoNumber); if (!DataTableEntity.isEmpty(list)) { // 更新T_PM_MO_BASE.MO_START_DATE字段 for (int i = 0; i < list.getRows(); i++) { String moNumber = list.getString(i, "mo_number"); MoBaseEntity moBase = getMoBase(moNumber, moBaseEntities); moBase.setMoStartDate(list.getDate(i, "max")); } } } //更新结束日期的moNumber Object[] updateStartEndMoNumber = moBaseEntities.stream().filter(moBaseEntity -> moBaseEntity.getOutputQTY() == moBaseEntity.getTargetQTY()).map(item -> item.getMoNumber()).toArray(); if (!ArrayUtil.isEmpty(updateStartEndMoNumber)) { sql.setLength(0); sql.append(" SELECT MAX(IN_STATION_TIME) MAX,F.MO_NUMBER"); sql.append("\nFROM T_WIP_DETAIL T"); sql.append("\nRIGHT JOIN T_PM_MO_BASE F"); sql.append("\nON T.MO_NUMBER = F.MO_NUMBER"); sql.append("\nAND T.GROUP_NAME = F.END_GROUP"); sql.append("\nWHERE T.ERROR_FLAG = '0' AND "); sql.append(BaseUtil.buildQuestionMarkFilter("F.MO_NUMBER", updateStartDateMoNumber.length, true)); sql.append(" GROUP BY F.MO_NUMBER "); list = dao.getList(sql.toString(), updateStartEndMoNumber); if (!DataTableEntity.isEmpty(list)) { // 更新T_PM_MO_BASE.MO_END_DATE字段 for (int i = 0; i < list.getRows(); i++) { String moNumber = list.getString(i, "mo_number"); MoBaseEntity moBase = getMoBase(moNumber, moBaseEntities); moBase.setMoCloseDate(list.getDate(i, "max")); } } } DataTableEntity data = new DataTableEntity(); moBaseEntities.stream().forEach(item -> { FieldSetEntity ff = new FieldSetEntity(); ff.setTableName("T_PM_MO_BASE"); if (StringUtils.isEmpty(item.getMoNumber())) { return; } boolean isUpdate = false; ff.setValue("mo_number", item.getMoNumber()); if (item.getInputQTY() > 0) { ff.setValue("input_qty", item.getInputQTY()); isUpdate = true; } if (item.getOutputQTY() > 0) { ff.setValue("output_qty", item.getOutputQTY()); isUpdate = true; } if (item.getMoStartDate() != null) { ff.setValue("mo_start_date", item.getMoStartDate()); isUpdate = true; } if (item.getMoCloseDate() != null) { ff.setValue("mo_close_date", item.getMoCloseDate()); isUpdate = true; } if (isUpdate) { data.addFieldSetEntity(ff); } }); if (!DataTableEntity.isEmpty(data)) { // System.out.println(data); dao.updateBatch(data, new UpdateFilterEntity("mo_number=?", new String[]{"mo_number"}), true); } dao.closeConnection(); } private MoBaseEntity getMoBase(String moNumber, List moBaseEntities) { if (moBaseEntities.size() > 0) { int index = moBaseEntities.indexOf(moNumber); if (index > -1) { return moBaseEntities.get(index); } } MoBaseEntity moBaseEntity = new MoBaseEntity(); moBaseEntity.setMoNumber(moNumber); moBaseEntities.add(moBaseEntity); return moBaseEntity; } }