diff --git a/src/main/java/aiyh/utils/Util.java b/src/main/java/aiyh/utils/Util.java index 16c18ea..136bd19 100644 --- a/src/main/java/aiyh/utils/Util.java +++ b/src/main/java/aiyh/utils/Util.java @@ -4092,6 +4092,53 @@ public class Util extends weaver.general.Util { Util.getLogger().error(getErrString(e)); } } + + /** + *

获取下一个部门id

+ * @author xuanran.wang + * @dateTime 2023/7/19 11:24 + * @return 部门id + **/ + public static int getNextDepartmentId(){ + return getNextDepartmentId(1); + } + + /** + *

获取下一个部门id

+ * @author xuanran.wang + * @dateTime 2023/7/19 11:24 + * @param subId 分部id + * @return 部门id + **/ + public static int getNextDepartmentId(int subId){ + RecordSet insertRs = new RecordSet(); + char separator = weaver.general.Util.getSeparator(); + String uuid = UUID.randomUUID().toString(); + String para = uuid + separator +uuid + separator + + "" + separator + "" + separator + subId + separator + 1 + separator + ""; + insertRs.executeProc("HrmDepartment_Insert", para); + if(insertRs.next()){ + return insertRs.getInt(1); + } + return -1; + } + + + + /** + *

获取下一个人员id

+ * @author xuanran.wang + * @dateTime 2023/4/12 13:24 + * @return 人员id + **/ + public static int getNextHrmId(){ + RecordSet procRs = new RecordSet(); + procRs.executeProc("HrmResourceMaxId_Get", ""); + if (procRs.next()) { + return procRs.getInt(1); + } + return -1; + } } diff --git a/src/main/java/aiyh/utils/response_deal/state/InsertOrUpdateState.java b/src/main/java/aiyh/utils/response_deal/state/InsertOrUpdateState.java index 549969d..db7e023 100644 --- a/src/main/java/aiyh/utils/response_deal/state/InsertOrUpdateState.java +++ b/src/main/java/aiyh/utils/response_deal/state/InsertOrUpdateState.java @@ -22,9 +22,6 @@ public class InsertOrUpdateState extends State{ @Override public void handle() { - if(ResponseUtil.parameterIsNotNull(this.context.getTableDefinitionCallback())){ - this.context.getTableDefinitionCallback().tableHandle(this.context); - } List rowDefinitionList = this.context.getRowDefinitionList(); List updateRowList = new ArrayList<>(); List insertRowList = new ArrayList<>(); @@ -55,7 +52,6 @@ public class InsertOrUpdateState extends State{ BeanUtil.copyProperties(this.context,tableDefinition); tableDefinition.setState(null); tableDefinition.setRowDefinitionList(rowDefinitionList); - tableDefinition.setTableDefinitionCallback(null); tableDefinition.setAssignType(assignType); tableDefinition.setDefaultState(null); tableDefinition.dataProcess(); diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmDepartmentDefinition.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmDepartmentDefinition.java deleted file mode 100644 index 872ea51..0000000 --- a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmDepartmentDefinition.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.api.xuanran.wang.xk_hospital.data_async.definitions; - -import aiyh.utils.Util; -import aiyh.utils.excention.CustomerException; -import aiyh.utils.response_deal.entity.FieldDefinition; -import aiyh.utils.response_deal.entity.RowDefinition; -import aiyh.utils.response_deal.intfaces.RowDefinitionCallback; -import aiyh.utils.response_deal.mapper.ConfigMapper; -import aiyh.utils.tool.cn.hutool.core.util.StrUtil; -import org.apache.commons.lang3.StringUtils; -import weaver.conn.RecordSet; - -import java.util.HashMap; -import java.util.List; - -/** - *

- * - * @author xuanran.wang - * @date 2023/7/18 11:13 - */ -public class HrmDepartmentDefinition implements RowDefinitionCallback { - - protected final ConfigMapper configMapper = Util.getMapper(ConfigMapper.class); - - @Override - public void rowHandle(RowDefinition rowDefinition) { - - } - - @Override - public boolean judgmentRepetition(RowDefinition rowDefinition) { - String conditionScript = rowDefinition.getConditionScript(); - String cusQuerySql = "select id from " + rowDefinition.getAssignTable() + " where " + conditionScript; - String dataId = this.configMapper.executeCusQuerySql(cusQuerySql, rowDefinition.getWhereParam(),new HashMap<>()); - if(StrUtil.isBlank(dataId)){ - RecordSet insertRs = new RecordSet(); - char separator = weaver.general.Util.getSeparator(); - //使用存储过程新增分部 - String para = "" + separator + "" + separator + - "" + separator + "" + separator + "1" + separator + ""; - insertRs.executeProc("HrmDepartment_Insert", para); - if (insertRs.next()) { - int depId = insertRs.getInt(1); - rowDefinition.setDataId(depId); - rowDefinition.getWhereParam().put("id", depId); - } - } - return true; - } -} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmresourceDefinition.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmresourceDefinition.java deleted file mode 100644 index 69a94cc..0000000 --- a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/HrmresourceDefinition.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.api.xuanran.wang.xk_hospital.data_async.definitions; - -import aiyh.utils.response_deal.entity.RowDefinition; -import aiyh.utils.response_deal.intfaces.RowDefinitionCallback; - -/** - *

- * - * @author xuanran.wang - * @date 2023/7/18 11:13 - */ -public class HrmresourceDefinition implements RowDefinitionCallback { - @Override - public void rowHandle(RowDefinition rowDefinition) { - - } - - @Override - public boolean judgmentRepetition(RowDefinition rowDefinition) { - return false; - } -} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/XkHospitalCommonDefinition.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/XkHospitalCommonDefinition.java new file mode 100644 index 0000000..477ed90 --- /dev/null +++ b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/XkHospitalCommonDefinition.java @@ -0,0 +1,105 @@ +package com.api.xuanran.wang.xk_hospital.data_async.definitions; + +import aiyh.utils.ThreadPoolConfig; +import aiyh.utils.Util; +import aiyh.utils.response_deal.mapper.ConfigMapper; +import com.api.xuanran.wang.xk_hospital.data_async.mapper.XkHospitalDataAsyncMapper; +import com.engine.common.service.impl.ThemeServiceImpl; +import org.apache.log4j.Logger; +import weaver.hrm.company.DepartmentComInfo; +import weaver.hrm.resource.ResourceComInfo; +import weaver.matrix.MatrixUtil; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; + +/** + *

+ * + * @author xuanran.wang + * @date 2023/7/19 10:22 + */ +public class XkHospitalCommonDefinition { + /** + *

部门表名

+ **/ + public static final String DEPARTMENT = "hrmdepartment"; + /** + *

人员表名

+ **/ + public static final String HRM_RESOURCE = "hrmresource"; + /** + *

日志对象

+ **/ + protected static final Logger log = Util.getLogger(); + /** + *

数据同步mapper

+ **/ + protected final XkHospitalDataAsyncMapper dataAsyncMapper = Util.getMapper(XkHospitalDataAsyncMapper.class); + /** + *

执行自定义sql

+ **/ + protected final ConfigMapper configMapper = Util.getMapper(ConfigMapper.class); + /** + *

线程池对象

+ **/ + protected final ExecutorService threadPoolInstance = ThreadPoolConfig.createThreadPoolInstance(); + /** + *

部门缓存

+ **/ + protected static final DepartmentComInfo DEPARTMENT_COM_INFO = new DepartmentComInfo(); + /** + *

人员缓存

+ **/ + protected static ResourceComInfo RESOURCE_COM_INFO = null; + /** + *

系统主题接口

+ **/ + protected static final ThemeServiceImpl THEME_SERVICE = new ThemeServiceImpl(); + static { + try { + RESOURCE_COM_INFO = new ResourceComInfo(); + }catch (Exception e){ + log.error("人员缓存类初始化失败! " + e.getMessage()); + Util.logErrorStr(e); + } + } + + /** + * 同步系统缓存 + * @param table 表名 + * @param idList 数据id集合 + */ + protected void synCache(String table, List idList){ + if (DEPARTMENT.equals(table)) { + threadPoolInstance.execute(()->{ + try { + DEPARTMENT_COM_INFO.removeCache(); + MatrixUtil.sysDepartmentData(); + }catch (Exception e){ + log.error("同步系统部门缓存error : " + e.getMessage()); + Util.logErrorStr(e); + } + }); + }else if(HRM_RESOURCE.equals(table)){ + try { + List> hrmSubList = dataAsyncMapper.selectHrmSubByHrmIdList(idList); + hrmSubList.forEach(map->{ + THEME_SERVICE.createSubCompanyMenu(map.get("id"), map.get("sub")); + }); + RESOURCE_COM_INFO.removeCache(); + }catch (Exception e){ + log.error("同步系统人员缓存error : " + e.getMessage()); + Util.logErrorStr(e); + } + } + } + + + + + + + +} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/row/HrmDepartmentRowDefinition.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/row/HrmDepartmentRowDefinition.java new file mode 100644 index 0000000..fa1c7c8 --- /dev/null +++ b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/row/HrmDepartmentRowDefinition.java @@ -0,0 +1,53 @@ +package com.api.xuanran.wang.xk_hospital.data_async.definitions.row; + +import aiyh.utils.Util; +import aiyh.utils.excention.CustomerException; +import aiyh.utils.response_deal.entity.RowDefinition; +import aiyh.utils.response_deal.intfaces.RowDefinitionCallback; +import aiyh.utils.response_deal.mapper.ConfigMapper; +import aiyh.utils.tool.cn.hutool.core.util.StrUtil; +import com.api.xuanran.wang.xk_hospital.data_async.definitions.XkHospitalCommonDefinition; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import weaver.conn.RecordSet; + +import java.util.HashMap; + +/** + *

+ * + * @author xuanran.wang + * @date 2023/7/18 11:13 + */ +@NoArgsConstructor +@AllArgsConstructor +public class HrmDepartmentRowDefinition extends XkHospitalCommonDefinition implements RowDefinitionCallback { + + private String table; + + @Override + public void rowHandle(RowDefinition rowDefinition) { + } + + @Override + public boolean judgmentRepetition(RowDefinition rowDefinition) { + String conditionScript = rowDefinition.getConditionScript(); + String cusQuerySql = "select id from " + rowDefinition.getAssignTable() + " where " + conditionScript; + String dataId = configMapper.executeCusQuerySql(cusQuerySql, rowDefinition.getWhereParam(),new HashMap<>()); + if(StrUtil.isBlank(dataId)){ + int nextId = -1; + if(HRM_RESOURCE.equals(table)){ + nextId = Util.getNextHrmId(); + }else if(DEPARTMENT.equals(table)){ + nextId = Util.getNextDepartmentId(); + } + if(nextId < 0){ + throw new CustomerException("从 " + table + " 获取下一个id失败!"); + } + rowDefinition.setDataId(nextId); + rowDefinition.getWhereParam().put("id", nextId); + rowDefinition.setConditionScript(" id = #{whereItem.id}"); + } + return true; + } +} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/table/HrmDepartmentTableDefinition.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/table/HrmDepartmentTableDefinition.java new file mode 100644 index 0000000..e36e021 --- /dev/null +++ b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/definitions/table/HrmDepartmentTableDefinition.java @@ -0,0 +1,53 @@ +package com.api.xuanran.wang.xk_hospital.data_async.definitions.table; + +import aiyh.utils.Util; +import aiyh.utils.excention.CustomerException; +import aiyh.utils.response_deal.entity.RowDefinition; +import aiyh.utils.response_deal.entity.TableDefinition; +import aiyh.utils.response_deal.intfaces.TableDefinitionCallback; +import com.api.xuanran.wang.xk_hospital.data_async.definitions.XkHospitalCommonDefinition; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.apache.commons.collections.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

部门/人员同步表回调

+ * + * @author xuanran.wang + * @date 2023/7/19 10:11 + */ +@AllArgsConstructor +@NoArgsConstructor +public class HrmDepartmentTableDefinition extends XkHospitalCommonDefinition implements TableDefinitionCallback { + + private String table; + + @Override + public void tableHandle(TableDefinition tableDefinition) { + + } + + @Override + public void afterHandle(TableDefinition tableDefinition, boolean flag) { + List idList = tableDefinition.getRowDefinitionList() + .stream() + .map(RowDefinition::getDataId) + .filter(dataId -> dataId > 0) + .collect(Collectors.toList()); + if(CollectionUtils.isEmpty(idList)){ + return; + } + if(!flag){ + if (!this.dataAsyncMapper.deleteHrmDepart(idList)) { + log.error("删除 " + table + " 表数据失败!"); + } + throw new CustomerException("同步 " + table + " 表数据失败!"); + }else { + synCache(table, idList); + } + } +} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/mapper/XkHospitalDataAsyncMapper.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/mapper/XkHospitalDataAsyncMapper.java new file mode 100644 index 0000000..4b59630 --- /dev/null +++ b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/mapper/XkHospitalDataAsyncMapper.java @@ -0,0 +1,24 @@ +package com.api.xuanran.wang.xk_hospital.data_async.mapper; + +import aiyh.utils.annotation.recordset.*; + +import java.util.List; +import java.util.Map; + +/** + *

胸科医院数据同步mapper

+ * + * @author xuanran.wang + * @date 2023/7/19 10:19 + */ +@SqlMapper +public interface XkHospitalDataAsyncMapper { + + @Delete("delete from hrmdepartment where id in $t{idList}") + boolean deleteHrmDepart(@ParamMapper("idList") List idList); + + @Select("select id, subcompanyid1 as sub from hrmresource where id in $t{idList}") + @ToLowerCase + List> selectHrmSubByHrmIdList(@ParamMapper("idList") List idList); + +} diff --git a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/service/impl/XkHospitalCommonDataAsyncServiceImpl.java b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/service/impl/XkHospitalCommonDataAsyncServiceImpl.java index ff5f4ac..d8e16cc 100644 --- a/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/service/impl/XkHospitalCommonDataAsyncServiceImpl.java +++ b/src/main/java/com/api/xuanran/wang/xk_hospital/data_async/service/impl/XkHospitalCommonDataAsyncServiceImpl.java @@ -2,10 +2,12 @@ package com.api.xuanran.wang.xk_hospital.data_async.service.impl; import aiyh.utils.response_deal.ResponseMappingDeal; import aiyh.utils.response_deal.intfaces.RowDefinitionCallback; +import aiyh.utils.response_deal.intfaces.TableDefinitionCallback; import aiyh.utils.tool.cn.hutool.core.util.StrUtil; -import com.api.xuanran.wang.xk_hospital.data_async.definitions.HrmresourceDefinition; +import com.api.xuanran.wang.xk_hospital.data_async.definitions.XkHospitalCommonDefinition; +import com.api.xuanran.wang.xk_hospital.data_async.definitions.row.HrmDepartmentRowDefinition; +import com.api.xuanran.wang.xk_hospital.data_async.definitions.table.HrmDepartmentTableDefinition; import com.api.xuanran.wang.xk_hospital.data_async.service.XkHospitalCommonDataAsyncService; -import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; @@ -18,20 +20,29 @@ import java.util.Map; */ public class XkHospitalCommonDataAsyncServiceImpl implements XkHospitalCommonDataAsyncService { - private static final Map CUS_DEFINITIONS = new HashMap<>(); + private static final Map CUS_ROW_DEFINITIONS = new HashMap<>(); + + private static final Map CUS_TABLE_DEFINITIONS = new HashMap<>(); static { - CUS_DEFINITIONS.put("hrm", new HrmresourceDefinition()); - CUS_DEFINITIONS.put("dept", new HrmresourceDefinition()); + CUS_ROW_DEFINITIONS.put("dept", new HrmDepartmentRowDefinition(XkHospitalCommonDefinition.DEPARTMENT)); + CUS_ROW_DEFINITIONS.put("hrm", new HrmDepartmentRowDefinition(XkHospitalCommonDefinition.HRM_RESOURCE)); + + CUS_TABLE_DEFINITIONS.put("dept", new HrmDepartmentTableDefinition(XkHospitalCommonDefinition.DEPARTMENT)); + CUS_TABLE_DEFINITIONS.put("hrm", new HrmDepartmentTableDefinition(XkHospitalCommonDefinition.HRM_RESOURCE)); } @Override public void async(String configCode, String type, Map params){ ResponseMappingDeal deal = new ResponseMappingDeal(); if(StrUtil.isNotBlank(type)){ - RowDefinitionCallback callback = CUS_DEFINITIONS.get(type); - if(null != callback){ - deal.setRowCallback(callback); + RowDefinitionCallback rowDefinitionCallback = CUS_ROW_DEFINITIONS.get(type); + if(null != rowDefinitionCallback){ + deal.setRowCallback(rowDefinitionCallback); + } + TableDefinitionCallback tableDefinitionCallback = CUS_TABLE_DEFINITIONS.get(type); + if(null != tableDefinitionCallback){ + deal.setTableCallback(tableDefinitionCallback); } } deal.doResponseSync(configCode, params); diff --git a/src/test/java/xuanran/wang/xk_hospital/test/XkHospitalTest.java b/src/test/java/xuanran/wang/xk_hospital/test/XkHospitalTest.java index 0159c50..4f0f792 100644 --- a/src/test/java/xuanran/wang/xk_hospital/test/XkHospitalTest.java +++ b/src/test/java/xuanran/wang/xk_hospital/test/XkHospitalTest.java @@ -22,26 +22,15 @@ public class XkHospitalTest extends BaseTest { @Test public void testA(){ String json = "{\n" + - "\t\"ID\":\"主键\",\n" + - "\t\"DeptCode\":\"科室代码\",\n" + - "\t\"DeptName\":\"科室名称\",\n" + - "\t\"DeptLevel\": \"科室级别,int类型,可为null\", \n" + - "\t\"ParentDeptCode\":\"上级科室代码\",\n" + - "\t\"IsDelete\": \"是否停用,bool类型\", \n" + - "\t\"Remark\":\"备注\",\n" + - "\t\"Mapping\": [\n" + - "\t\t{\n" + - "\t\t\t\"ID\":\"主键\",\n" + - "\t\t\t\"DeptID\":\"源科室主键\",\n" + - "\t\t\t\"SourceDeptName\":\"源科室名称\",\n" + - "\t\t\t\"SystemID\":\"第三方系统主键\",\n" + - "\t\t\t\"SystemName\":\"第三方系统名称\",\n" + - "\t\t\t\"DeptCode\":\"科室代码\",\n" + - "\t\t\t\"DeptName\":\"科室名称\",\n" + - "\t\t\t\"Remark\":\"备注\",\n" + - "\t\t}\n" + - "\t]\n" + + "\t\"ID\":\"1\",\n" + + "\t\"DeptCode\":\"test3\",\n" + + "\t\"DeptName\":\"科室测试名称3\",\n" + + "\t\"DeptLevel\": null, \n" + + "\t\"ParentDeptCode\": \"test2\",\n" + + "\t\"IsDelete\": false, \n" + + "\t\"Remark\":\"备注\"\n" + "}\n"; + Map map = JSONObject.parseObject(json, Map.class); service.async("4bce0693734a","dept",map); }