diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/YdzbdataSyncPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/YdzbdataSyncPluginApi.java new file mode 100644 index 0000000..6f6aa7c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/YdzbdataSyncPluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.src_ydctdatasync; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_ydctdatasync.constants.YdzbdataSyncConstants; + +public class YdzbdataSyncPluginApi extends APluginInfoApi { + public YdzbdataSyncPluginApi() { + } + + public String getPluginId() { + System.out.println(YdzbdataSyncConstants.getPluginId()); + return YdzbdataSyncConstants.getPluginId(); + } + + public String getCreateUser() { + return "橙阳科技"; + } + + public String getDescription() { + return "宜都城投数据同步"; + } + + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + YdzbdataSyncConstants[] var2 = YdzbdataSyncConstants.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + YdzbdataSyncConstants value = var2[var4]; + if (value != YdzbdataSyncConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + + return configVo; + } + +// public void registerCustomEvent(Map eventAndNodes) { +// eventAndNodes.put("propertyDispose", "资产管理待办推送"); +// } +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/config/DataSourceConfig.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/config/DataSourceConfig.java new file mode 100644 index 0000000..d148349 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/config/DataSourceConfig.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.src_ydctdatasync.config; + +public class DataSourceConfig { + private String url; + private String username; + private String password; + private String driver; + public DataSourceConfig() {} + + public DataSourceConfig(String url,String username,String password) { + this.url = url; + this.username = username; + this.password = password; + } + + public String getUrl() { + return url; + } + public String getUsername() { + return username; + } + public String getPassword() { + return password; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/constants/YdzbdataSyncConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/constants/YdzbdataSyncConstants.java new file mode 100644 index 0000000..815d67c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/constants/YdzbdataSyncConstants.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.src_ydctdatasync.constants; + +public enum YdzbdataSyncConstants { + + + plugin("YdzbdataSyncConstants","插件ID"); + + YdzbdataSyncConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/FormExportUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/FormExportUtil.java new file mode 100644 index 0000000..a6a491a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/FormExportUtil.java @@ -0,0 +1,64 @@ +package com.seeyon.apps.src_ydctdatasync.dao; + +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public static List setFormValue(Map map){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key)); + valueExports.add(valueExport); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param map 设置主表字段。List> + */ + public static List setSubordinateFormValue(Map map){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List> lists = new ArrayList<>(); + lists.add(map); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/KsQueryDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/KsQueryDao.java new file mode 100644 index 0000000..6f016d1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/dao/KsQueryDao.java @@ -0,0 +1,20 @@ +package com.seeyon.apps.src_ydctdatasync.dao; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class KsQueryDao { + + public Map queryByName(String name,String clause,String table) throws BusinessException, SQLException { + JDBCAgent agent = new JDBCAgent(); + String sql = "SELECT * FROM" + table + clause +";"; + List params = new ArrayList<>(); + agent.execute(sql,params); + return agent.resultSetToMap(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractAssetDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractAssetDataMapMode.java new file mode 100644 index 0000000..4171cba --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractAssetDataMapMode.java @@ -0,0 +1,75 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.Map; + +public abstract class AbstractAssetDataMapMode extends AbstractDataMapMode{ + + protected JDBCAgent agent; + + @Override + public void preProcess(Map map) { + Object houseStatus = map.get("house_status"); + Object propertyMortgage = map.get("property_mortgage"); + String zcStatus = houseStatus == null ? "" : EnumMapUtils.getEnumItemValue(agent,"资产状态", (String) houseStatus); + String isPublicAsset = EnumMapUtils.getEnumItemValue(agent,"是否公用产权","否"); + String assetBacked = propertyMortgage == null ? "" : EnumMapUtils.getEnumItemValue(agent,"是否产权抵押", (String) propertyMortgage); + map.put("house_status",zcStatus); + map.put("isPublicAsset",isPublicAsset); + map.put("assetBacked",assetBacked); + } + + @Override + public void commonAttrTransfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("住保系统编码",sourceMap.get("house_id")); //填充住保系统编码 + targetMap.put("资产编号",sourceMap.get("house_id")); //填充资产编号 + StringBuilder stringBuilder = new StringBuilder(""); + if(sourceMap.get("village_name") != null) { + stringBuilder.append(sourceMap.get("village_name")); + } + if(sourceMap.get("building_name") != null) { + if(sourceMap.get("village_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("building_name")); + } + if(sourceMap.get("variable_001") != null) { + if(sourceMap.get("village_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("variable_001")); + } + if(sourceMap.get("room_number") != null) { + if(sourceMap.get("building_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("room_number")); + } + targetMap.put("资产名称",stringBuilder.toString()); //填充资产名称 + targetMap.put("资产状态",sourceMap.get("house_status"));//填充资产状态 + targetMap.put("产权证号",sourceMap.get("property_certificate_no"));//填充产权证号 + targetMap.put("充产权人",sourceMap.get("property_owner"));//填充产权人 + targetMap.put("登记时间",sourceMap.get("property_registration_time"));//填充登记时间 + targetMap.put("是否公用产权",sourceMap.get("isPublicAsset"));//填充是否公用产权 + targetMap.put("是否产权抵押",sourceMap.get("property_mortgage"));//填充是否产权抵押 + targetMap.put("建筑面积",sourceMap.get("house_area"));//填充建筑面积 + targetMap.put("备注-资产信息",sourceMap.get("remark"));//填充备注资产信息 + targetMap.put("数公基19位编码",sourceMap.get("sgjbm"));//填充数公基19位编码 + targetMap.put("资产获取日期",sourceMap.get("house_receipt_date"));//填充资产获取日期 + targetMap.put("账面价值",sourceMap.get("paper_value"));//填充账面价值 + targetMap.put("租赁基准价格",sourceMap.get("rent_benchmark"));//填充租赁基准价格 +// targetMap.put("field0061",sourceMap.get(""));//填充管理单位编号 + } + + public JDBCAgent getAgent() { + return agent; + } + + public void setAgent(JDBCAgent agent) { + this.agent = agent; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractContractDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractContractDataMapMode.java new file mode 100644 index 0000000..80d6c53 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractContractDataMapMode.java @@ -0,0 +1,21 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.ctp.util.JDBCAgent; + +public abstract class AbstractContractDataMapMode extends AbstractDataMapMode{ + + protected JDBCAgent agent; + + @Override + public void commonAttrTransfer(Object target, Object source) { + + } + + public JDBCAgent getAgent() { + return agent; + } + + public void setAgent(JDBCAgent agent) { + this.agent = agent; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractDataMapMode.java new file mode 100644 index 0000000..28b4bf1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractDataMapMode.java @@ -0,0 +1,71 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import java.util.Map; +import java.util.function.Function; + +public abstract class AbstractDataMapMode { + /** + * 表级别的前置处理,适用于一张表的整体逻辑 + */ + public abstract void preProcess(Map map); + + /** + * 返回字段级别的处理逻辑映射,每个字段对应一个处理函数 + * @return 字段与其处理函数的映射 + */ + public abstract Map> getFieldProcessors(); + + /** + * 判断当前模式是否支持 + */ + public abstract boolean support(); + + /** + * 实现记录级别的目标源映射 + * @param target 目标对象 + * @param source 源对象 + */ + public abstract void transfer(Object target, Object source); + + /** + * 实现记录级别的共有字段的映射 + * @param target 目标对象 + * @param source 源对象 + */ + public abstract void commonAttrTransfer(Object target, Object source); + + /** + * 数据映射,包含字段级和记录级的处理逻辑 + * @param target 目标对象 + * @param source 源对象 + */ + protected void dataMapping(Object target, Object source) { + if (source instanceof Map && target instanceof Map) { + Map sourceMap = (Map) source; + Map targetMap = (Map) target; + preProcess(sourceMap); // 表级别前置处理 + Map> sourcefieldProcessors = getFieldProcessors(); + + for (Map.Entry entry : sourceMap.entrySet()) { + String fieldName = entry.getKey(); + Object fieldValue = entry.getValue(); + // 查找字段处理逻辑 + Function processor = sourcefieldProcessors.getOrDefault(fieldName, this::defaultFieldProcessor); + Object processedValue = processor.apply(fieldValue); + sourceMap.put(fieldName, processedValue); // 处理后的值覆盖源值 + + } + } + + transfer(target, source); // 记录级别处理 + } + + /** + * 默认字段处理逻辑,未定义处理方式的字段调用此方法 + * @param fieldValue 字段值 + * @return 原始字段值(默认不处理) + */ + protected Object defaultFieldProcessor(Object fieldValue) { + return fieldValue; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractFeeDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractFeeDataMapMode.java new file mode 100644 index 0000000..62dd68c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/AbstractFeeDataMapMode.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.Map; + +public abstract class AbstractFeeDataMapMode extends AbstractDataMapMode{ + + protected JDBCAgent agent; + + @Override + public void preProcess(Map map) { + + } + + @Override + public void commonAttrTransfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("数据来源","住保系统集成获取的收支数据"); //填充数据来源 + targetMap.put("住保-合同编号",sourceMap.get("contract_no")); //填充合同编号 + targetMap.put("合同ID",sourceMap.get("contract_id")); //填充合同ID + targetMap.put("住保系统编码",sourceMap.get("house_id")); //住保系统编码 + targetMap.put("住保-小区",sourceMap.get("village_name")); //填充小区 + targetMap.put("住保-楼栋",sourceMap.get("building_name")); //填充楼栋 + targetMap.put("住保-单元",sourceMap.get("unit_name")); //填充单元 + targetMap.put("住保-房号",sourceMap.get("house_number")); //填充房号 + targetMap.put("住保-租户联系方式",sourceMap.get("tenant_phone_number")); //填充租户联系方式 + targetMap.put("OA付款单位","默认宜都市住保运营管理有限公司"); //填充OA付款单位,默认宜都市住保运营管理有限公司 + targetMap.put("OA收款单位","默认宜都市住保运营管理有限公司"); //填充OA收款单位,默认宜都市住保运营管理有限公司 + } + + public JDBCAgent getAgent() { + return agent; + } + + public void setAgent(JDBCAgent agent) { + this.agent = agent; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/BzfAssetMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/BzfAssetMode.java new file mode 100644 index 0000000..44cc42a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/BzfAssetMode.java @@ -0,0 +1,173 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.dao.FormExportUtil; +import com.seeyon.apps.src_ydctdatasync.datasource.DataSource; +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +//保障房资产映射OA资产表模式 +public class BzfAssetMode extends AbstractAssetDataMapMode{ + + private DataSource localDataSource; + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + public DataSource getLocalDataSource() { + return localDataSource; + } + + public void setLocalDataSource(DataSource localDataSource) { + this.localDataSource = localDataSource; + } + + private void enumMap(Map sourceMap) { + String xqzcpLevelValue = EnumMapUtils.getEnumItemValue(agent,"资产层级","父级"); + String zcTypeFwValue = EnumMapUtils.getEnumItemValue(agent,"资产类型","房屋"); + String zcTypeLevel2 = EnumMapUtils.getEnumItemValue(agent,"资产二级类型","保障性住房"); + String xqzcBlock = EnumMapUtils.getEnumItemValue(agent,"资产板块","03不动产"); + String xqzcStatus = EnumMapUtils.getEnumItemValue(agent,"资产状态","待出租"); + String xqzcFeature = EnumMapUtils.getEnumItemValue(agent,"资产性质","非流动资产"); + String xqzz = EnumMapUtils.getEnumItemValue(agent,"用途","住宅"); + String house_use = EnumMapUtils.getEnumItemValue(agent,"用途", (String) sourceMap.get("house_use")); + String rental_type = EnumMapUtils.getEnumItemValue(agent,"租售类型",(String) sourceMap.get("rental_type")); + String xqrental_type = EnumMapUtils.getEnumItemValue(agent,"租售类型","只租不售"); + String xqhs = EnumMapUtils.getEnumItemValue(agent,"房屋体系","保租房"); + String hs = EnumMapUtils.getEnumItemValue(agent,"房屋体系",(String) sourceMap.get("house_system")); + String land_nature = EnumMapUtils.getEnumItemValue(agent,"土地性质", (String) sourceMap.get("land_nature")); + String house_type = EnumMapUtils.getEnumItemValue(agent,"户型", (String) sourceMap.get("house_type")); + String has_lift = EnumMapUtils.getEnumItemValue(agent,"有无电梯", (String) sourceMap.get("has_lift")); + String raise_way = EnumMapUtils.getEnumItemValue(agent,"筹集方式", (String) sourceMap.get("raise_way")); + sourceMap.put("xqzcpLevel",xqzcpLevelValue); + sourceMap.put("zcTypeFwValue",zcTypeFwValue); + sourceMap.put("zcTypeLevel2",zcTypeLevel2); + sourceMap.put("xqzcBlock",xqzcBlock); + sourceMap.put("xqzcStatus",xqzcStatus); + sourceMap.put("xqzcFeature",xqzcFeature); + sourceMap.put("xqrental_type",xqrental_type); + sourceMap.put("xqhs",xqhs); + sourceMap.put("xqzz",xqzz); + sourceMap.put("house_use",house_use); + sourceMap.put("land_nature",land_nature); + sourceMap.put("rental_type",rental_type); + sourceMap.put("house_system",hs); + sourceMap.put("house_type",house_type); + sourceMap.put("has_lift",has_lift); + sourceMap.put("raise_way",raise_way); + } + + @Override + public void preProcess(Map sourceMap) { + FormExport formExport = new FormExport(); + String loginName = (String) sourceMap.get("loginName"); + //查询客商档案以及填充 + //处理小区资产档案信息 + super.preProcess(sourceMap); + enumMap(sourceMap); + try { + List params = new ArrayList<>(); + params.add((String) sourceMap.get("xqzcpLevelValue")); + params.add((String) sourceMap.get("zcTypeFwValue")); + params.add((String) sourceMap.get("village_name")); + String villageQuerySql = "SELECT 1 FROM formmain_0934 WHERE field0027 = ? and field0023 = ? and field0037 =?;"; + agent.execute(villageQuerySql, params); + List resList = agent.resultSetToList(); + if(resList == null || resList.size() == 0) { + //保障性住房小区的资产信息若不存在,则插入 + Map villageInsertInfo = new HashMap<>(); + villageInsertInfo.put("建档部门",getCreatorDept(agent,loginName));//建档部门 + villageInsertInfo.put("建档人员","系统管理员");//建档人员 + villageInsertInfo.put("建档日期",new Date()+"");//建档日期 + villageInsertInfo.put("资产板块",sourceMap.get("xqzcBlock")+"");//资产板块 + villageInsertInfo.put("建档单位","住保置业");//建档单位 + villageInsertInfo.put("资产层级",sourceMap.get("xqzcpLevelValue")+"");//资产层级 + villageInsertInfo.put("数据来源","住保资产系统(自定义)");//数据来源 + villageInsertInfo.put("资产名称",sourceMap.get("village_name") + "");//资产名称 + villageInsertInfo.put("资产状态",sourceMap.get("xqzcStatus") + "");//资产状态 + villageInsertInfo.put("资产性质",sourceMap.get("xqzcFeature") + "");//资产性质 + villageInsertInfo.put("资产类型",sourceMap.get("zcTypeFwValue") + "");//资产类型 + villageInsertInfo.put("资产二级类型",sourceMap.get("zcTypeLevel2") + "");//资产二级类型 + villageInsertInfo.put("资产种类","保障性住房");//资产种类 + villageInsertInfo.put("所属小区",sourceMap.get("village_name") +"");//小区 + villageInsertInfo.put("用途",sourceMap.get("house_use") +"");//用途 + villageInsertInfo.put("租售类型",sourceMap.get("xqrental_type") +"");//租售类型 + villageInsertInfo.put("/房屋体系",sourceMap.get("house_system") +"");//房屋体系 +// villageInsertInfo.put("field0058",sourceMap.get(""));//坐落位置 + villageInsertInfo.put("土地性质",sourceMap.get("land_nature") +"");//土地性质 + villageInsertInfo.put("是否产权抵押",sourceMap.get("assetBacked") +""); //是否产权抵押 + formExport.setValues(FormExportUtil.setFormValue(villageInsertInfo)); + getFormFactory().importBusinessFormData(loginName, "zcbd1",formExport, new String[] {}); + } + }catch (Exception e) { + + } + + } + + private String getCreatorDept(JDBCAgent agent,String loginName) { + OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager"); + try { + V3xOrgMember member = orgManager.getMemberByLoginName(loginName); + Long departmentId = member.getOrgDepartmentId(); + V3xOrgDepartment department = orgManager.getDepartmentById(departmentId); + return department == null ? "" : department.getName(); + } catch (BusinessException e) { + return null; + } + } + + @Override + public Map> getFieldProcessors() { + return null; + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("资产类型",sourceMap.get("zcTypeFwValue"));//填充资产类型 + targetMap.put("资产二级类型",sourceMap.get("zcTypeLevel2"));//填充资产二级类型 + targetMap.put("楼栋",sourceMap.get("building_name"));//填充楼栋 + targetMap.put("单元",sourceMap.get("unit_name"));//填充单元 + targetMap.put("具体楼层",sourceMap.get("specific_floor"));//填充具体楼层 + targetMap.put("房屋朝向",sourceMap.get("house_orientation"));//填充房屋朝向 + targetMap.put("户型",sourceMap.get("house_type"));//填充户型 + targetMap.put("有无电梯",sourceMap.get("has_lift"));//填充有无电梯 + targetMap.put("用途",sourceMap.get("house_use"));//填充用途 + targetMap.put("房屋体系",sourceMap.get("house_system"));//填充房屋体系 + targetMap.put("租售类型",sourceMap.get("rental_type"));//填充租售类型 + targetMap.put("筹集方式",sourceMap.get("raise_way"));//填充筹集方式 + targetMap.put("所属小区",sourceMap.get("village_name"));//填充所属小区 + targetMap.put("土地性质",sourceMap.get("land_nature"));//填充土地性质 + + targetMap.put("房号",sourceMap.get("room_number"));//填充房号 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractBillMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractBillMode.java new file mode 100644 index 0000000..513a0a6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractBillMode.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Map; +import java.util.function.Function; + +public class ContractBillMode extends AbstractFeeDataMapMode{ + + + @Override + public void preProcess(Map map) { + String recordBill = EnumMapUtils.getEnumItemValue(agent,"是否入账","未入"); + String incomeOrCost = EnumMapUtils.getEnumItemValue(agent,"收支类型","收"); + map.put("recordBill",recordBill); + map.put("incomeOrCost",incomeOrCost); + } + + @Override + public Map> getFieldProcessors() { + return null; + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("是否入账",sourceMap.get("recordBill")); //填充是否入账 + targetMap.put("收支类型",sourceMap.get("incomeOrCost")); //填充收支类型 + targetMap.put("住保-费用类型",sourceMap.get("bill_type")); //填充费用类型 + targetMap.put("主键",sourceMap.get("bill_id")); //主键 + targetMap.put("应收金额",sourceMap.get("bill_amount")); //填充应收金额 + targetMap.put("本次实收金额",sourceMap.get("bill_amount")); //填充本次实收金额 + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractMode.java new file mode 100644 index 0000000..28f636d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/ContractMode.java @@ -0,0 +1,107 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.dao.KsQueryDao; +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class ContractMode extends AbstractContractDataMapMode { + + @Override + public void preProcess(Map map) { + String zcType = EnumMapUtils.getEnumItemValue(agent,"资产类型","房屋"); + String zcBlock = EnumMapUtils.getEnumItemValue(agent,"资产板块","03不动产"); + String ksName = (String) map.get("b_name"); + String zcTypeLevel2 = (String) map.get("asset_type_name"); + if(zcTypeLevel2.equals("保障房")){ + map.put("asset_type_name","保障性住房"); + }else if(zcTypeLevel2.equals("国资门面")) { + map.put("asset_type_name","住宅"); + }else { + map.put("asset_type_name","厂房"); + } + map.put("zcType",zcType); + map.put("zcBlock",zcBlock); + map.put("asset_type_name",EnumMapUtils.getEnumItemValue(agent,"资产二级类型", (String) map.get("asset_type_name"))); + KsQueryDao ksQueryDao = new KsQueryDao(); + try { + Map ksMap = ksQueryDao.queryByName(ksName, "where field0006 = ?", ksName); + if(map != null && !map.isEmpty()) { + map.put("u8ccode",ksMap.get("field0092")); + map.put("signCorpNo",ksMap.get("field0029")); + } + } catch (Exception e) { + + } + } + + @Override + public Map> getFieldProcessors() { + return null; + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + Map subTableMap = new HashMap<>(); + + targetMap.put("subTable",subTableMap); + targetMap.put("合同ID",sourceMap.get("contract_id")); //填充合同ID + targetMap.put("合同编号",sourceMap.get("contract_no")); //填充合同编号 + targetMap.put("签订单位编号",sourceMap.get("signCorpNo")); //填充签订单位编号 + targetMap.put("签订单位",sourceMap.get("a_name"));//填充签订单位 + targetMap.put("合同金额",sourceMap.get("contract_total_amount"));//合同金额 + targetMap.put("合同开始日期",sourceMap.get("tenant_start_time"));//合同开始日期 + targetMap.put("合同截止日期",sourceMap.get("tenant_end_time"));//合同截止日期 + targetMap.put("U8C客商编号",sourceMap.get("u8ccode"));//U8C客商编号 + targetMap.put("客商名称",sourceMap.get("b_name"));//客商名称 + targetMap.put("联系方式",sourceMap.get("b_connect"));//联系方式 + targetMap.put("甲方名称",sourceMap.get("a_name"));//甲方名称 + targetMap.put("乙方名称",sourceMap.get("b_name"));//乙方名称 + targetMap.put("合同状态",sourceMap.get("contract_state"));//合同状态 + targetMap.put("累计已收租金",sourceMap.get("contract_receive_amount"));//累计已收租金 + targetMap.put("剩余未收租金",sourceMap.get("contract_remaining_amount"));//剩余未收租金 + + //填充子表 + subTableMap.put("不动产板块",sourceMap.get("zcBlock"));//资产板块 + subTableMap.put("资产类型",sourceMap.get("zcType"));//资产类型 + subTableMap.put("资产二级类型",sourceMap.get("asset_type_name"));//资产二级类型 + subTableMap.put("所属小区",sourceMap.get("village_name")); //填充小区名 + subTableMap.put("楼栋",sourceMap.get("building_name")); //填充楼栋 + subTableMap.put("单元",sourceMap.get("unit_name")); //填充单元 + subTableMap.put("房号",sourceMap.get("house_number")); //填充房号 + subTableMap.put("住保资产编号",sourceMap.get("house_id")); + subTableMap.put("OA资产编号",sourceMap.get("house_id")); + StringBuilder stringBuilder = new StringBuilder(""); + if(sourceMap.get("village_name") != null) { + stringBuilder.append(sourceMap.get("village_name")); + } + if(sourceMap.get("building_name") != null) { + if(sourceMap.get("village_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("building_name")); + } + if(sourceMap.get("variable_001") != null) { + if(sourceMap.get("village_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("variable_001")); + } + if(sourceMap.get("room_number") != null) { + if(sourceMap.get("building_name") != null) { + stringBuilder.append("_"); + } + stringBuilder.append(sourceMap.get("room_number")); + } + subTableMap.put("资产名称",stringBuilder.toString()); //填充资产名称 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzcfAssetMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzcfAssetMode.java new file mode 100644 index 0000000..3638df0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzcfAssetMode.java @@ -0,0 +1,47 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Map; +import java.util.function.Function; + +public class GzcfAssetMode extends AbstractAssetDataMapMode{ + + + @Override + public void preProcess(Map map) { + super.preProcess(map); + String has_lift = EnumMapUtils.getEnumItemValue(agent,"有无电梯", (String) map.get("has_lift")); + String zcTypeFwValue = EnumMapUtils.getEnumItemValue(agent,"资产类型","房屋"); + String zcTypeLevel2 = EnumMapUtils.getEnumItemValue(agent,"资产二级类型","厂房"); + String house_use = EnumMapUtils.getEnumItemValue(agent,"用途", (String) map.get("house_use")); + map.put("zcTypeFwValue",zcTypeFwValue); + map.put("zcTypeLevel2",zcTypeLevel2); + map.put("has_lift",has_lift); + map.put("house_use",house_use); + } + + @Override + public Map> getFieldProcessors() { + return null; + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("资产类型",sourceMap.get("zcTypeFwValue"));//填充资产类型 + targetMap.put("资产二级类型",sourceMap.get("zcTypeLevel2"));//填充资产二级类型 + targetMap.put("坐落位置",sourceMap.get("located_street"));//填充坐落位置 + targetMap.put("有无电梯",sourceMap.get("has_lift"));//填充有无电梯 + targetMap.put("用途",sourceMap.get("house_use"));//填充房屋用途 + + targetMap.put("房号",sourceMap.get("room_number"));//填充房号 + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzfwAssetMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzfwAssetMode.java new file mode 100644 index 0000000..e155bf1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GzfwAssetMode.java @@ -0,0 +1,51 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; + +public class GzfwAssetMode extends AbstractAssetDataMapMode{ + + @Override + public void preProcess(Map map) { + super.preProcess(map); + String zcTypeFwValue = EnumMapUtils.getEnumItemValue(agent,"资产类型","房屋"); + String zcTypeLevel2 = EnumMapUtils.getEnumItemValue(agent,"资产二级类型","住宅"); + String has_lift = EnumMapUtils.getEnumItemValue(agent,"有无电梯", (String) map.get("has_lift")); + String house_use = EnumMapUtils.getEnumItemValue(agent,"用途", (String) map.get("house_use")); + String house_type = EnumMapUtils.getEnumItemValue(agent,"房屋类型", (String) map.get("variable_002")); + map.put("zcTypeFwValue",zcTypeFwValue); + map.put("zcTypeLevel2",zcTypeLevel2); + map.put("has_lift",has_lift); + map.put("house_use",house_use); + map.put("variable_002",house_type); + } + + @Override + public Map> getFieldProcessors() { + return Collections.emptyMap(); + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("资产类型",sourceMap.get("zcTypeFwValue"));//填充资产类型 + targetMap.put("资产二级类型",sourceMap.get("zcTypeLevel2"));//填充资产二级类型 + targetMap.put("资产种类",sourceMap.get("variable_002"));//填充资产种类 + targetMap.put("楼栋",sourceMap.get("variable_001"));//填充楼栋 + targetMap.put("坐落位置",sourceMap.get("located_street"));//填充坐落位置 + targetMap.put("有无电梯",sourceMap.get("has_lift"));//填充有无电梯 + targetMap.put("用途",sourceMap.get("house_use"));//填充房屋用途 + + targetMap.put("房号",sourceMap.get("room_number"));//填充房号 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GztdAssetMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GztdAssetMode.java new file mode 100644 index 0000000..e4b93a0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/GztdAssetMode.java @@ -0,0 +1,47 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; + +public class GztdAssetMode extends AbstractAssetDataMapMode{ + + @Override + public void preProcess(Map map) { + super.preProcess(map); + String zcTypeFwValue = EnumMapUtils.getEnumItemValue(agent,"资产类型","土地"); + String zcTypeLevel2 = EnumMapUtils.getEnumItemValue(agent,"资产二级类型","自用出让地"); + String land_nature = EnumMapUtils.getEnumItemValue(agent,"土地性质", (String) map.get("land_nature")); + map.put("zcTypeFwValue",zcTypeFwValue); + map.put("zcTypeLevel2",zcTypeLevel2); + map.put("land_nature",land_nature); + } + + @Override + public Map> getFieldProcessors() { + return Collections.emptyMap(); + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("资产类型",sourceMap.get("zcTypeFwValue"));//填充资产类型 + targetMap.put("资产二级类型",sourceMap.get("zcTypeLevel2"));//填充资产二级类型 + targetMap.put("坐落位置",sourceMap.get("located_street"));//填充坐落位置 + targetMap.put("土地性质",sourceMap.get("land_nature"));//填充土地性质 +// targetMap.put("field0079",sourceMap.get(""));//填充资产所属单位 +// targetMap.put("field0062",sourceMap.get(""));//填充管理单位 +// targetMap.put("field0204",sourceMap.get(""));//填充建设单位编号 +// targetMap.put("field0205",sourceMap.get(""));//填充建设单位 +// targetMap.put("field0063",sourceMap.get(""));//填充建设产权单位编号 +// targetMap.put("field0064",sourceMap.get(""));//填充建设产权单位 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/HydropowerRechargeDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/HydropowerRechargeDataMapMode.java new file mode 100644 index 0000000..906db57 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/HydropowerRechargeDataMapMode.java @@ -0,0 +1,41 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; + +public class HydropowerRechargeDataMapMode extends AbstractFeeDataMapMode{ + + @Override + public void preProcess(Map map) { + super.preProcess(map); + String incomeOrCost = EnumMapUtils.getEnumItemValue(agent,"收支类型","收"); + map.put("incomeOrCost",incomeOrCost); + } + + @Override + public Map> getFieldProcessors() { + return Collections.emptyMap(); + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("收支类型",sourceMap.get("incomeOrCost")); //填充收支类型 + targetMap.put("到账日期",sourceMap.get("recharge_time")); //填充到账日期 + targetMap.put("住保-费用类型","水电费"); //填充费用类型 + targetMap.put("住保-账单生成日期",sourceMap.get("recharge_time")); //填充账单生成日期 + targetMap.put("实收日期",sourceMap.get("recharge_time")); //填充实收日期 + targetMap.put("住保-支付订单状态",sourceMap.get("recharge_status")); //填充订单状态 + targetMap.put("订单描述说明",sourceMap.get("recharge_desc")); //填充订单说明 + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/RefundDataMapMode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/RefundDataMapMode.java new file mode 100644 index 0000000..6f966b1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datamap/RefundDataMapMode.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.src_ydctdatasync.datamap; + +import com.seeyon.apps.src_ydctdatasync.utils.EnumMapUtils; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; + +public class RefundDataMapMode extends AbstractFeeDataMapMode{ + + @Override + public void preProcess(Map map) { + super.preProcess(map); + String incomeOrCost = EnumMapUtils.getEnumItemValue(agent,"收支类型","支"); + map.put("incomeOrCost",incomeOrCost); + } + + @Override + public Map> getFieldProcessors() { + return Collections.emptyMap(); + } + + @Override + public boolean support() { + return false; + } + + @Override + public void transfer(Object target, Object source) { + Map targetMap = (Map) target; + Map sourceMap = (Map) source; + targetMap.put("收支类型",sourceMap.get("incomeOrCost")); //填充收支类型 + targetMap.put("住保-费用类型",sourceMap.get("refund_type")); //填充费用类型 + targetMap.put("住保-支付订单状态",sourceMap.get("refund_status")); //填充订单状态 + targetMap.put("订单描述说明",sourceMap.get("recharge_desc")); //填充订单说明 + targetMap.put("本次实付金额",sourceMap.get("refund_amount")); //填充本次实付金额 + targetMap.put("住保-退还账单时间",sourceMap.get("refund_bill_time")); //填充退还账单时间 + targetMap.put("实付日期",sourceMap.get("refund_time")); //填充实付日期 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datasource/DataSource.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datasource/DataSource.java new file mode 100644 index 0000000..9143ca8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/datasource/DataSource.java @@ -0,0 +1,129 @@ +package com.seeyon.apps.src_ydctdatasync.datasource; + +import com.seeyon.apps.src_ydctdatasync.config.DataSourceConfig; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Queue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +public class DataSource { + private DataSourceConfig config; + private final int maximumPoolSize = 5; + private final int minimumIdle = 3; + // 连接队列 + private final BlockingQueue idleConnections = new LinkedBlockingQueue<>(); + private final Queue activeConnections = new ConcurrentLinkedQueue<>(); + + // 构造方法 + public DataSource() { + + } + + public DataSourceConfig getConfig() { + return config; + } + + public void setConfig(DataSourceConfig config) { + this.config = config; + } + + // 创建一个新的数据库连接 + private Connection createNewConnection() { + try { + Class.forName(config.getDriver()); + Connection realConnection = DriverManager.getConnection(config.getUrl(),config.getUsername(), config.getPassword()); + return (Connection) Proxy.newProxyInstance( + realConnection.getClass().getClassLoader(), + new Class[]{Connection.class}, + new ConnectionProxyHandler(realConnection, this) + ); + } catch (SQLException e) { + throw new RuntimeException("Failed to create a new connection", e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + + // 从连接池获取连接 + public Connection getConnection() throws SQLException { + Connection connection = idleConnections.poll(); + if (connection == null) { + synchronized (this) { + if (activeConnections.size() + idleConnections.size() < maximumPoolSize) { + connection = createNewConnection(); + } else { + try { + // 等待空闲连接释放 + connection = idleConnections.poll(10, TimeUnit.SECONDS); + if (connection == null) { + throw new SQLException("No available connection in the pool"); + } + } catch (InterruptedException e) { + throw new SQLException("Interrupted while waiting for a connection", e); + } + } + } + } + + if (connection != null) { + activeConnections.offer(connection); + } + + return connection; + } + + // 归还连接到连接池 + public void releaseConnection(Connection connection) { + if (connection != null) { + activeConnections.remove(connection); + idleConnections.offer(connection); + } + } + + // 销毁连接池中的所有连接 + public void close() { + for (Connection connection : idleConnections) { + closeConnection(connection); + } + for (Connection connection : activeConnections) { + closeConnection(connection); + } + } + + private void closeConnection(Connection connection) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + // 代理处理器,用于拦截 close 方法 + private class ConnectionProxyHandler implements InvocationHandler { + private final Connection realConnection; + private final DataSource pool; + + public ConnectionProxyHandler(Connection realConnection, DataSource pool) { + this.realConnection = realConnection; + this.pool = pool; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if ("close".equals(method.getName())) { + pool.releaseConnection((Connection) proxy); + return null; + } + return method.invoke(realConnection, args); + } + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/quartz/YdzbDataSyncQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/quartz/YdzbDataSyncQuartz.java new file mode 100644 index 0000000..31cda0f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/quartz/YdzbDataSyncQuartz.java @@ -0,0 +1,426 @@ +package com.seeyon.apps.src_ydctdatasync.quartz; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_ydctdatasync.dao.FormExportUtil; +import com.seeyon.apps.src_ydctdatasync.datamap.*; +import com.seeyon.apps.src_ydctdatasync.datasource.DataSource; +import com.seeyon.apps.src_ydctdatasync.utils.StatementQueryUtil; +import com.seeyon.apps.src_ydctdatasync.utils.TimeUtils; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import org.springframework.beans.factory.DisposableBean; + +import java.sql.Connection; +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class YdzbDataSyncQuartz extends AbstractQuartzTask implements DisposableBean { + + private static Log log = Log.get(YdzbDataSyncQuartz.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + private FormFactory formFactory; + private DataSource ydzbThirdDataSource = (DataSource) AppContext.getBean("ydzbThirdDataSource"); + private JDBCAgent agent = new JDBCAgent(); + private String zcTable; + private String zcFormNo; + private String contractTable; + private String contractFormNo; + private String feeFormNo; + private String loginName; + + public String getZcTable() { + return zcTable; + } + + public void setZcTable(String zcTable) { + this.zcTable = zcTable; + } + + public String getZcFormNo() { + return zcFormNo; + } + + public void setZcFormNo(String zcFormNo) { + this.zcFormNo = zcFormNo; + } + + public String getContractTable() { + return contractTable; + } + + public void setContractTable(String contractTable) { + this.contractTable = contractTable; + } + + public String getContractFormNo() { + return contractFormNo; + } + + public void setContractFormNo(String contractFormNo) { + this.contractFormNo = contractFormNo; + } + + public String getFeeFormNo() { + return feeFormNo; + } + + public void setFeeFormNo(String feeFormNo) { + this.feeFormNo = feeFormNo; + } + + public String getLoginName() { + return loginName; + } + + public void setLoginName(String loginName) { + this.loginName = loginName; + } + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + @Override + public String getName() { + return "宜都城投资产数据同步任务"; + } + + @Override + public String taskRun(String arg0) { + log.info("宜都城投资产数据同步任务任务开始"); + long startTime = System.currentTimeMillis(); + try (Connection connection = ydzbThirdDataSource.getConnection()){ + processZcData(connection); + processContractData(connection); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (!arg0.equals("-1")) { + try { + Date date = df.parse(arg0); + processFeeData(connection, date); + }catch (ParseException e) { + throw e; + } + } + } catch (Exception e) { + log.error("宜都城投资产数据同步任务执行失败"); + log.error(e.getMessage(),e); + } + log.info("宜都城投资产数据同步任务任务结束,耗时:"+ (System.currentTimeMillis() - startTime)+ " ms"); + return null; + } + + //处理合同数据 + private void processContractData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步合同表数据"); + String countQuerySql = "SELECT count(*) FROM zb_contract;"; + String pageQuerySql = "SELECT * FROM zzb_contract limit 100 OFFSET ?;"; + ContractMode contractMode = new ContractMode(); + contractMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> contractDataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : contractDataList) { + Map targetMap = new HashMap<>(); + contractMode.preProcess(rowMap); + contractMode.transfer(targetMap,rowMap); + Map subMap = (Map)targetMap.get("subTable"); + targetMap.remove("subTable"); + upsertData(contractFormNo,convert2StringValue(targetMap),contractTable,convert2StringValue(subMap),"",""); + } + } + log.info("合同表数据同步结束"); + } + + //处理费用数据 + private void processFeeData(Connection connection,Date date) throws SQLException, BusinessException, ServiceException { + Date startDate = null; + Date endDate = null; + if(date == null) { + startDate = TimeUtils.startOfYesterday(); + endDate = TimeUtils.startOf(new Date()); + }else { + startDate = TimeUtils.startOf(TimeUtils.before(date,1)); + endDate = TimeUtils.startOf(date); + } + log.info("开始同步费用数据"); + processContractBillData(connection,startDate,endDate); + processRefundData(connection,startDate,endDate); + processHydpowerRechargeData(connection,startDate,endDate); + log.info("费用数据同步结束"); + } + + //处理合同费用 + private void processContractBillData(Connection connection,Date startDate,Date endDate) throws SQLException, BusinessException, ServiceException { + log.info("开始同步合同费用数据"); + String countQuerySql = "SELECT count(*) FROM zb_contract_bill where;"; + String pageQuerySql = "SELECT * FROM zb_contract_bill where limit 100 OFFSET ?;"; + ContractBillMode contractBillMode = new ContractBillMode(); + contractBillMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection,null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> gztdDataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : gztdDataList) { + Map targetMap = new HashMap<>(); + contractBillMode.preProcess(rowMap); + contractBillMode.transfer(targetMap,rowMap); + + } + } + log.info("合同费用数据同步完成"); + } + + private Map convert2StringValue(Map oriMap) { + Map resMap = new HashMap<>(); + for (String key : oriMap.keySet()) { + resMap.put(key,oriMap.get(key)+""); + } + return resMap; + } + + //处理水电费 + private void processHydpowerRechargeData(Connection connection,Date startDate,Date endDate) throws SQLException, BusinessException, ServiceException { + log.info("开始同步水电费数据"); + String countQuerySql = "SELECT count(*) FROM zb_hydropower_recharge where recharge_time >= ? and recharge_time <=;"; + String pageQuerySql = "SELECT * FROM zb_hydropower_recharge where recharge_time >= ? and recharge_time <= ? limit 100 OFFSET ?;"; + HydropowerRechargeDataMapMode rechargeDataMapMode = new HydropowerRechargeDataMapMode(); + rechargeDataMapMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, startDate,endDate); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql, connection, startDate,endDate,i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + rechargeDataMapMode.preProcess(rowMap); + rechargeDataMapMode.transfer(targetMap,rowMap); + insertData(feeFormNo,convert2StringValue(targetMap)); + } + } + log.info("水电费数据同步完成"); + } + + //处理退费 + private void processRefundData(Connection connection,Date startDate,Date endDate) throws SQLException, BusinessException, ServiceException { + log.info("开始同步退费数据"); + String countQuerySql = "SELECT count(*) FROM zb_refund where create_time >= ? and create_time <= ?;"; + String pageQuerySql = "SELECT * FROM zb_contract_bill where create_time >= ? and create_time <= ? limit 100 OFFSET ?;"; + RefundDataMapMode refundDataMapMode = new RefundDataMapMode(); + refundDataMapMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, startDate,endDate); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql,connection, startDate,endDate,i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + refundDataMapMode.preProcess(rowMap); + refundDataMapMode.transfer(targetMap,rowMap); + insertData(feeFormNo,convert2StringValue(targetMap)); + } + } + log.info("退费数据同步结束"); + } + + //处理资产数据 + private void processZcData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步资产表数据"); + processBzfHouseData(connection); + processGzcfData(connection); + processGzfwData(connection); + processGztdData(connection); + log.info("资产表数据同步结束"); + } + + private void processGztdData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步国资土地数据"); + String countQuerySql = "SELECT count(*) FROM zb_gztd_house;"; + String pageQuerySql = "SELECT * FROM zb_gztd_house limit 100 OFFSET ?;"; + GztdAssetMode gztdAssetMode = new GztdAssetMode(); + gztdAssetMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + gztdAssetMode.preProcess(rowMap); + gztdAssetMode.transfer(targetMap,rowMap); + upsertData(zcFormNo,convert2StringValue(targetMap),zcTable,"WHERE field0031 = ?",targetMap.get("资产编号") +""); + } + } + log.info("国资土地数据同步完成"); + } + + private void processGzfwData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步国资房屋数据"); + String countQuerySql = "SELECT count(*) FROM zb_gzfw_house;"; + String pageQuerySql = "SELECT * FROM zb_gzfw_house limit 100 OFFSET ?;"; + GzfwAssetMode gzfwAssetMode = new GzfwAssetMode(); + gzfwAssetMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + gzfwAssetMode.preProcess(rowMap); + gzfwAssetMode.transfer(targetMap,rowMap); + upsertData(zcFormNo,convert2StringValue(targetMap),zcTable,"WHERE field0031 = ?",targetMap.get("资产编号") + ""); + } + } + log.info("国资房屋数据同步结束"); + } + + private void processGzcfData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步国资厂房数据"); + String countQuerySql = "SELECT count(*) FROM zb_gzcf_house;"; + String pageQuerySql = "SELECT * FROM zb_gzcf_house limit 100 OFFSET ?;"; + GzcfAssetMode gzcfAssetMode = new GzcfAssetMode(); + gzcfAssetMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + gzcfAssetMode.preProcess(rowMap); + gzcfAssetMode.transfer(targetMap,rowMap); + upsertData(zcFormNo,convert2StringValue(targetMap),getZcTable(),"WHERE field0031 = ?",targetMap.get("资产编号") + ""); + } + } + log.info("国资厂房数据同步完成"); + } + + private void processBzfHouseData(Connection connection) throws SQLException, BusinessException, ServiceException { + log.info("开始同步保障房数据"); + String countQuerySql = "SELECT count(*) FROM zb_bzf_house;"; + String pageQuerySql = "SELECT * FROM zb_bzf_house limit 100 OFFSET ?;"; + BzfAssetMode bzfAssetMode = new BzfAssetMode(); + bzfAssetMode.setAgent(agent); + long count = StatementQueryUtil.queryCount(countQuerySql,connection, null); + int totalPage = (int)Math.ceil((double)count / 100); + for(int i = 0; i < totalPage;i++) { + List> dataList = StatementQueryUtil.queryList(pageQuerySql, connection, i*100); + for (Map rowMap : dataList) { + Map targetMap = new HashMap<>(); + rowMap.put("loginName",loginName); + bzfAssetMode.preProcess(rowMap); + bzfAssetMode.transfer(targetMap,rowMap); + upsertData(zcFormNo,convert2StringValue(targetMap),zcTable,"WHERE field0031 = ?",targetMap.get("资产编号") + ""); + } + } + log.info("保障房数据同步结束"); + } + + private void upsertData(String formNo,Map targetMap,String table,String whereSql,String param) throws BusinessException, SQLException, ServiceException { + //不存在则插入,存在则更新 + List params = new ArrayList<>(); + params.add(param); + String querySql = "SELECT * FROM " + table + whereSql +";"; + Map existData = null; + try { + //agent.execute(querySql,params); + existData = agent.resultSetToMap(); + } catch (Exception e) { + + } + if(existData != null && existData.size() > 0) { + for (String key : targetMap.keySet()) { + existData.put(key,targetMap.get(key)+""); + Map updateSqlMap = generateUpdateSql(existData, table, whereSql, param); + agent.execute((String) updateSqlMap.get("sql"),updateSqlMap.get("params")); + } + }else { + FormExport formExport = new FormExport(); + formExport.setValues(FormExportUtil.setFormValue(targetMap)); + getFormFactory().importBusinessFormData(loginName, formNo,formExport, new String[] {}); + } + + } + + private void insertData(String formNo,Map targetMap) throws BusinessException, SQLException, ServiceException { + FormExport formExport = new FormExport(); + formExport.setValues(FormExportUtil.setFormValue(targetMap)); + getFormFactory().importBusinessFormData(loginName, formNo,formExport, new String[] {}); + } + + private void upsertData(String formNo,Map targetMap,String table,Map subTableMap,String whereSql,String param) throws BusinessException, SQLException, ServiceException { + //不存在则插入,存在则更新 + List params = new ArrayList<>(); + params.add(param); + String querySql = "SELECT * FROM " + table + whereSql +";"; + Map existData = null; + try { + agent.execute(querySql,params); + existData = agent.resultSetToMap(); + } catch (Exception e) { + + } + if(existData != null && existData.size() > 0) { + for (String key : targetMap.keySet()) { + existData.put(key,targetMap.get(key)+""); + Map updateSqlMap = generateUpdateSql(existData, table, whereSql, param); + agent.execute((String) updateSqlMap.get("sql"),updateSqlMap.get("params")); + } + }else { + FormExport formExport = new FormExport(); + formExport.setValues(FormExportUtil.setFormValue(targetMap)); + formExport.setSubordinateForms(FormExportUtil.setSubordinateFormValue(subTableMap)); + getFormFactory().importBusinessFormData(loginName, formNo,formExport, new String[] {}); + } + + } + + private Map generateUpdateSql(Map fieldValues, String tableName, String whereClause,String clauseValue) { + if (fieldValues == null || fieldValues.isEmpty()) { + throw new IllegalArgumentException("Field values cannot be null or empty"); + } + if (tableName == null || tableName.trim().isEmpty()) { + throw new IllegalArgumentException("Table name cannot be null or empty"); + } + if (whereClause == null || whereClause.trim().isEmpty()) { + throw new IllegalArgumentException("Where clause cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("UPDATE ").append(tableName).append(" SET "); + List params = new ArrayList<>(); + // Build the SET clause + int fieldCount = 0; + for (Map.Entry entry : fieldValues.entrySet()) { + if (fieldCount > 0) { + sqlBuilder.append(", "); + } + sqlBuilder.append(entry.getKey()).append(" = ?"); + params.add(entry.getValue()); + fieldCount++; + } + params.add(clauseValue); + // Append the WHERE clause + sqlBuilder.append(whereClause); + // Create result map + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + @Override + public void destroy() throws Exception { + ydzbThirdDataSource.close(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/DataInsertWithFormUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/DataInsertWithFormUtils.java new file mode 100644 index 0000000..cc50cab --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/DataInsertWithFormUtils.java @@ -0,0 +1,36 @@ +package com.seeyon.apps.src_ydctdatasync.utils; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; + +public class DataInsertWithFormUtils { + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + /** + * + * @param loginName 登录名 + * @param formNo 表单模板编号 + * @param formExport 要插入的表单数据 + */ + public void dataInsert(String loginName , String formNo , FormExport formExport) { + try { + getFormFactory().importBusinessFormData(loginName, formNo, + formExport, new String[] {}); + } catch (ServiceException e) { + + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/EnumMapUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/EnumMapUtils.java new file mode 100644 index 0000000..694ba77 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/EnumMapUtils.java @@ -0,0 +1,39 @@ +package com.seeyon.apps.src_ydctdatasync.utils; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.List; +import java.util.Map; + +public class EnumMapUtils { + public static String getEnumItemValue(JDBCAgent agent,String groupValue,String targetValue) { + String queryIdSql = "SELECT ID FROM ctp_enum WHERE `ENUMNAME` = ?"; + Long enumId = null; + try { + agent.execute(queryIdSql,groupValue); + Map map = agent.resultSetToMap(); + enumId = (Long)map.get("id"); + } catch (Exception e) { + return null; + } + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return null; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getShowvalue().equals(targetValue)) { + return enumItem.getValue(); + } + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/StatementQueryUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/StatementQueryUtil.java new file mode 100644 index 0000000..8519f48 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/StatementQueryUtil.java @@ -0,0 +1,102 @@ +package com.seeyon.apps.src_ydctdatasync.utils; + +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class StatementQueryUtil { + + /** + * 执行查询语句并将结果转换为 List> + * @param sql 查询语句 + * @param params 查询参数 + * @return 查询结果列表 + * @throws SQLException 数据库操作异常 + */ + public static List> queryList(String sql,Connection connection,Object ...params) throws SQLException { + List> resultList = new ArrayList<>(); + try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + // 设置参数 + for (int i = 0; params != null && i < params.length; i++) { + preparedStatement.setObject(i + 1, params[i]); + } + + // 执行查询 + try (ResultSet resultSet = preparedStatement.executeQuery()) { + // 获取元数据 + ResultSetMetaData metaData = resultSet.getMetaData(); + int columnCount = metaData.getColumnCount(); + + // 遍历结果集 + while (resultSet.next()) { + Map rowMap = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + String columnName = metaData.getColumnLabel(i); + Object columnValue = resultSet.getObject(i); + rowMap.put(columnName, columnValue); + } + resultList.add(rowMap); + } + } + } + return resultList; + } + + /** + * + * @param sql 查询语句 + * @param params 查询参数 + * @return 查询结果列表 + * @throws SQLException 数据库操作异常 + */ + public static Map querySingle(String sql,Connection connection,Object ...params) throws SQLException { + Map resMap = new HashMap<>(); + try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + // 设置参数 + for (int i = 0; params != null && i < params.length; i++) { + preparedStatement.setObject(i + 1, params[i]); + } + + // 执行查询 + try (ResultSet resultSet = preparedStatement.executeQuery()) { + // 获取元数据 + ResultSetMetaData metaData = resultSet.getMetaData(); + // 填充结果 + if(!resultSet.next()) { + return resMap; + } + String columnName = metaData.getColumnLabel(0); + Object columnValue = resultSet.getObject(0); + resMap.put(columnName, columnValue); + } + } + return resMap; + } + + /** + * + * @param sql 查询语句 + * @param params 查询参数 + * @return 查询结果条数 + * @throws SQLException 数据库操作异常 + */ + public static long queryCount(String sql, Connection connection,Object... params) throws SQLException { + long count = 0; + try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + // 设置参数 + for (int i = 0; params != null && i < params.length; i++) { + preparedStatement.setObject(i + 1, params[i]); + } + + // 执行查询 + try (ResultSet resultSet = preparedStatement.executeQuery()) { + if (resultSet.next()) { + count = resultSet.getLong(1); // 获取第一列的值 + } + } + } + return count; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/TimeUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/TimeUtils.java new file mode 100644 index 0000000..7e9b6cd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ydctdatasync/utils/TimeUtils.java @@ -0,0 +1,533 @@ +package com.seeyon.apps.src_ydctdatasync.utils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public class TimeUtils { + public static final String DEFAULT_PATTERN = "yyyy-MM-dd"; + + public static String format(Date date) { + return format(date, DEFAULT_PATTERN); + } + + public static String format(Date date, String pattern) { + if (date == null) { + return ""; + } + DateFormat dateFormat = new SimpleDateFormat(pattern); + return dateFormat.format(date); + } + + /** + * UTC时间转换为本地时间;待解析的字符串必须以yyyy-MM-dd格式开头 + */ + public static Date utcParse(String utcTimeStr) throws ParseException { + String utcTimePattern = "yyyy-MM-dd"; + String subTime = utcTimeStr.substring(10);// UTC时间格式以 yyyy-MM-dd 开头,将utc时间的前10位截取掉,之后是含有多时区时间格式信息的数据 + // 处理当后缀为:+8:00时,转换为:+08:00 或 -8:00转换为-08:00 + if (subTime.indexOf("+") != -1) { + subTime = changeUtcSuffix(subTime, "+"); + } + if (subTime.indexOf("-") != -1) { + subTime = changeUtcSuffix(subTime, "-"); + } + utcTimeStr = utcTimeStr.substring(0, 10) + subTime; + // 依据传入函数的utc时间,得到对应的utc时间格式 + // 步骤一:处理 T + if (utcTimeStr.indexOf("T") != -1) { + utcTimePattern = utcTimePattern + "'T'"; + } + // 兼容yyyy-MM-dd的格式,这种格式不需要加空格 + if(utcTimeStr.indexOf("T") == -1 && subTime.length() > 0) { + utcTimePattern = utcTimePattern + " "; + } + // 步骤二:处理毫秒SSS + if (utcTimeStr.indexOf(".") != -1) { + utcTimePattern = utcTimePattern + "HH:mm:ss.SSS"; + } else if (utcTimeStr.indexOf(":") != -1) { + utcTimePattern = utcTimePattern + "HH:mm:ss"; + } + // 步骤三:处理时区问题 + if (subTime.indexOf("+") != -1 || subTime.indexOf("-") != -1) { + utcTimePattern = utcTimePattern + "XXX"; + } else if (subTime.indexOf("Z") != -1) { + utcTimePattern = utcTimePattern + "'Z'"; + } + DateFormat dateFormat = new SimpleDateFormat(utcTimePattern); + if (subTime.indexOf("Z") != -1) { + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + return dateFormat.parse(utcTimeStr); + } + + private static String changeUtcSuffix(String subTime, String sign) { + String timeSuffix = null; + String[] splitTimeArrayOne = subTime.split("\\\\" + sign); + String[] splitTimeArrayTwo = splitTimeArrayOne[1].split(":"); + if (splitTimeArrayTwo[0].length() < 2) { + timeSuffix = "+" + "0" + splitTimeArrayTwo[0] + ":" + splitTimeArrayTwo[1]; + subTime = splitTimeArrayOne[0] + timeSuffix; + return subTime; + } + return subTime; + } + + /** + * 所在周的开始 + * @param date + * @return + */ + public static Date startOfWeek(Date date) { + if (date == null) { + return null; + } + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.setFirstDayOfWeek(Calendar.MONDAY); + c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + return c.getTime(); + } + + /** + * 所在周的结束 + * @param date + * @return + */ + public static Date endOfWeek(Date date) { + if (date == null) { + return null; + } + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.setFirstDayOfWeek(Calendar.MONDAY); + c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + c.set(Calendar.HOUR_OF_DAY, 23); + c.set(Calendar.MINUTE, 59); + c.set(Calendar.SECOND, 59); + return c.getTime(); + } + + /** + * 所在月的开始 + * @param date + * @return + */ + public static Date startOfMonth(Date date) { + if (date == null) { + return null; + } + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.set(Calendar.DAY_OF_MONTH, 1); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, c.getMinimum(Calendar.MILLISECOND)); + return c.getTime(); + } + + /** + * 所在月的结束 + * @param date + * @return + */ + public static Date endOfMonth(Date date) { + if (date == null) { + return null; + } + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); + c.set(Calendar.HOUR_OF_DAY, 23); + c.set(Calendar.MINUTE, 59); + c.set(Calendar.SECOND, 59); + return c.getTime(); + } + + /** + * 本月开始 + * @return + */ + public static Date startOfCurMonth() { + return startOfMonth(new Date()); + } + + /** + * 本月结束 + * @return + */ + public static Date endOfCurMonth() { + return endOfMonth(new Date()); + } + + /** + * 上月开始 + * @return + */ + public static Date startOfPreMonth() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startOfCurMonth()); + calendar.add(Calendar.MONTH, -1); + return calendar.getTime(); + } + + /** + * 上月结束 + * @return + */ + public static Date endOfPreMonth() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MONTH, -1); + calendar.setTime(endOfMonth(calendar.getTime())); + return calendar.getTime(); + } + + /** + * 本周开始 + * @return + */ + public static Date startOfCurWeek() { + return startOfWeek(new Date()); + } + + /** + * 本周结束 + * @return + */ + public static Date endOfCurWeek() { + return endOfWeek(new Date()); + } + + /** + * 上周开始 + * @return + */ + public static Date startOfPreWeek() { + Date curMon = startOfCurWeek(); + Calendar c = Calendar.getInstance(); + c.setTime(curMon); + c.add(Calendar.DAY_OF_WEEK, -7); + return c.getTime(); + } + + /** + * 上周结束 + * @return + */ + public static Date endOfPreWeek() { + Date curSun = endOfCurWeek(); + Calendar c = Calendar.getInstance(); + c.setTime(curSun); + c.add(Calendar.DAY_OF_WEEK, -7); + return c.getTime(); + } + + /** + * 一天的结束 + * @param date + * @return + */ + public static Date endOf(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + return calendar.getTime(); + } + + /** + * 一天的开始 + * @param date + * @return + */ + public static Date startOf(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND,0); + return calendar.getTime(); + } + + /** + * 昨天的开始 + * @return + */ + public static Date startOfYesterday() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + return startOf(calendar.getTime()); + } + + /** + * 昨天的结束 + * @return + */ + public static Date endOfYesterday() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + return endOf(calendar.getTime()); + } + + /** + * 获取几天之后的日期 + * + * @param date + * @param after + * @return + */ + public static Date after(Date date, int after) { + if (date == null) { + return null; + } + if (after <= 0) { + return date; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, after); + return calendar.getTime(); + } + + /** + * 获取几年后的日期 + * @param date + * @param year + * @return + */ + public static Date afterYear(Date date, int year) { + if(date == null) { + return null; + } + if(year <= 0) { + return date; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, year); + return calendar.getTime(); + } + + + /** + * 获取几天之前的日期 + * + * @param date + * @param before + * @return + */ + public static Date before(Date date, int before) { + if (date == null) { + return null; + } + if (before <= 0) { + return date; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, -1 * before); + return calendar.getTime(); + } + + public static Date monthsAgo(Date date, int months) { + Calendar ca = Calendar.getInstance(); + ca.setTime(date); + ca.add(Calendar.MONTH, -months); + return ca.getTime(); + } + + /** + * 获取几分钟之前的时间 + * @return + */ + public static Date minsAgo(Date date, int mins){ + Calendar ca = Calendar.getInstance(); + ca.setTime(date); + ca.add(Calendar.MINUTE,-mins); + return ca.getTime(); + } + + public static Date startOfHour(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + public static Date endOfHour(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + return calendar.getTime(); + } + + /** + * 获取两个时间相差的月数 + * @param date1 + * @param date2 + * @return + */ + public static int getMonthSpace(Date date1,Date date2) + { + int iMonth = 0; + int flag = 0; + try{ + Calendar objCalendarDate1 = Calendar.getInstance(); + objCalendarDate1.setTime(date1); + + Calendar objCalendarDate2 = Calendar.getInstance(); + objCalendarDate2.setTime(date2); + + if (objCalendarDate2.equals(objCalendarDate1)) { + return 0; + } + if (objCalendarDate1.after(objCalendarDate2)){ + Calendar temp = objCalendarDate1; + objCalendarDate1 = objCalendarDate2; + objCalendarDate2 = temp; + } + if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1.get(Calendar.DAY_OF_MONTH)) { + flag = 1; + } + + if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1.get(Calendar.YEAR)) { + iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1.get(Calendar.YEAR)) + * 12 + objCalendarDate2.get(Calendar.MONTH) - flag) + - objCalendarDate1.get(Calendar.MONTH); + } else { + iMonth = objCalendarDate2.get(Calendar.MONTH) + - objCalendarDate1.get(Calendar.MONTH) - flag; + } + + } catch (Exception e){ + e.printStackTrace(); + } + return iMonth; + } + + /** + * 得到日期num个月时的日期 + * num为正数 为date后num个月 + * num为负数 为date前num个月 + * @param date + * @param num + * @return + */ + public static Date getDateOfMonth(Date date,int num){ + if(date == null){ + return null; + } + Calendar calendar = Calendar.getInstance(); //得到日历 + calendar.setTime(date); //把当前时间赋给日历 + calendar.add(Calendar.MONTH, num); //设置为前num月 + return calendar.getTime(); + } + + /** + * 获得两个时间相差的天数 + * @param minDate + * @param maxDate + * @return + */ + public static int getDaySpace(Date minDate,Date maxDate){ + int days = (int) ((maxDate.getTime() - minDate.getTime()) / (1000*3600*24)); + return Math.abs(days); + } + + /** + * 判断两个时间是否是同一天 + * + * @param d1 + * @param d2 + * @return + */ + public static boolean sameDay(Date d1, Date d2) { + if (d1 == null || d2 == null) { + return false; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d1); + int yearOfDate1 = calendar.get(Calendar.YEAR); + int dayOfDate1 = calendar.get(Calendar.DAY_OF_YEAR); + calendar.setTime(d2); + int yearOfDate2 = calendar.get(Calendar.YEAR); + int dayOfDate2 = calendar.get(Calendar.DAY_OF_YEAR); + + return yearOfDate1 == yearOfDate2 && dayOfDate1 == dayOfDate2; // 年份和一年当中的天数相同 + } + + public static Date preYear(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, -1); + return calendar.getTime(); + } + + public static Date endOfPreYear(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, -1); + calendar.set(Calendar.MONTH, calendar.getActualMaximum(Calendar.MONTH)); + return endOfMonth(calendar.getTime()); + } + + + public static Date endOfYear(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MONTH, calendar.getActualMaximum(Calendar.MONTH)); + return endOfMonth(calendar.getTime()); + } + + public static Date startOfYear(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MONTH, calendar.getMinimum(Calendar.MONTH)); + return startOfMonth(calendar.getTime()); + } + + public static Date nextMonth(Date date) { + if (date == null) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, +1); + return calendar.getTime(); + } +} diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/pluginCfg.xml new file mode 100644 index 0000000..6e317c7 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_ydctdatasync + 宜都城投数据同步 + 20241231 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring-quartz.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring-quartz.xml new file mode 100644 index 0000000..e50addf --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring-quartz.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring.xml new file mode 100644 index 0000000..581ce1b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ydctdatasync/spring/spring.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file