package com.product.data.sync.service; import com.product.common.exception.job.TaskException; 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.core.permission.PermissionService; import com.product.core.service.support.AbstractBaseService; import com.product.core.service.support.QueryFilterService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.transfer.Transactional; import com.product.data.sync.config.CmnConst; import com.product.data.sync.service.ide.ISyncConfigService; import com.product.quartz.service.impl.SysJobService; import com.product.util.BaseUtil; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; /** * Copyright LX * * @Title: SyncConfigService * @Project: product-server * @date: 2021-08-11 16:35 * @author: ZhouJie * @Description: 数据库同步配置 */ @Service public class SyncConfigService extends AbstractBaseService implements ISyncConfigService { @Autowired public BaseDao baseDao; @Autowired PermissionService permissionService; @Autowired QueryFilterService queryFilterService; @Autowired SysJobService sysJobService; @Override @Transactional public String saveSyncConfig(FieldSetEntity fs) throws BaseException, TaskException, SchedulerException { FieldSetEntity fsjob = new FieldSetEntity(); fsjob.setTableName("product_sys_timed_task"); //唯一标识 String uuid = fs.getUUID(); //状态 String status = fs.getString("status"); String dataOriginName = fs.getString("data_origin_name"); String cron_expression = fs.getString("cron_expression"); if (BaseUtil.strIsNull(uuid)) { fs.setValue("org_level_uuid", SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid()); fs.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fs.setValue("created_utc_datetime", new Date()); uuid = baseDao.add(fs); //自动生成定时任务 fsjob.setValue("job_name", dataOriginName + "表数据同步");//任务名称 fsjob.setValue("job_group", "system");//分组 fsjob.setValue("invoke_target", "scheduledTaskExecution.getDataSync('" + fs.getUUID() + "')");//调用目标字符串 fsjob.setValue("cron_expression", cron_expression);//cron表达式 fsjob.setValue("misfire_policy", "2");//错误执行策略 只执行一次 fsjob.setValue("concurrent", 1);//不并发 fsjob.setValue("remark", dataOriginName + "表数据同步"); fsjob.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fsjob.setValue("created_utc_datetime", new Date()); fsjob.setValue("status", status); fsjob.setValue("is_conceal", 1); sysJobService.insertJob(fsjob); } else { fs.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fs.setValue("updated_utc_datetime", new Date()); DataTableEntity deleteSub = fs.getSubDataTable("deleteSub"); if (!BaseUtil.dataTableIsEmpty(deleteSub)) { for (int i = 0; i < deleteSub.getRows(); i++) { String deUuid = deleteSub.getString(i, "uuid"); baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG_SUB, new String[]{deUuid}); } } baseDao.update(fs); //修改定时任务中的cron表达式 FieldSetEntity fsupjob = baseDao.getFieldSetEntityByFilter("product_sys_timed_task", "invoke_target like concat('%',?,'%')", new Object[]{fs.getUUID()}, true); boolean isInert = false; if (fsupjob == null) { isInert = true; fsupjob = new FieldSetEntity(); fsupjob.setTableName("product_sys_timed_task"); fsupjob.setValue("job_name", dataOriginName + "表数据同步");//任务名称 fsupjob.setValue("job_group", "system");//分组 fsupjob.setValue("invoke_target", "scheduledTaskExecution.getDataSync('" + fs.getUUID() + "')");//调用目标字符串 fsupjob.setValue("misfire_policy", "2");//错误执行策略 只执行一次 fsupjob.setValue("concurrent", 1);//不并发 fsupjob.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fsupjob.setValue("created_utc_datetime", new Date()); fsupjob.setValue("is_conceal", 1); } fsupjob.setValue("job_name", dataOriginName + "表数据同步");//任务 fsupjob.setValue("remark", dataOriginName + "表数据同步"); fsupjob.setValue("cron_expression", cron_expression); fsupjob.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id()); fsupjob.setValue("updated_utc_datetime", new Date()); fsupjob.setValue("status", status); isInert = !isInert ? sysJobService.updateJob(fsupjob) : sysJobService.insertJob(fsupjob); } return uuid; } public DataTableEntity listSyncConfig(FieldSetEntity fs) throws BaseException { String queryFilter; if (BaseUtil.dataTableIsEmpty(fs.getSubDataTable("systemSeniorQueryString"))) { queryFilter = ""; } else { queryFilter = queryFilterService.getQueryFilter(fs); } DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, queryFilter, null, null, null, fs.getInteger(CmnConst.PAGESIZE), fs.getInteger(CmnConst.CPAGE)); return dt; } /** * 获取数据同步日志 * * @param fse * @return * @throws BaseException */ public DataTableEntity getSyncLog(FieldSetEntity fse) throws BaseException { return baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG_LOG, "sync_config_uuid = ?", new String[]{fse.getUUID()}, " sync_time desc "); } /** * 获取数据同步日志子表 * * @param fse * @return * @throws BaseException */ public DataTableEntity getSyncLogSub(FieldSetEntity fse) throws BaseException { return baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG_LOG_SUB, " sync_config_log_uuid = ? ", new String[]{fse.getUUID()}); } public FieldSetEntity getSyncConfig(FieldSetEntity fs) throws BaseException { return baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, fs.getUUID(), true); } @Override @Transactional public boolean delSyncConfig(FieldSetEntity fs) throws BaseException, SchedulerException { String uuid = fs.getUUID(); FieldSetEntity fstask = baseDao.getFieldSetEntityByFilter("product_sys_timed_task", "invoke_target like concat('%',?,'%')", new Object[]{uuid}, false); //定时任务不为空 if (fstask != null) { sysJobService.deleteJobByIds(new String[]{fstask.getUUID()}); } //删除日志及日志子表 baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG_LOG, " sync_config_uuid = ? ", new String[]{uuid}); return baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, new String[]{uuid}); } }