diff --git a/com.actionsoft.apps.coe.pal.cooperation/web/com.actionsoft.apps.coe.pal.cooperation/main/img/iconfont.ce1b01d3.ce1b01d3.svg b/com.actionsoft.apps.coe.pal.cooperation/web/com.actionsoft.apps.coe.pal.cooperation/main/img/iconfont.ce1b01d3.ce1b01d3.svg deleted file mode 100644 index c8bbdca4..00000000 --- a/com.actionsoft.apps.coe.pal.cooperation/web/com.actionsoft.apps.coe.pal.cooperation/main/img/iconfont.ce1b01d3.ce1b01d3.svg +++ /dev/null @@ -1,2447 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/com.actionsoft.apps.coe.pal.mappingmanagement/web/com.actionsoft.apps.coe.pal.mappingmanagement/main/img/iconfont.ce1b01d3.ce1b01d3.svg b/com.actionsoft.apps.coe.pal.mappingmanagement/web/com.actionsoft.apps.coe.pal.mappingmanagement/main/img/iconfont.ce1b01d3.ce1b01d3.svg deleted file mode 100644 index c8bbdca4..00000000 --- a/com.actionsoft.apps.coe.pal.mappingmanagement/web/com.actionsoft.apps.coe.pal.mappingmanagement/main/img/iconfont.ce1b01d3.ce1b01d3.svg +++ /dev/null @@ -1,2447 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/AfterInstallationEvent.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/AfterInstallationEvent.java new file mode 100644 index 00000000..64b868ea --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/AfterInstallationEvent.java @@ -0,0 +1,47 @@ +package com.actionsoft.apps.kms; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; + +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.apps.listener.AppListener; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.database.BatchPreparedStatementSetter; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; + +public class AfterInstallationEvent implements AppListener { + + @Override + public void after(AppContext appContext) { + // 如果版本号表(APP_ACT_KMS_VERSION)为空,则从1.0到10.0初始化10条版本号 + long count = DBSql.getLong("SELECT COUNT(*) AS C FROM " + KMSConstant.ENTITY_NAME_VERSION, "C"); + if (count == 0L) { + final String[] versionNOArr = new String[] { "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0" }; + String sql = "INSERT INTO " + KMSConstant.ENTITY_NAME_VERSION + " (" + VersionModel.ID + "," + VersionModel.VERSIONNO + "," + VersionModel.CREATETIME + "," + VersionModel.CREATEUSER + "," + VersionModel.MEMO + ") VALUES (?,?,?,?,?)"; + DBSql.batch(sql, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement pstmt, int index) throws SQLException { + String versionNO = versionNOArr[index]; + pstmt.setString(1, UUIDGener.getObjectId()); + pstmt.setString(2, versionNO); + pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis())); + pstmt.setString(4, "admin"); + pstmt.setString(5, "系统初始化"); + } + + @Override + public int getBatchSize() { + return versionNOArr.length; + } + }); + } + } + + @Override + public boolean before(AppContext appContext) { + return true; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSConstant.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSConstant.java new file mode 100644 index 00000000..90d0e626 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSConstant.java @@ -0,0 +1,134 @@ +package com.actionsoft.apps.kms; + +/** + * @author wangshibao + */ +public class KMSConstant { + /** 导航菜单ID */ + public static final String NAV_ID_KNWL_CENTER = "obj_21d0b756a48946ccb5d38668f32943b2"; + public static final String NAV_ID_KNWL_SEARCH = "obj_9db6edd0ccf5433f82fe0af6fd67b7cc"; + public static final String NAV_ID_DIMENSION_MGR = "obj_4f48f895966349beb2bd3e01bda46b69"; + public static final String NAV_ID_META_MGR = "obj_9acae9a8b50142daac7d98efda6d13d6"; + public static final String NAV_ID_VALIDDATE_MGR = "obj_28b304cc5bad4636adfa780f45317033"; + public static final String NAV_ID_SYSTEM_MGR = "obj_50e47d2f2cac4738b4b819bf68dc1f81"; + + /** 应用ID */ + public static final String APP_ID = "com.actionsoft.apps.kms"; + /** doccenter目录 */ + public static final String DOC_REPOSITORY_NAME = "-doc-"; + // public static final String ONLINEDOC_REPOSITORY_NAME = "onlinedoc"; //替换为onlinedoc之后无需再解密 + public static final String DOC_REPOSITORY_HOTSPOT = "hotspot"; + /** 全文检索目录 */ + public static final String FULLSEARCH_REPOSITORY_NAME = "kmsDoc"; + public static final String APP_KMS_FULLSEARCH_INDEX="com.actionsoft.apps.kms_kmsdoc"; + public static final String APP_KMS_FULLSEARCH_TYPE="kmsdoc"; + public static final String APP_KMS_FULLSEARCH_INDEX_CARD = "com.actionsoft.apps.kms_kmsdoc_card"; + public static final String APP_KMS_FULLSEARCH_TYPE_CARD = "kmsdoc_card"; + public static final String APP_FULLSEARCH = "com.actionsoft.apps.addons.es";// 全文检索 + /** 知识参数-manifest文件使用 */ + public static final String SYSTEM_PARAM_KEY = "systemParam"; + /** 表名 */ + public static final String ENTITY_NAME_DIMENSION = "APP_ACT_KMS_DIMENSION"; + public static final String ENTITY_NAME_CARD = "APP_ACT_KMS_CARD"; + public static final String ENTITY_NAME_OPT = "APP_ACT_KMS_OPT"; + public static final String ENTITY_NAME_FILE = "APP_ACT_KMS_FILE"; + public static final String ENTITY_NAME_HOTSPOT_DEF = "APP_ACT_KMS_HOTSPOT_DEF"; + public static final String ENTITY_NAME_HOTSPOT = "APP_ACT_KMS_HOTSPOT"; + public static final String ENTITY_NAME_LOG = "APP_ACT_KMS_LOG"; + public static final String ENTITY_NAME_PUBLISH = "APP_ACT_KMS_PUBLISH"; + public static final String ENTITY_NAME_VERSION = "APP_ACT_KMS_VERSION"; + public static final String ENTITY_NAME_META_SCHEMA = "APP_ACT_KMS_META_SCHEMA"; + public static final String ENTITY_NAME_META_ATTR = "APP_ACT_KMS_META_ATTR"; + public static final String ENTITY_NAME_META_DATA = "APP_ACT_KMS_META_DATA"; + public static final String ENTITY_NAME_COLLECTION = "APP_ACT_KMS_COLLECTION"; + + /** BO表名 */ + public static final String BO_ENTITY_NAME_BORROW = "BO_ACT_KMS_BORROW"; + public static final String BO_ENTITY_NAME_PUBLISH = "BO_ACT_KMS_PUBLISH"; + public static final String BO_ENTITY_NAME_CANCEL_PUBLISH = "BO_ACT_KMS_CANCEL_PUBLISH"; + + /** 维度类型 */ + public static final int SHOWTYPE_CATEGORY = 2;// 仅做分类(不允许发布知识) + public static final int SHOWTYPE_DIMENSION = 1;// 普通维度(知识列表) + public static final int SHOWTYPE_HOTSPOT = 0;// 知识地图 + + /** 启用 不启用 */ + public static final int ENABLED = 1; + public static final int UNABLED = 0; + + /** 发布 未发布 */ + public static final int PUBLISHED = 1; + public static final int UNPUBLISHED = 0; + + /** 审批 不审批 */ + public static final int EXAMINE = 1; + public static final int UNEXAMINE = 0; + + /** 标签分隔符(数据库中varchar类型) */ + public static final String TAG_SEPRATOR = "@`@"; + + /** 知识管理员AC类型 */ + public static final String AC_RESOURCE_TYPE_KNWL_MGR = "kms.knwlmgr"; + public static final String AC_RESOURCE_TYPE_XPAGE_MGR = "kms.xpagemgr"; + /** 知识管理员资源ID */ + public static final String AC_RESOURCE_ID_KNWL_MGR = "kms.knwlmgr.id"; + + /** 二级知识管理员AC类型 */ + public static final String AC_RESOURCE_TYPE_DIMENSION_MGR = "kms.dimensionmgr"; + + /** 知识访问AC类型 */ + public static final String AC_RESOURCE_TYPE_CARD = "kms.card"; + + /** 元数据发布访问AC类型 */ + public static final String AC_RESOURCE_TYPE_META_SCHEMA = "kms.metaSchema"; + + /** 借阅流程的定义ID */ + public static final String BORROW_PROCESS_DEF_ID = "obj_bcf0034b766f4a3d9cda8e0288e1c8c6"; + /** 借阅流程开始事件的ID */ + public static final String BORROW_START_EVENT_ID = "obj_c71e56d36b2000011759a1271e0057e0"; + + /** 发布流程的定义ID */ + public static final String PUBLISH_PROCESS_DEF_ID = "obj_073f4f28416946e39db3d9f3fb981021"; + /** 发布流程开始事件的ID */ + public static final String PUBLISH_START_EVENT_ID = "obj_c71fa098cae00001d2e9a78ff250c020"; + + /** 取消发布流程的定义ID */ + public static final String CANCEL_PUBLISH_PROCESS_DEF_ID = "obj_65be24aea7284f07a693e37c8c8deef3"; + /** 取消发布流程开始事件的ID */ + public static final String CANCEL_PUBLISH_START_EVENT_ID = "obj_c7329417b7600001be6d139b2db09490"; + + /** KMS OPT 类型 1、评论 2、评分 3、反馈 */ + public static final int OPT_TYPE_COMMENT = 1; + /** KMS OPT 类型 1、评论 2、评分 3、反馈 */ + public static final int OPT_TYPE_RATE = 2; + /** KMS OPT 类型 1、评论 2、评分 3、反馈 */ + public static final int OPT_TYPE_REPORT = 3; + + /** 我的收藏-KMS的分类名称 */ + public static final String FAVORITE_CATEGORY_KMS = "KMS"; + + public static final String FILE_SUFFIX_DOC = "doc"; + public static final String FILE_SUFFIX_PICTURE = "picture"; + public static final String FILE_SUFFIX_AUDIO = "audio"; + public static final String FILE_SUFFIX_VIDEO = "video"; + + public static final int LOG_ACCESS_CARD = 0;// 访问知识卡片 + public static final int LOG_DOWNLOAD_FILE = 1;// 下载文件 + public static final int LOG_ACCESS_FILE = 2;// 在线浏览文件 + public static final int LOG_ACCESS_OTHER = 3;// 在线浏览文件 + public static final String NOTIFICATION_SYSTEM_NAME = "知识阅读邀请"; + public static final String REPORT_SYSTEM_NAME = "知识反馈"; + + public static final String DOC_GROUP_HOTSPOT = "grouphotspot"; + public static final String DOC_FILE_HOTSPOT = "filehotspot"; + +// 调用积分接口参数 + public final static String POINT_DOWN_LOAD = "KMS下载文件"; + public final static String POINT_LOOK_ATCART = "KMS阅读知识卡片"; + public final static String POINT_LOOK_ATFILE= "KMS预览文件"; + public final static String POINT_PUBLSH = "KMS发布知识"; + public final static int POINT_COUNT = 1;//0为加积分,1为扣积分 + public final static String POINT_ISADD_POINT = "1";//参数控制为1即调用aslp,0不调用 + public final static String POINTS_APPID = "com.actionsoft.apps.points"; + public static final String DOC_CARDCONTENT_REPOSITORY_NAME = "-doccardcontent-"; +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSLogUtil.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSLogUtil.java new file mode 100644 index 00000000..c1f67cba --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSLogUtil.java @@ -0,0 +1,84 @@ +package com.actionsoft.apps.kms; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Types; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.actionsoft.apps.kms.model.LogModel; +import com.actionsoft.apps.lifecycle.log.AppsLogger; +import com.actionsoft.bpms.commons.database.BatchPreparedStatementSetter; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.sdk.local.SDK; + +/** + * 记录KMS日志(采用线程池,提高性能) + * + * @author wangshibao + * + */ +public class KMSLogUtil { + + private static ExecutorService logExecutorService = Executors.newCachedThreadPool(); + + /** + * 记录日志入口方法 + * + * @param logModels + * @author wangshibao + */ + public static void log(final LogModel... logModels) { + logExecutorService.execute(new Runnable() { + @Override + public void run() { + insertLogs(logModels); + } + }); + } + + /** + * 插入数据库 + * + * @param logModels + * @author wangshibao + */ + private static void insertLogs(final LogModel... logModels) { + try { + if (logModels == null || logModels.length == 0) { + return; + } + String sql = "INSERT INTO " + KMSConstant.ENTITY_NAME_LOG + " (" + LogModel.ID + "," + LogModel.CARDID + "," + LogModel.FILEID + "," + LogModel.ACCESSUSER + "," + LogModel.ACCESSTIME + "," + LogModel.IPADDRESS + "," + LogModel.LOGTYPE + "," + LogModel.LOGINFO + ") VALUES (?,?,?,?,?,?,?,?)"; + DBSql.batch(sql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement pstmt, int index) throws SQLException { + LogModel logModel = logModels[index]; + pstmt.setString(1, UUIDGener.getObjectId()); + pstmt.setString(2, logModel.getCardId()); + + if (logModel.getFileId() == null) { + pstmt.setNull(3, Types.VARCHAR); + } else { + pstmt.setString(3, logModel.getFileId()); + } + + pstmt.setString(4, logModel.getAccessUser()); + pstmt.setTimestamp(5, logModel.getAccessTime()); + pstmt.setString(6, logModel.getIpAddress()); + pstmt.setInt(7, logModel.getLogType()); + pstmt.setString(8, logModel.getLogInfo()); + } + + @Override + public int getBatchSize() { + return logModels.length; + } + }); + } catch (Exception e) { + AppsLogger.err(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "记录KMS日志出错:" + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSUtil.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSUtil.java new file mode 100644 index 00000000..1548cf38 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/KMSUtil.java @@ -0,0 +1,1378 @@ +package com.actionsoft.apps.kms; + +import java.security.MessageDigest; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Comparator; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Pattern; + +import com.actionsoft.apps.AppsConst; +import com.actionsoft.apps.kms.ac.CardACCM; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.ac.KnwlMgrACCM; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.cache.VersionCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; +import com.actionsoft.bpms.commons.login.constant.LoginConst; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.commons.security.basic.PermAPIManager; +import com.actionsoft.bpms.commons.security.basic.constant.AWFDocumentLayerUnit; +import com.actionsoft.bpms.commons.security.high.HighSecurity; +import com.actionsoft.bpms.commons.security.high.constant.SecurityLevelConst; +import com.actionsoft.bpms.commons.security.high.model.HighSecurityModel; +import com.actionsoft.bpms.commons.security.mgtgrade.util.GradeSecurityUtil; +import com.actionsoft.bpms.org.cache.CompanyCache; +import com.actionsoft.bpms.org.cache.DepartmentCache; +import com.actionsoft.bpms.org.cache.TeamMemberCache; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.cache.UserMapCache; +import com.actionsoft.bpms.org.model.CompanyModel; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.TeamMemberModel; +import com.actionsoft.bpms.org.model.UserMapModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.DispatcherRequest; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.AES; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.i18n.I18nRes; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.alibaba.fastjson.JSONObject; + +public class KMSUtil { + + /** + * 直接取消发布知识OR启动流程 + * + * @param dimensionId 维度Id + * @param uid 操作人 + * @return + * @author wangshibao + */ + public static boolean canCancelPublishCard(String dimensionId, String uid) { + return canPublishCard(dimensionId, uid); + } + + /** + * 直接发布知识OR启动流程 + * + * @param dimensionId 维度ID + * @param uid + * @return + * @author wangshibao + */ + public static boolean canPublishCard(String dimensionId, String uid) { + // 维度审批 + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel.getIsExamine() == 0) {// 无需审批 + return true; + } + // 维度管理员 + boolean hasDimensionMgrPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true); + if (hasDimensionMgrPerm) { + return true; + } + return false; + } + + /** + * 检查是否维度管理员(严格ac) + * + * @param dimensionId 维度ID + * @param uid + * @return + * @author wangshibao + */ + public static boolean isDimensionManager(String dimensionId, String uid) { + // 维度管理员 + return SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true); + } + + /** + * 是否能访问维度(非严格ac) + * + * @param dimensionId + * @param uid + * @return + * @author wangshibao + */ + + public static boolean canAccessDimension(String dimensionId, String uid, List acList) { + List list = new ArrayList(); + Map accessModeMap = new HashMap(); + for (Iterator it = acList.iterator(); it.hasNext(); ) { + AccessControlModel ac = it.next(); + if (ac != null) { + if (dimensionId.equals(ac._resourceId) && KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR.equals(ac._resourceType)) { + list.add(ac); + if (ac._accessModel == DimensionMgrACCM.ACCESS.getType()) { + if (accessModeMap.containsKey(DimensionMgrACCM.ACCESS.getType())) { + accessModeMap.put(DimensionMgrACCM.ACCESS.getType(), accessModeMap.get(DimensionMgrACCM.ACCESS.getType()) + 1); + } else { + accessModeMap.put(DimensionMgrACCM.ACCESS.getType(), 1); + } + } + if (ac._accessModel == DimensionMgrACCM.BORROW.getType()) { + if (accessModeMap.containsKey(DimensionMgrACCM.BORROW.getType())) { + accessModeMap.put(DimensionMgrACCM.BORROW.getType(), accessModeMap.get(DimensionMgrACCM.BORROW.getType()) + 1); + } else { + accessModeMap.put(DimensionMgrACCM.BORROW.getType(), 1); + } + } + if (ac._accessModel == DimensionMgrACCM.DIMENSION_MGR.getType()) { + if (accessModeMap.containsKey(DimensionMgrACCM.DIMENSION_MGR.getType())) { + accessModeMap.put(DimensionMgrACCM.DIMENSION_MGR.getType(), accessModeMap.get(DimensionMgrACCM.DIMENSION_MGR.getType()) + 1); + } else { + accessModeMap.put(DimensionMgrACCM.DIMENSION_MGR.getType(), 1); + } + } + } + } + } + String dimensionPermRule = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "dimensionPermRule"); + if ("0".equals(dimensionPermRule)) { + boolean hasDimensionAccessPerm = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.ACCESS.getType(), true, list, accessModeMap); + if (hasDimensionAccessPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + } else { + boolean hasDimensionAccessPerm = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.ACCESS.getType(), false, list, accessModeMap); + if (hasDimensionAccessPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + } + // 维度借阅(借阅权限优于访问权限,否则用户无法借阅) + boolean hasDimensionBorrowPerm = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.BORROW.getType(), true, list, accessModeMap); + if (hasDimensionBorrowPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + + //维度管理员 + boolean hasDimensionMgrPerm = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true, list, accessModeMap); + if (hasDimensionMgrPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + DimensionPermCache.put(dimensionId, uid, false); + return false; + } + + public static boolean canAccessDimension(String dimensionId, String uid) { + String dimensionPermRule = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "dimensionPermRule"); + if ("0".equals(dimensionPermRule)) { + // 维度访问 + boolean hasDimensionAccessPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.ACCESS.getType(), true); + if (hasDimensionAccessPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + } else { + // 维度访问 + boolean hasDimensionAccessPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.ACCESS.getType(), false); + if (hasDimensionAccessPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + } + // 维度借阅(借阅权限优于访问权限,否则用户无法借阅) + boolean hasDimensionBorrowPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.BORROW.getType(), true); + if (hasDimensionBorrowPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + + //维度管理员 + boolean hasDimensionMgrPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true); + if (hasDimensionMgrPerm) { + DimensionPermCache.put(dimensionId, uid, true); + return true; + } + DimensionPermCache.put(dimensionId, uid, false); + return false; + } + + /** + * 维度是否能发布知识 + * + * @param dimensionId + * @param uid + * @return + */ + public static boolean canPublishDimension(String dimensionId, String uid) { + // 发布权限 + boolean hasDimensionPublishPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.PUBLISH.getType(), false); + if (hasDimensionPublishPerm) { + return true; + } + //维度管理员 + boolean hasDimensionMgrPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true); + if (hasDimensionMgrPerm) { + return true; + } + return false; + } + /** + * 是否能访问知识(非严格ac) + * + * 与维度无关,用户无论通过哪种途径能看到该知识均可访问 + * + * @param cardId + * @param uid + * @return + * @author wangshibao + */ + public static boolean canAccessKnwl(String cardId, String uid, boolean isKnwlMgr) { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel.getCreateUser().equals(uid)) { + return true; + } + + if (cardModel.getIsPublished() == KMSConstant.UNPUBLISHED) { + return false; + } + + if (!checkCardAC(cardId, uid)) { + return false; + } + + // 过滤有效期 + if (cardModel.getValidDate() != null && (cardModel.getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + return false; + } + // 过滤密级控制 + if (!checkSecurity(uid, cardModel)) { + return false; + } + + // 知识管理员 + if (isKnwlMgr) { + return true; + } + + Iterator publishIterator = PublishCache.getCache().iterator(); + while (publishIterator.hasNext()) { + try { + PublishModel publishModel = publishIterator.next(); + if (cardId.equals(publishModel.getCardId())) { + // 发布状态过滤:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + + // 维度管理员 + boolean hasDimensionMgrPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, publishModel.getDimensionId(), DimensionMgrACCM.DIMENSION_MGR.getType(), true); + if (hasDimensionMgrPerm) { + return true; + } + // 维度借阅(借阅权限优于访问权限,否则用户无法借阅) + boolean hasDimensionBorrowPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, publishModel.getDimensionId(), DimensionMgrACCM.BORROW.getType(), true); + if (hasDimensionBorrowPerm) { + continue; + } + // 维度访问 + boolean hasDimensionAccessPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, publishModel.getDimensionId(), DimensionMgrACCM.ACCESS.getType(), false); + if (hasDimensionAccessPerm) { + return true; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + + /** + * 是否需要借阅 + * + * @param dimensionId + * @param uid + * @return + * @author wangshibao + */ + public static boolean isNeedBorrow(String dimensionId, String uid, List acList) { + // 维度管理员 + List list = new ArrayList(); + Map accessModeMap = new HashMap(); + for (Iterator it = acList.iterator(); it.hasNext(); ) { + AccessControlModel ac = it.next(); + if (ac._resourceId.equals(dimensionId) && ac._resourceType.equals(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR)) { + list.add(ac); + if (ac._accessModel == DimensionMgrACCM.BORROW.getType()) { + if (accessModeMap.containsKey(DimensionMgrACCM.BORROW.getType())) { + accessModeMap.put(DimensionMgrACCM.BORROW.getType(), accessModeMap.get(DimensionMgrACCM.BORROW.getType()) + 1); + } else { + accessModeMap.put(DimensionMgrACCM.BORROW.getType(), 1); + } + } + if (ac._accessModel == DimensionMgrACCM.DIMENSION_MGR.getType()) { + if (accessModeMap.containsKey(DimensionMgrACCM.DIMENSION_MGR.getType())) { + accessModeMap.put(DimensionMgrACCM.DIMENSION_MGR.getType(), accessModeMap.get(DimensionMgrACCM.DIMENSION_MGR.getType()) + 1); + } else { + accessModeMap.put(DimensionMgrACCM.DIMENSION_MGR.getType(), 1); + } + } + } + } + boolean hasDimensionMgrPerm = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true, list, accessModeMap); + return !hasDimensionMgrPerm && havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.BORROW.getType(), true, list, accessModeMap); + } + + public static boolean isNeedBorrow(String dimensionId, String uid) { + // 维度管理员 + boolean hasDimensionMgrPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.DIMENSION_MGR.getType(), true); + return !hasDimensionMgrPerm && SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId, DimensionMgrACCM.BORROW.getType(), true); + } + + /** + * 补充权限外的但是必须显示的(返回维度DimensionMode的isPerm为false) + * + * @param dimensionModels + * @return + * @todo取名1,待重构后删掉getNoPermParentDimensions + * @author wangshibao + */ + public static List getNoPermParentDimensions(List dimensionModels, String uid) { + //获取可能有权限维度的后代维度 + List hasPermDimensionList = new ArrayList<>(); + //递归检查后代维度是否有权限,如果有,立即return + for (DimensionModel dimensionModel : dimensionModels) { + getNoPermRecur(uid, hasPermDimensionList, dimensionModel); + } + List returnDimensionList = new ArrayList<>(); + //根据后代维度计算出返回维度 + for (DimensionModel dimensionModel : hasPermDimensionList) { + getReturnDimension(dimensionModels, returnDimensionList, dimensionModel); + } + return returnDimensionList; + } + + /** + * 补充发布权限外的但是必须显示的(返回维度DimensionMode的isPerm为false) + * + * @param dimensionModels + * @return + * @todo取名1,待重构后删掉getNoPermParentDimensions + * @author wangshibao + */ + public static List getNoPublishPermParentDimensions(List dimensionModels, String uid) { + //获取可能有权限维度的后代维度 + List hasPermDimensionList = new ArrayList<>(); + //递归检查后代维度是否有权限,如果有,立即return + for (DimensionModel dimensionModel : dimensionModels) { + getNoPublishPermRecur(uid, hasPermDimensionList, dimensionModel); + } + List returnDimensionList = new ArrayList<>(); + //根据后代维度计算出返回维度 + for (DimensionModel dimensionModel : hasPermDimensionList) { + getReturnDimension(dimensionModels, returnDimensionList, dimensionModel); + } + return returnDimensionList; + } + + private static void getReturnDimension(List dimensionModels, List returnDimensionList, DimensionModel dimensionModel) { + boolean isGoon = true; + for (DimensionModel returnDimensionModel : dimensionModels) { + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + if (dimensionModel.getParentId().equals(returnDimensionModel.getId())) { + DimensionModel clone = returnDimensionModel.clone(); + clone.setHasPerm(false); + returnDimensionList.add(clone); + isGoon = false; + break; + } + } + } + if (isGoon) { + DimensionModel dimensionModel1 = DimensionCache.getCache().get(dimensionModel.getParentId()); + if (dimensionModel1 != null) { + getReturnDimension(dimensionModels, returnDimensionList, dimensionModel1); + } + } + } + + private static void getNoPublishPermRecur(String uid, List hasPermDimensionList, DimensionModel parentDimensionModel) { + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentDimensionModel.getId()); + boolean isGoon = true;//是否继续递归 + for (DimensionModel dimensionModel : dimensionListOfParent) { + boolean ac = true; + ac = KMSUtil.canPublishDimension(dimensionModel.getId(), uid); + if (ac) { + hasPermDimensionList.add(dimensionModel); + isGoon = false; + break; + } + } + if (isGoon) { + for (DimensionModel dimensionModel : dimensionListOfParent) { + getNoPermRecur(uid, hasPermDimensionList, dimensionModel); + } + } + } + private static void getNoPermRecur(String uid, List hasPermDimensionList, DimensionModel parentDimensionModel) { + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentDimensionModel.getId()); + boolean isGoon = true;//是否继续递归 + for (DimensionModel dimensionModel : dimensionListOfParent) { + boolean ac = true; + if (DimensionPermCache.hasCacheByUID(dimensionModel.getId(), uid)) { + ac = DimensionPermCache.getPermByUID(dimensionModel.getId(), uid); + } else { + ac = KMSUtil.canAccessDimension(dimensionModel.getId(), uid); + } + if (ac) { + hasPermDimensionList.add(dimensionModel); + isGoon = false; + break; + } + } + if (isGoon) { + for (DimensionModel dimensionModel : dimensionListOfParent) { + getNoPermRecur(uid, hasPermDimensionList, dimensionModel); + } + } + } + + /** + * 根据维度模型List获取 Map<维度Id,维度模型> + * + * @param dimensionModels + * @return + * @author wangshibao + */ + private static Map getDimensionMap(List dimensionModels) { + Map dimensionMap = new HashMap(); + if (dimensionModels != null && dimensionModels.size() != 0) { + for (DimensionModel dimensionModel : dimensionModels) { + dimensionMap.put(dimensionModel.getId(), dimensionModel); + } + } + return dimensionMap; + } + + /** + * 是否知识管理员 + * + * @param uid + * @return + * @author wangshibao + */ + public static boolean isKnwlManager(String uid) { + // 知识管理员 + return SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR, KMSConstant.AC_RESOURCE_ID_KNWL_MGR, KnwlMgrACCM.KNWLMGR.getType(), true); + } + + /** + * 获取文件的版本号 + * + * @param cardId 知识ID + * @param fileName 文件名 + * @return + * @author wangshibao + */ + public static String getNextFileVersion(String cardId, String fileName) { + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + FileModel currentFileModel = null; + // 1、寻找最新文件的版本 + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (cardId.equals(fileModel.getCardId()) && fileName.equals(fileModel.getFileName()) && fileModel.getFileState() == 1) { + currentFileModel = fileModel; + break; + } + } + final String currentVersion = currentFileModel == null ? null : currentFileModel.getFileVer(); + // 2、根据最新文件(或null)计算下一个版本号 + VersionCache versionCache = VersionCache.getCache(); + Iterator versionIterator = versionCache.iteratorSorted(new Comparator() { + @Override + public int compare(VersionModel o1, VersionModel o2) { + double result = Double.parseDouble(o1.getVersionNo()) - Double.parseDouble(o2.getVersionNo()); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + if (UtilString.isEmpty(currentVersion)) {// 没有重名文件 + String minVersion = null; + if (versionIterator.hasNext()) { + minVersion = versionIterator.next().getVersionNo(); + } + return UtilString.isEmpty(minVersion) ? "1.0" : minVersion; + } else {// 有重名文件 + final VersionModel tmpVersionModel = new VersionModel(); + while (versionIterator.hasNext()) { + String nextNo1 = versionIterator.next().getVersionNo(); + if (Double.parseDouble(currentVersion) < Double.parseDouble(nextNo1)) { + tmpVersionModel.setVersionNo(nextNo1); + break; + } else if (Double.parseDouble(currentVersion) == Double.parseDouble(nextNo1)) { + if (versionIterator.hasNext()) { + tmpVersionModel.setVersionNo(versionIterator.next().getVersionNo()); + break; + } + + } + } + if (UtilString.isEmpty(tmpVersionModel.getVersionNo())) { + String nextVersion = ""; + if (currentVersion.indexOf(".") > 0) { + String tmp = currentVersion.substring(currentVersion.length() - 1, currentVersion.length()); + int lastVersion = 0; + try { + lastVersion = Integer.parseInt(tmp); + } catch (Exception e) { + e.printStackTrace(); + } + lastVersion += 1; + nextVersion = currentVersion.substring(0, currentVersion.length() - 1) + lastVersion; + } else { + nextVersion = currentVersion + ".1"; + } + return nextVersion; + } else { + return tmpVersionModel.getVersionNo(); + } + } + } + + /** + * 获取重名文件的版本号别名 + * + * @param fileName 文件名 + * @param fileVersion 版本号,比如1.2,3.3 + * @return + * @author wangshibao + */ + public static String getFileNameOfVersion(String fileName, String fileVersion) { + if (fileName.indexOf(".") == -1) {// 如果文件名没有后缀 + return fileName + "_v" + fileVersion; + } else { + return fileName.substring(0, fileName.lastIndexOf(".")) + "_v" + fileVersion + "." + fileName.substring(fileName.lastIndexOf(".") + 1); + } + } + + /** + * 获取文件后缀 + * + * @param fileName + * @return + * @author wangshibao + */ + public static String getFileSuffix(String fileName) { + try { + if (fileName.indexOf(".") == -1) {// 如果文件名没有后缀 + return ""; + } else { + return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); + } + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + /** + * 获取文件后缀对应的图标名 + * + * @param fileName + * @return + * @author wangshibao + */ + public static String getFileIconName(String fileName) { + String fileSuffix = getFileSuffix(fileName); + String docs = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.FILE_SUFFIX_DOC); + List docList = Arrays.asList(docs.split(",")); + if (docList.contains(fileSuffix)) { + return fileSuffix; + } + String pictures = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.FILE_SUFFIX_PICTURE); + List pictureList = Arrays.asList(pictures.split(",")); + if (pictureList.contains(fileSuffix)) { + return KMSConstant.FILE_SUFFIX_PICTURE; + } + String audios = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.FILE_SUFFIX_AUDIO); + List audioList = Arrays.asList(audios.split(",")); + if (audioList.contains(fileSuffix)) { + return KMSConstant.FILE_SUFFIX_AUDIO; + } + String videos = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.FILE_SUFFIX_VIDEO); + List videoList = Arrays.asList(videos.split(",")); + if (videoList.contains(fileSuffix)) { + return KMSConstant.FILE_SUFFIX_VIDEO; + } + return ""; + } + // /**因为文件名可能存在歧义,比如没有后缀,或后缀为数字,则无法正确解析,所以此方法先作废,直接显示原名称 + // * 获取文件名的版本号别名(将abc_v2.3.txt转换为abc.txt v2.3) + // * + // * @param fileName + // * @return + // * @author wangshibao + // */ + // public static String getFileNameOfVersion(String fileName) { + // int vStart = fileName.lastIndexOf("_v"); + // int vEnd = fileName.indexOf(".", fromIndex) + // return ""; + // } + + /** + * 过滤掉不可用的维度 + * + * @param dimensionModels + * @return + * @author wangshibao + */ + public static List filterDisabledDimension(List dimensionModels) { + if (dimensionModels != null && dimensionModels.size() != 0) { + List newDimensionModels = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionModels) { + if (dimensionModel.getIsEnabled() == 1) { + newDimensionModels.add(dimensionModel); + } + } + return newDimensionModels; + } else { + return dimensionModels; + } + } + + /** + * 判断是否有密级权限 + * + * @param uid + * @param cardModel + * @return + * @author wangshibao + */ + public static boolean checkSecurity(String uid, CardModel cardModel) { + boolean tmpFlag = false; + if (cardModel == null) { + return tmpFlag; + } + if (cardModel.getCreateUser().equals(uid)) { + tmpFlag = true; + } else { + if (HighSecurity.isSecurityLevel()) {//使用三元的保密级别 + UserModel userModel = UserCache.getModel(uid); + tmpFlag = userModel.getSecurityLevel() >= cardModel.getSecurityLevel(); + } else {//使用权限组的保密级别 + if (cardModel.getSecurityLevel() == SecurityLevelConst.LAYER_0) { + tmpFlag = true; + } else if (cardModel.getSecurityLevel() == SecurityLevelConst.LAYER_1) { + tmpFlag = PermAPIManager.getInstance().havingDocumentLayerPermission(uid, AWFDocumentLayerUnit.SECURITY2) || PermAPIManager.getInstance().havingDocumentLayerPermission(uid, AWFDocumentLayerUnit.SECURITY3); + } else if (cardModel.getSecurityLevel() == SecurityLevelConst.LAYER_2) { + tmpFlag = PermAPIManager.getInstance().havingDocumentLayerPermission(uid, AWFDocumentLayerUnit.SECURITY3); + } else if (cardModel.getSecurityLevel() == SecurityLevelConst.LAYER_3) { + tmpFlag = PermAPIManager.getInstance().havingDocumentLayerPermission(uid, AWFDocumentLayerUnit.SECURITY4); + } + } + } + return tmpFlag; + } + + public static Iterator cardACList; + /** + * 是否有知识访问权限(非严格AC) + * + * @param cardId + * @param uid + * @return + * @author wangshibao + */ + public static boolean checkCardAC(String cardId, String uid, List acList) { + try { + if (CardCache.getCache().get(cardId) != null && CardCache.getCache().get(cardId).getCreateUser().equals(uid)) { + CardPermCache.put(cardId, uid, true); + return true; + } + List list = new ArrayList(); + Map accessModeMap = new HashMap(); + for (Iterator it = acList.iterator(); it.hasNext(); ) { + AccessControlModel ac = it.next(); + if (ac != null) { + if (cardId.equals(ac._resourceId) && KMSConstant.AC_RESOURCE_TYPE_CARD.equals(ac._resourceType)) { + list.add(ac); + if (ac._accessModel == CardACCM.CARD.getType()) { + if (accessModeMap.containsKey(CardACCM.CARD.getType())) { + accessModeMap.put(CardACCM.CARD.getType(), accessModeMap.get(CardACCM.CARD.getType()) + 1); + } else { + accessModeMap.put(CardACCM.CARD.getType(), 1); + } + } + } + } + } + boolean flag = havingPermission(uid, KMSConstant.AC_RESOURCE_TYPE_CARD, cardId, CardACCM.CARD.getType(), false, list, accessModeMap); + CardPermCache.put(cardId, uid, flag); + return flag; + } catch (Exception e) { + e.printStackTrace(); + CardPermCache.put(cardId, uid, false); + return false; + } + } + + public static boolean checkCardAC(String cardId, String uid) { + try { + if (CardCache.getCache().get(cardId) != null && CardCache.getCache().get(cardId).getCreateUser().equals(uid)) { + CardPermCache.put(cardId, uid, true); + return true; + } + boolean flag = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_CARD, cardId, CardACCM.CARD.getType(), false); + CardPermCache.put(cardId, uid, flag); + return flag; + } catch (Exception e) { + e.printStackTrace(); + CardPermCache.put(cardId, uid, false); + return false; + } + } + /** + * 通用表单加载后方法,向表单注入申请人和知识路径、管理员 + * + * @param pec + * @author wangshibao + */ + public static void commonFormAfterLoad(ProcessExecutionContext pec) { + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + String pubUserInfo = ""; + String dimPath = ""; + String dimensionAdmin = ""; + if (bo != null) { + String pubUser = bo.getString("APPLYUSER"); + pubUserInfo = pubUser; + UserModel pubUM = UserCache.getModel(pubUser); + if (pubUM != null) { + pubUserInfo = pubUM.getUserName() + "/" + SDK.getORGAPI().getDepartmentByUser(pubUser).getName(); + } + DimensionService dimService = new DimensionService(); + String dimId = bo.getString("DIMENSIONID"); + if (UtilString.isNotEmpty(dimId)) { + dimPath = dimService.getDimensionPath(dimId, " > "); + dimensionAdmin = SDK.getORGAPI().getUserNames(dimService.getDimensionAdmin(dimId)); + } + } + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + macroLibraries.put("APPLYUSERNAME", pubUserInfo); + macroLibraries.put("DIMENSIONNAME", dimPath); + macroLibraries.put("DIMENSIONADMIN", dimensionAdmin); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + + } + + /** + * 浏览知识的表单加载后方法 + * + * @param pec + * @author wangshibao + */ + public static void browseFormAfterLoad(ProcessExecutionContext pec) { + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + macroLibraries.put("sid", pec.getUserContext().getSessionId()); + String mePhoto = SDK.getPortalAPI().getUserPhoto(pec.getUserContext(), pec.getUserContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(pec.getUserContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + } + + /** + * 获取文档预览支持的后缀 + * + * @param sid + * @return + */ + public static String getCanPreviewType(String sid) { + String supportType = ""; + try { + String aslp = "aslp://com.actionsoft.apps.addons.wpsonline/getSupportType"; + Map params = new HashMap(); + params.put("sid", sid); + AppAPI appAPI = SDK.getAppAPI(); + //文档预览支持的文件类型 + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + supportType = (String) ro.get("pc_suffix"); + } catch (Exception e) { + e.printStackTrace(); + } + return supportType; + } + + public static boolean havingPermission(String uid, String resourceType, String resourceId, int accessMode, boolean restrict, List acList, Map accessModelMap) { + if (GradeSecurityUtil.isSuperMaster(uid) || GradeSecurityUtil.isSystemMaster(uid)) { + return true; + } + + if (restrict) {// 严格模式 + boolean check = havingPermission(uid, resourceType, resourceId, accessMode, acList); + return check; + } else {// 非严格模式 + if (!accessModelMap.containsKey(accessMode)) { + return true; + } else { + boolean check = havingPermission(uid, resourceType, resourceId, accessMode, acList); + return check; + } + } + } + + /** + * 查看某人是否拥有对某个资源的访问权限 + * + * @param uid + * @param resourceType + * @param resourceId + * @param accessMode + * @return + */ + public static boolean havingPermission(String uid, String resourceType, String resourceId, int accessMode, List acList) { + UserModel user = UserCache.getModel(uid); + if (user == null) { + return false; + } + boolean isAccess = false; + Iterator h = acList.iterator(); + // 优化到循环外 + DepartmentModel departmentModel = DepartmentCache.getModel(user.getDepartmentId()); + if (departmentModel == null) { + return false; + } + CompanyModel companyModel = CompanyCache.getModel(departmentModel.getCompanyId()); + if (companyModel == null) { + return false; + } + while (h.hasNext()) { + AccessControlModel model = h.next(); + isAccess = havingPermission(user, model, accessMode, departmentModel, companyModel); + if (isAccess) { + break;// 退出大循环,匹配成功 + } + } + return isAccess; + } + + private static boolean havingPermission(UserModel user, AccessControlModel model, int accessMode, DepartmentModel departmentModel, CompanyModel companyModel) { + boolean isAccess = false; + if (model._assignmentType.equals("company")) { + if (model._assignmentId.equals(companyModel.getId())) { + isAccess = model._accessModel == accessMode; + } + // 检查兼任职位 + if (!isAccess) { + List mapList = UserMapCache.getMapListOfUser(user.getUID()); + if (mapList != null && mapList.size() > 0) { + for (int ii = 0; ii < mapList.size(); ii++) { + UserMapModel mapModel = mapList.get(Integer.valueOf(ii)); + DepartmentModel mapDeptModel = DepartmentCache.getModel(mapModel.getDepartmentId()); + if (mapDeptModel != null) { + CompanyModel mapCompanyModel = CompanyCache.getModel(mapDeptModel.getCompanyId()); + if (mapCompanyModel != null && model._assignmentId.equals(mapCompanyModel.getId())) { + isAccess = model._accessModel == accessMode; + if (isAccess) + break; + } + } + } + } + } + } else if (model._assignmentType.equals("department")) { + DepartmentModel dModel = DepartmentCache.getModel(model._assignmentId);// SubDepartmentUtil.isSubDepartment + if (departmentModel.getId().equals(model._assignmentId) || (putDepartmentTree(dModel, departmentModel.getId()))) { + isAccess = model._accessModel == accessMode; + } + // 检查兼任职位 + if (!isAccess) { + List mapList = UserMapCache.getMapListOfUser(user.getUID()); + if (mapList != null && mapList.size() > 0) { + for (int ii = 0; ii < mapList.size(); ii++) { + UserMapModel mapModel = mapList.get(Integer.valueOf(ii)); + DepartmentModel mapDeptModel = DepartmentCache.getModel(mapModel.getDepartmentId()); + if (mapDeptModel != null) { + if (mapDeptModel.getId().equals(model._assignmentId) || (putDepartmentTree(dModel, mapDeptModel.getId()))) { + isAccess = model._accessModel == accessMode; + } + } + if (isAccess) + break; + } + } + } + } else if (model._assignmentType.equals("role")) { + if (model._assignmentId.equals(user.getRoleId())) { + isAccess = model._accessModel == accessMode; + } + if (!isAccess) { + // 检查兼任职位 + List mapList = UserMapCache.getMapListOfUser(user.getUID()); + if (mapList != null && mapList.size() > 0) { + for (int ii = 0; ii < mapList.size(); ii++) { + UserMapModel mapModel = mapList.get(Integer.valueOf(ii)); + if (mapModel != null && model._assignmentId.equals(mapModel.getRoleId())) { + isAccess = model._accessModel == accessMode; + if (isAccess) + break; + } + } + } + } + } else if (model._assignmentType.equals("team")) { + Iterator tH = TeamMemberCache.getListOfMember(model._assignmentId); + while (tH.hasNext()) { + TeamMemberModel uModel = tH.next(); + if (user.getUID() != null && user.getUID().equals(uModel.getUserId())) { + isAccess = model._accessModel == accessMode; + if (isAccess) + break; + } + } + } else if (model._assignmentType.equals("user") && model._assignmentId.equals(user.getUID())) { + isAccess = model._accessModel == accessMode; + } + return isAccess; + } + + /** + * @param rootModel + * @param currentDepartmentId + * @return + */ + private static boolean putDepartmentTree(DepartmentModel rootModel, String currentDepartmentId) { + String departmentFullId = "/" + DepartmentCache.getFullID(currentDepartmentId); + if (rootModel != null) { + String sourceDepartmentId = "/" + rootModel.getId() + "/"; + if (departmentFullId.indexOf(sourceDepartmentId) != -1) { + return true; + } else { + return false; + } + } else { + return false; + } + } + + public static String toDigestUTF8(String src) { + return toDigest(src, AES.CHARTSET); + } + + /** + * 重载方法:获得一个哈西摘要串 + * + * @param src 原文字符串 + * @param charset 编码 + * @return 摘要串 + */ + public static String toDigest(String src, String charset) { + // return DigestUtils.md5Hex(src);速度慢 + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(src.getBytes(charset)); + return getFormattedText(messageDigest.digest()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String getFormattedText(byte[] bytes) { + int len = bytes.length; + StringBuilder buf = new StringBuilder(len * 2); + // 把密文转换成十六进制的字符串形式 + for (int j = 0; j < len; j++) { + buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); + buf.append(HEX_DIGITS[bytes[j] & 0x0f]); + } + return buf.toString(); + } + + /** + * 过滤引号 + * + * @param contextStr + * @return + */ + public static String replaceText(String contextStr) { + contextStr = contextStr.replaceAll("\"", ""); + contextStr = contextStr.replaceAll("\'", ""); + contextStr = contextStr.replaceAll("“", ""); + contextStr = contextStr.replaceAll("”", ""); + contextStr = contextStr.replaceAll("‘", ""); + contextStr = contextStr.replaceAll("’", ""); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < contextStr.length(); i++) { + char c = contextStr.charAt(i); + switch (c) { + case '\"': + sb.append("\\\""); + break; + case '\\': + sb.append("\\\\"); + break; + case '/': + sb.append("\\/"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + default: + sb.append(c); + } + } + return sb.toString(); + } + + public static String getPlainText(String htmlStr) { + String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; + String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; + String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式 + Pattern p_script; + java.util.regex.Matcher m_script; + Pattern p_style; + java.util.regex.Matcher m_style; + Pattern p_html; + java.util.regex.Matcher m_html; + p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE); + m_script = p_script.matcher(htmlStr); + htmlStr = m_script.replaceAll(""); // 过滤script标签 + + p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE); + m_style = p_style.matcher(htmlStr); + htmlStr = m_style.replaceAll(""); // 过滤style标签 + + p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE); + m_html = p_html.matcher(htmlStr); + htmlStr = m_html.replaceAll(""); // 过滤html标签 + + /*htmlStr = htmlStr.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", ""); + htmlStr = htmlStr.replaceAll("\\s*", ""); + htmlStr = htmlStr.replaceAll(" ", ""); */ + return htmlStr; + } + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + public static String getSecurityLevelLabel(int securityLevel) { + String label = ""; + HighSecurityModel highSecurityMod = HighSecurity.getSecModel(); + List> formSecurityList = highSecurityMod.getFormSecurityList(); + for (List list1 : formSecurityList) { + if (list1.size() == 2 && securityLevel == (Integer.parseInt(list1.get(0).toString()))) { + label = list1.get(1).toString(); + break; + } + } + return label; + } + + /** + * 获得指定日期与当前日期比较后的别名,精确到天 + * + * @param timestamp + * @return text 返回指定日期与当前日期比较后的别名,精确到天;1小时内显示“刚刚”,大于1小时显示格式为时:分,其余显示如:昨天、去年3月8日 + */ + public static String getAliasDate(Timestamp timestamp) { + long compare = timestamp.getTime();// getTimes(timestamp.toString()); + long now = System.currentTimeMillis();// getTimes(dateFormat(new Date())); + Timestamp timestampNow = new Timestamp(now); + double difOfHour = (compare - now) / (1000d * 60d * 60d);// 几个小时 + double difOfMin = (compare - now) / (1000d * 60d);// 几分钟 + + int compareDay = getDay(timestamp); + int currentDay = getDay(timestampNow); + + int compareYear = getYear(timestamp); + int currentYear = getYear(timestampNow); + + int compareMonth = getMonth(timestamp); + int currentMonth = getMonth(timestampNow); + + Date compareDate = new Date(timestamp.getTime()); + + // 国际化内容 + String appId = AppsConst.SYS_APP_PORTAL; + String lang = LoginConst.DEFAULT_LANG; + try { + lang = DispatcherRequest.getUserContext().getLanguage(); + } catch (Exception e) { + + } + + String result = ""; + // 重新构造算法,zhanghf 2016.2.17 + if (compareYear == currentYear) {// 两个时间处于同一年 + if (compareMonth == currentMonth) {// 两个时间处于同一月 + if (compareDay == currentDay) {// 两个时间处于同一天 + if (Math.abs(difOfMin) <= 5) {// 小于1小时的显示“刚刚” + result = I18nRes.findValue(appId, "刚刚"); + } else if (Math.abs(difOfMin) > 5 && Math.abs(difOfMin) <= 10) { + result = "5分钟前"; + } else if (Math.abs(difOfMin) > 10 && Math.abs(difOfMin) <= 20) { + result = "10分钟前"; + } else if (Math.abs(difOfMin) > 20 && Math.abs(difOfMin) <= 30) { + result = "20分钟前"; + } else if (Math.abs(difOfMin) > 30 && Math.abs(difOfMin) <= 60) { + result = "半个小时前"; + } + /* + else if (Math.abs(difOfHour)>0.5 && Math.abs(difOfHour) <= 1) { + result = I18nRes.findValue(appId, "一个小时前"); + }else if (Math.abs(difOfHour)>1 && Math.abs(difOfHour) <= 3) { + result = I18nRes.findValue(appId, "二个小时前"); + } + */ + else {// 大于1小时的,显示具体时间 + result = timeFormat(timestamp, "HH:mm");// + if (result.equals("00:00")) { + result = I18nRes.findValue(appId, "今天"); + } + } + } else { + long difOfDay = compareDay - currentDay; + if (difOfDay == -1) { + result = I18nRes.findValue(appId, "昨天"); + } else if (difOfDay == -2) { + result = I18nRes.findValue(appId, "前天"); + } else if (difOfDay == 1) { + result = I18nRes.findValue(appId, "明天"); + } else { + if (lang.equals("en")) { + result = datetimeFormat(compareDate, "MMM,d", Locale.US); + } else { + result = datetimeFormat(compareDate, "M月d日");// 同一年里只显示只显示月日 + } + } + } + } else {// 两个时间大于一个月 + if (lang.equals("en")) { + result = datetimeFormat(compareDate, "MMM,d", Locale.US); + } else { + result = datetimeFormat(compareDate, "M月d日");// 同一年里只显示只显示月日 + } + } + } else {// 两个时间大于一年 + // 英语环境下,使用英式日期格式 + if (lang.equals("en")) { + result = datetimeFormat(compareDate, "MMM,d", Locale.US); + } else { + int difOfYear = compareYear - currentYear; + if (difOfYear == -1) { + result = datetimeFormat(compareDate, "去年M月d日"); + } else if (difOfYear == -2) { + result = datetimeFormat(compareDate, "前年M月d日"); + } else if (difOfYear == 1) { + result = datetimeFormat(compareDate, "明年M月d日"); + } else { + result = datetimeFormat(compareDate, "yyyy年M月d日"); + } + } + } + return result; + } + + /** + * 使用当前默认的语言环境获得日期时间 + * + * @param date + * @param format + * @return 日期格式yyyy-MM-dd HH:mm:ss(old:yyyy-MM-dd hh:mm:ss a) + */ + public static String datetimeFormat(Date date, String format) { + return UtilDate.datetimeFormat(date, format, Locale.CHINA); + } + + /** + * 获得日期时间 + * + * @param date + * @param format + * @param locale 针对指定的语言环境处理 + * @return 日期格式yyyy-MM-dd HH:mm:ss(old:yyyy-MM-dd hh:mm:ss a) + */ + public static String datetimeFormat(Date date, String format, Locale locale) { + if (date == null) { + return ""; + } + return UtilDate.datetimeFormat(date, format, locale); + + } + + /** + * 得到指定日期的年份 + * + * @param date + * @return + */ + public static int getYear(Date date) { + Calendar gregorianCalendar = GregorianCalendar.getInstance(); + gregorianCalendar.setTime(date); + return gregorianCalendar.get(Calendar.YEAR); + } + + /** + * 得到指定日期的小时 + * + * @param date + * @return + */ + public static int getHour(Date date) { + Calendar gregorianCalendar = GregorianCalendar.getInstance(); + gregorianCalendar.setTime(date); + // gregorianCalendar.setGregorianChange(date); + return gregorianCalendar.get(Calendar.HOUR_OF_DAY); + } + + /** + * 得到指定日期的月份 + * + * @param date + * @return + */ + public static int getMonth(Date date) { + Calendar gregorianCalendar = GregorianCalendar.getInstance(); + gregorianCalendar.setTime(date); + return gregorianCalendar.get(Calendar.MONTH) + 1; + } + + /** + * 得到指定日期的天 + * + * @param date + * @return + */ + public static int getDay(Date date) { + Calendar gregorianCalendar = GregorianCalendar.getInstance(); + gregorianCalendar.setTime(date); + return gregorianCalendar.get(Calendar.DAY_OF_MONTH); + } + + /** + * 获得日期 + * + * @param date + * @return 格式HH:mm:ss + */ + public static String timeFormat(Date date) { + return UtilDate.timeFormat(date); + } + + /** + * 获得参数指定日期 + * + * @param date + * @param format + * @return 指定格式的时间串 + */ + public static String timeFormat(Date date, String format) { + if (date == null) { + return ""; + } + return UtilDate.timeFormat(date, format); + } + + /** + * 获取当前登陆用户密级 + * @param userContext + * @return + */ + public static String getUserSecurityLevelLabel(UserContext userContext){ + int securityLevel = userContext.getUserModel().getSecurityLevel(); + HighSecurityModel highSecurityMod = HighSecurity.getSecModel(); + List> userSecurityList = highSecurityMod.getFormSecurityList(); + StringBuffer html =new StringBuffer(); + for(List list : userSecurityList){ + int security = Integer.valueOf(list.get(0).toString()); + String securityname = list.get(1).toString(); + if(security<=securityLevel){ + html.append(""); + html.append("\n"); + } + } + return html.toString(); + } + + + /** + * 根据密级获取中文名称 + */ + + public static String getUserSecurityName(int SecurityLevel){ + HighSecurityModel highSecurityMod = HighSecurity.getSecModel(); + + List> userSecurityList = highSecurityMod.getFormSecurityList(); + String securityname=""; + for(List list : userSecurityList){ + int security = Integer.valueOf(list.get(0).toString()); + if(SecurityLevel == security){ + securityname = list.get(1).toString(); + break; + } + } + return securityname; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/Plugins.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/Plugins.java new file mode 100644 index 00000000..f032eaae --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/Plugins.java @@ -0,0 +1,198 @@ +package com.actionsoft.apps.kms; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.ac.CardACCM; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.ac.KnwlMgrACCM; +import com.actionsoft.apps.kms.ac.MetaSchemaACCM; +import com.actionsoft.apps.kms.ac.XpageMgrACCM; +import com.actionsoft.apps.kms.aslp.CreateDimension; +import com.actionsoft.apps.kms.aslp.CreateFile; +import com.actionsoft.apps.kms.aslp.CreateFileByInputStream; +import com.actionsoft.apps.kms.aslp.CreateFormLink; +import com.actionsoft.apps.kms.aslp.CreateKnwl; +import com.actionsoft.apps.kms.aslp.FullSearch; +import com.actionsoft.apps.kms.aslp.GetDimension; +import com.actionsoft.apps.kms.aslp.GetFile; +import com.actionsoft.apps.kms.aslp.GetKnwl; +import com.actionsoft.apps.kms.aslp.PublishKnwl; +import com.actionsoft.apps.kms.aslp.SearchDimensionList; +import com.actionsoft.apps.kms.aslp.SearchFileList; +import com.actionsoft.apps.kms.aslp.SearchKnwlList; +import com.actionsoft.apps.kms.aslp.UpdateDimension; +import com.actionsoft.apps.kms.aslp.UpdateKnwl; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.HotspotCache; +import com.actionsoft.apps.kms.cache.MetaAttrCache; +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.cache.MetaSchemaCache; +import com.actionsoft.apps.kms.cache.OptCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.cache.VersionCache; +import com.actionsoft.apps.kms.dc.DocCardContentProcessor; +import com.actionsoft.apps.kms.dc.DocFileProcessor; +import com.actionsoft.apps.kms.dc.HotspotFileProcessor; +import com.actionsoft.apps.kms.dc.TmpFileProcessor; +import com.actionsoft.apps.kms.formatter.KMSNotificationFormatter; +import com.actionsoft.apps.kms.formatter.KMSReportFormatter; +import com.actionsoft.apps.kms.service.PermChangeByOrgSync; +import com.actionsoft.apps.kms.ui.FormUIComponentKnwlImpl; +import com.actionsoft.apps.kms.web.FavoriteWeb; +import com.actionsoft.apps.listener.PluginListener; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.apps.resource.plugin.profile.ACPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.ASLPPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.AWSPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.AppExtensionProfile; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.FormUIPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.FullSearchPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.HttpASLP; +import com.actionsoft.apps.resource.plugin.profile.OrgSyncPluginProfile; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; + +/** + * @author wangshibao + */ +public class Plugins implements PluginListener { + + @Override + public List register(AppContext appContext) { + List awsPluginProfiles = new ArrayList(); + // 缓存 + awsPluginProfiles.add(new CachePluginProfile(DimensionCache.class)); + awsPluginProfiles.add(new CachePluginProfile(CardCache.class)); + awsPluginProfiles.add(new CachePluginProfile(PublishCache.class));// publish是card和dimension的中间表,应在两者之后加载cache + awsPluginProfiles.add(new CachePluginProfile(FileCache.class)); + awsPluginProfiles.add(new CachePluginProfile(OptCache.class)); + awsPluginProfiles.add(new CachePluginProfile(VersionCache.class)); + awsPluginProfiles.add(new CachePluginProfile(HotspotCache.class)); + awsPluginProfiles.add(new CachePluginProfile(MetaSchemaCache.class)); + awsPluginProfiles.add(new CachePluginProfile(MetaAttrCache.class)); + awsPluginProfiles.add(new CachePluginProfile(MetaDataCache.class)); + awsPluginProfiles.add(new CachePluginProfile(CardPermCache.class)); + awsPluginProfiles.add(new CachePluginProfile(DimensionPermCache.class)); + awsPluginProfiles.add(new CachePluginProfile(DimensionTreeCache.class)); + // aslp + awsPluginProfiles.add(new ASLPPluginProfile("createDimension", CreateDimension.class.getName(), "创建维度", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("updateDimension", UpdateDimension.class.getName(), "修改维度", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("searchDimensionList", SearchDimensionList.class.getName(), "查询维度列表", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("GetDimension", GetDimension.class.getName(), "查询单个维度", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("CreateKnwl", CreateKnwl.class.getName(), "创建知识", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("UpdateKnwl", UpdateKnwl.class.getName(), "修改知识", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("SearchKnwlList", SearchKnwlList.class.getName(), "查询知识(多个参数之间是AND关系,单个参数内部是OR关系)", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("GetKnwl", GetKnwl.class.getName(), "查询单个知识", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("GetFile", GetFile.class.getName(), "查询单个文件", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("CreateFile", CreateFile.class.getName(), "创建文件", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("CreateFileByInputStream", CreateFileByInputStream.class.getName(), "通过流创建文件", null)); + awsPluginProfiles.add(new ASLPPluginProfile("CreateFormLink", CreateFormLink.class.getName(), "创建表单链接类文件", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("SearchFileList", SearchFileList.class.getName(), "查询文件", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("FullSearch", FullSearch.class.getName(), "全文检索(由于KMS的权限限制,返回结果可能大于rowsPerPage条)", new HttpASLP(HttpASLP.AUTH_RSA, null))); + awsPluginProfiles.add(new ASLPPluginProfile("PublishKnwl", PublishKnwl.class.getName(), "发布知识", new HttpASLP(HttpASLP.AUTH_RSA, null))); + + // ac + KnwlMgrACCM knwlMgrACCM = new KnwlMgrACCM(); + //awsPluginProfiles.add(new ACPluginProfile(KnwlMgrACCM.resourceType, knwlMgrACCM.getResourceName(), null, knwlMgrACCM.getAccessModes(), false, true));// 知识管理员 + awsPluginProfiles.add(new ACPluginProfile(knwlMgrACCM));// 知识管理员 + XpageMgrACCM xpageMgrACCM = new XpageMgrACCM(); + //awsPluginProfiles.add(new ACPluginProfile(KnwlMgrACCM.resourceType, knwlMgrACCM.getResourceName(), null, knwlMgrACCM.getAccessModes(), false, true));// 知识管理员 + awsPluginProfiles.add(new ACPluginProfile(xpageMgrACCM));// XPAGE内容管理员 + + DimensionMgrACCM dimensionMgrACCM = new DimensionMgrACCM(); + //awsPluginProfiles.add(new ACPluginProfile(DimensionMgrACCM.resourceType, dimensionMgrACCM.getResourceName(), null, dimensionMgrACCM.getAccessModes(), false, true));// 维度管理员 + awsPluginProfiles.add(new ACPluginProfile(dimensionMgrACCM));// 维度管理员 + + MetaSchemaACCM metaSchemaACCM = new MetaSchemaACCM(); + awsPluginProfiles.add(new ACPluginProfile(MetaSchemaACCM.resourceType, metaSchemaACCM.getResourceName(), null, metaSchemaACCM.getAccessModes(), false, true)); + + CardACCM cardACCM = new CardACCM(); + //awsPluginProfiles.add(new ACPluginProfile(CardACCM.resourceType, cardACCM.getResourceName(), null, cardACCM.getAccessModes(), false, true)); + awsPluginProfiles.add(new ACPluginProfile(cardACCM)); + // dc + awsPluginProfiles.add(new DCPluginProfile(KMSConstant.DOC_REPOSITORY_NAME, DocFileProcessor.class.getName(), "普通文档,文档存放到该应用的doc目录下", false, true)); + awsPluginProfiles.add(new DCPluginProfile(KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME, DocCardContentProcessor.class.getName(), "卡片正文", false)); + awsPluginProfiles.add(new DCPluginProfile("tmp", TmpFileProcessor.class.getName(), "知识地图临时图片", false, false)); + // awsPluginProfiles.add(new DCPluginProfile(KMSConstant.ONLINEDOC_REPOSITORY_NAME, OnlinedocFileProcessor.class.getName(), "onlinedoc生成图片和pdf到该目录下", false)); + awsPluginProfiles.add(new DCPluginProfile(KMSConstant.DOC_REPOSITORY_HOTSPOT, HotspotFileProcessor.class.getName(), "用户上传的知识地图目录", false, false)); + // 全文检索 + awsPluginProfiles.add(new FullSearchPluginProfile(KMSConstant.FULLSEARCH_REPOSITORY_NAME, false, "KMS全文检索")); + // 注册应用扩展点-收藏 + Map params1 = new HashMap(); + params1.put("categoryName", KMSConstant.FAVORITE_CATEGORY_KMS); + params1.put("mainClass", FavoriteWeb.class.getName()); + awsPluginProfiles.add(new AppExtensionProfile("我的收藏->KMS", "aslp://com.actionsoft.apps.favorite/registerApp", params1)); + // 注册应用扩展点-通知-阅读邀请 + Map params2 = new HashMap(); + params2.put("systemName", KMSConstant.NOTIFICATION_SYSTEM_NAME); + params2.put("icon", ""); + params2.put("formatter", KMSNotificationFormatter.class.getName()); + awsPluginProfiles.add(new AppExtensionProfile("通知中心->浏览知识", "aslp://com.actionsoft.apps.notification/registerApp", params2)); + // 注册应用扩展点-通知-知识反馈 + Map params3 = new HashMap(); + params3.put("systemName", KMSConstant.REPORT_SYSTEM_NAME); + params3.put("icon", ""); + params3.put("formatter", KMSReportFormatter.class.getName()); + awsPluginProfiles.add(new AppExtensionProfile("通知中心->知识反馈", "aslp://com.actionsoft.apps.notification/registerApp", params3)); + //表单UI组件 + FormUIPluginProfile formUIPluginProfile = new FormUIPluginProfile("高级组件", "AWSUI.KnwlPortal", FormUIComponentKnwlImpl.class.getName(), "知识门户", "有访问权限的知识列表", false, true, false, false, false, true, true, false, false); + Class clazz = formUIPluginProfile.getClass(); + try { + Method setIconFont = clazz.getDeclaredMethod("setIconFont", String.class, String.class, String.class); + setIconFont.invoke(formUIPluginProfile, "awsui-iconfont", "", "#0c6e9f"); + } catch (Exception e) { + } + + awsPluginProfiles.add(formUIPluginProfile); + + // addons页面 + + // awsPluginProfiles.add(new AddOnsPluginProfile(AddonsWeb.class.getName())); + //注册全文检索 + Map params4 = new HashMap(); + params4.put("name", "知识"); + params4.put("url", "./w?cmd=com.actionsoft.apps.kms_es_search&sid=$sid&q=$q"); + params4.put("placeholder", "请输入要查询的内容..."); + params4.put("orderIndex", 45); + awsPluginProfiles.add(new AppExtensionProfile("知识", "aslp://com.actionsoft.apps.addons.es/registerApp", params4)); + + //注册xpages + String contextAll5 = HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.latest.xPageRegister.htm", null); + Map params5 = new HashMap(); + params5.put("systemName", "最新KMS知识"); + params5.put("type", "3"); + params5.put("functionPre", "kmslatest"); + params5.put("urlIdentifier", "com.actionsoft.apps.kms_xpages"); + params5.put("xpagesContent", contextAll5); + awsPluginProfiles.add(new AppExtensionProfile("最新KMS知识", "aslp://com.actionsoft.apps.addons.xpages/registerApp", params5)); + String contextAll = HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.directory.xPageRegister.htm", null); + Map params6 = new HashMap(); + params6.put("systemName", "KMS目录"); + params6.put("type", "3"); + params6.put("functionPre", "kmsdirectory"); + params6.put("urlIdentifier", "com.actionsoft.apps.kms_xpage_opencardbydirctory"); + params6.put("xpagesContent", contextAll); + awsPluginProfiles.add(new AppExtensionProfile("KMS目录", "aslp://com.actionsoft.apps.addons.xpages/registerApp", params6)); + String contextAll7 = HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.card.xPageRegister.htm", null); + Map params7 = new HashMap(); + params7.put("systemName", "KMS知识"); + params7.put("type", "3"); + params7.put("xpagesContent", contextAll7); + params7.put("urlIdentifier", "com.actionsoft.apps.kms_xpage_openfastcard"); + params7.put("functionPre", "kmscard"); + awsPluginProfiles.add(new AppExtensionProfile("KMS知识", "aslp://com.actionsoft.apps.addons.xpages/registerApp", params7)); + awsPluginProfiles.add(new OrgSyncPluginProfile(PermChangeByOrgSync.class.getName(), "组织结构变化同步维度知识权限")); + return awsPluginProfiles; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/CardACCM.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/CardACCM.java new file mode 100644 index 00000000..444a0642 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/CardACCM.java @@ -0,0 +1,63 @@ +package com.actionsoft.apps.kms.ac; + +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.bpms.commons.security.ac.model.ACAccessMode; +import com.actionsoft.bpms.commons.security.ac.model.ACCM; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; + +/** + * 知识访问ac + * + * @author wangshibao + */ +public class CardACCM extends ACCM { + public static ACAccessMode CARD = new ACAccessMode("知识访问", 0); + public static String resourceType = KMSConstant.AC_RESOURCE_TYPE_CARD; + public String resourceName = "知识访问"; + private String[] assignmentTypes; + private static ACAccessMode[] accessModes = new ACAccessMode[] { CARD }; + private boolean isolationCompany; + private boolean orgAdminSecurity = true; + + @Override + public String getResourceType() { + return resourceType; + } + + @Override + public String getResourceName() { + return resourceName; + } + + @Override + public String[] getAssignmentTypes() { + return assignmentTypes; + } + + @Override + public ACAccessMode[] getAccessModes() { + return accessModes; + } + + @Override + public boolean isIsolationCompany() { + return isolationCompany; + } + + @Override + public boolean isOrgAdminSecurity() { + return orgAdminSecurity; + } + + @Override + public void callBack(List acModelList) { + DimensionTreeCache.getCache().destroy(true); + for (AccessControlModel accessControlModel : acModelList) { + CardPermCache.getCache().remove(accessControlModel._resourceId); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/DimensionMgrACCM.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/DimensionMgrACCM.java new file mode 100644 index 00000000..ad0607ca --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/DimensionMgrACCM.java @@ -0,0 +1,67 @@ +package com.actionsoft.apps.kms.ac; + +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.bpms.commons.security.ac.model.ACAccessMode; +import com.actionsoft.bpms.commons.security.ac.model.ACCM; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; + +/** + * 二级知识管理员ac(或者叫维度管理员ac,区别于知识管理员) + * + * @author wangshibao + */ +public class DimensionMgrACCM extends ACCM { + public static ACAccessMode PUBLISH = new ACAccessMode("发布", 3); + public static ACAccessMode ACCESS = new ACAccessMode("访问", 0); + public static ACAccessMode BORROW = new ACAccessMode("借阅", 1); + public static ACAccessMode DIMENSION_MGR = new ACAccessMode("维度管理员", 2); + public static String resourceType = KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR; + public String resourceName = "维度管理员"; + private String[] assignmentTypes; + private static ACAccessMode[] accessModes = new ACAccessMode[] { PUBLISH, ACCESS, BORROW, DIMENSION_MGR }; + private boolean isolationCompany; + private boolean orgAdminSecurity = true; + + @Override + public String getResourceType() { + return resourceType; + } + + @Override + public String getResourceName() { + return resourceName; + } + + @Override + public String[] getAssignmentTypes() { + return assignmentTypes; + } + + @Override + public ACAccessMode[] getAccessModes() { + return accessModes; + } + + @Override + public boolean isIsolationCompany() { + return isolationCompany; + } + + @Override + public boolean isOrgAdminSecurity() { + return orgAdminSecurity; + } + + @Override + public void callBack(List acModelList) { + DimensionTreeCache.getCache().destroy(true); + for (AccessControlModel accessControlModel : acModelList) { + DimensionPermCache.getCache().remove(accessControlModel._resourceId); + DimensionTreeCache.getCache().destroy(true); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/KnwlMgrACCM.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/KnwlMgrACCM.java new file mode 100644 index 00000000..3ffd9361 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/KnwlMgrACCM.java @@ -0,0 +1,63 @@ +package com.actionsoft.apps.kms.ac; + +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.bpms.commons.security.ac.model.ACAccessMode; +import com.actionsoft.bpms.commons.security.ac.model.ACCM; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; + +/** + * 知识管理员ac + * + * @author wangshibao + */ +public class KnwlMgrACCM extends ACCM { + public static ACAccessMode KNWLMGR = new ACAccessMode("知识管理员", 0); + public static String resourceType = KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR; + public String resourceName = "知识管理员"; + private String[] assignmentTypes; + private static ACAccessMode[] accessModes = new ACAccessMode[] { KNWLMGR }; + private boolean isolationCompany; + private boolean orgAdminSecurity = true; + + @Override + public String getResourceType() { + return resourceType; + } + + @Override + public String getResourceName() { + return resourceName; + } + + @Override + public String[] getAssignmentTypes() { + return assignmentTypes; + } + + @Override + public ACAccessMode[] getAccessModes() { + return accessModes; + } + + @Override + public boolean isIsolationCompany() { + return isolationCompany; + } + + @Override + public boolean isOrgAdminSecurity() { + return orgAdminSecurity; + } + + @Override + public void callBack(List acModelList) { + DimensionTreeCache.getCache().destroy(true); + DimensionPermCache.getCache().destroy(true); + CardPermCache.getCache().destroy(true); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/MetaSchemaACCM.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/MetaSchemaACCM.java new file mode 100644 index 00000000..74f5e31f --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/MetaSchemaACCM.java @@ -0,0 +1,52 @@ +package com.actionsoft.apps.kms.ac; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.commons.security.ac.model.ACAccessMode; +import com.actionsoft.bpms.commons.security.ac.model.ACCM; + +/** + * 元数据ac(发布和访问) + * + * @author wangshibao + */ +public class MetaSchemaACCM extends ACCM { + public static ACAccessMode PUBLISH = new ACAccessMode("发布", 0); + public static ACAccessMode READ = new ACAccessMode("访问", 1); + public static String resourceType = KMSConstant.AC_RESOURCE_TYPE_META_SCHEMA; + public String resourceName = "元数据发布访问权限"; + private String[] assignmentTypes; + private static ACAccessMode[] accessModes = new ACAccessMode[] { PUBLISH, READ }; + private boolean isolationCompany; + private boolean orgAdminSecurity = true; + + @Override + public String getResourceType() { + return resourceType; + } + + @Override + public String getResourceName() { + return resourceName; + } + + @Override + public String[] getAssignmentTypes() { + return assignmentTypes; + } + + @Override + public ACAccessMode[] getAccessModes() { + return accessModes; + } + + @Override + public boolean isIsolationCompany() { + return isolationCompany; + } + + @Override + public boolean isOrgAdminSecurity() { + return orgAdminSecurity; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/XpageMgrACCM.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/XpageMgrACCM.java new file mode 100644 index 00000000..fe49c4e0 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ac/XpageMgrACCM.java @@ -0,0 +1,51 @@ +package com.actionsoft.apps.kms.ac; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.commons.security.ac.model.ACAccessMode; +import com.actionsoft.bpms.commons.security.ac.model.ACCM; + +/** + * xpage内容管理员ac + * + * @author wangshibao + */ +public class XpageMgrACCM extends ACCM { + public static ACAccessMode XPAGEMGR = new ACAccessMode("xpage内容管理员", 0); + public static String resourceType = KMSConstant.AC_RESOURCE_TYPE_XPAGE_MGR; + public String resourceName = "xpage内容管理员"; + private String[] assignmentTypes; + private static ACAccessMode[] accessModes = new ACAccessMode[] { XPAGEMGR }; + private boolean isolationCompany; + private boolean orgAdminSecurity = true; + + @Override + public String getResourceType() { + return resourceType; + } + + @Override + public String getResourceName() { + return resourceName; + } + + @Override + public String[] getAssignmentTypes() { + return assignmentTypes; + } + + @Override + public ACAccessMode[] getAccessModes() { + return accessModes; + } + + @Override + public boolean isIsolationCompany() { + return isolationCompany; + } + + @Override + public boolean isOrgAdminSecurity() { + return orgAdminSecurity; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateDimension.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateDimension.java new file mode 100644 index 00000000..bb5df473 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateDimension.java @@ -0,0 +1,83 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class CreateDimension implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'dimensionName', required: true, desc: '维度名称'", "name: 'parentId', required: true, desc: '父维度Id:\"\"表示根维度'", "name: 'showType', required: true, desc: '维度类型,1:允许发布知识 2:不允许发布知识'", "name: 'isExamine', required: true, desc: '发布是否需要审批,默认false'", "name: 'memo', required: false, desc: '维度描述'", "name: 'isEnabled', required: true, desc: '是否启用,默认启用'", "name: 'createUser', required: false, desc: '创建人'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String dimensionName = (String) params.get("dimensionName"); + if (UtilString.isEmpty(dimensionName) || UtilString.isEmpty(dimensionName.trim())) { + ro = ResponseObject.newErrResponse("维度名称不允许为空"); + return ro; + } + + String parentId = (String) params.get("parentId"); + if (!parentId.equals("")) { + DimensionModel dimensionModel = DimensionCache.getCache().get(parentId); + if (dimensionModel == null) { + ro = ResponseObject.newErrResponse("父维度Id不存在"); + return ro; + } + } + + Integer showTypeI = Integer.valueOf(params.get("showType").toString()); + if (showTypeI != null) { + int showType = showTypeI.intValue(); + if (showType != KMSConstant.SHOWTYPE_CATEGORY && showType != KMSConstant.SHOWTYPE_DIMENSION) { + ro = ResponseObject.newErrResponse("维度类型不正确"); + return ro; + } + } + + String createUser = UserContext.fromSessionId(sid).getUID(); + if (params.containsKey("createUser")) { + createUser = (String) params.get("createUser"); + } + UserModel createUserModel = SDK.getORGAPI().getUser(createUser); + if (createUserModel == null || createUserModel.isClosed()) { + ro = ResponseObject.newErrResponse("创建人UID不存在或已注销"); + return ro; + } + boolean isExamine = Boolean.valueOf(params.get("isExamine").toString()); + String memo = (String) params.get("memo"); + boolean isEnabled = Boolean.valueOf(params.get("isEnabled").toString()); + + DimensionService dimensionService = new DimensionService(); + String dimensionId = dimensionService.createDimension(dimensionName, parentId, showTypeI.intValue(), isExamine, memo, createUser, "", isEnabled); + + ro = ResponseObject.newOkResponse("创建成功").put("dimensionId", dimensionId); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFile.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFile.java new file mode 100644 index 00000000..48620d52 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFile.java @@ -0,0 +1,60 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.dc.DCUtil; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class CreateFile implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'cardId', required: true, desc: '知识ID'", "name: 'dc', required: true, desc: 'DCContext对象'", "name: 'extParams',required:false,desc:'扩展信息,JSON字符串'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String cardId = (String) params.get("cardId"); + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + + DCContext dcContext = (DCContext) params.get("dc"); + + String fileVersion = KMSUtil.getNextFileVersion(cardId, dcContext.getFileName()); + DCContext newDCContext = new DCContext(UserContext.fromSessionId(sid), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, dcContext.getFileName()); + boolean result = DCUtil.copyDCFile(dcContext, newDCContext); + if (result) { + ro = ResponseObject.newOkResponse("创建成功").put("fileId", (String) newDCContext.getDCMessage().getAttrs().get("fileId")); + } else { + ro = ResponseObject.newErrResponse("创建失败,复制DC失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFileByInputStream.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFileByInputStream.java new file mode 100644 index 00000000..5fcb37d5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFileByInputStream.java @@ -0,0 +1,72 @@ +package com.actionsoft.apps.kms.aslp; + +import java.io.InputStream; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.file.WriteDCFile; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class CreateFileByInputStream implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'cardId', required: true, desc: '知识ID'", "name: 'in', required: true, desc: 'inputstream对象'", "name: 'fileName', required: true, desc: '文件名称'", "name: 'extParams',required:false,desc:'扩展信息,JSON字符串'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String cardId = (String) params.get("cardId"); + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + + InputStream inputStream = (InputStream) params.get("in"); + String fileName = (String) params.get("fileName"); + String fileVersion = KMSUtil.getNextFileVersion(cardId, fileName); + DCContext newDCContext = new DCContext(UserContext.fromSessionId(sid), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, fileName); + boolean result = copyDCFile(inputStream, newDCContext); + if (result) { + ro = ResponseObject.newOkResponse("创建成功").put("fileId", (String) newDCContext.getDCMessage().getAttrs().get("fileId")); + } else { + ro = ResponseObject.newErrResponse("创建失败,复制DC失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + + public boolean copyDCFile(InputStream sourceFileByte, DCContext targetContext) { + try { + return WriteDCFile.getInstance().write(sourceFileByte, targetContext); + } finally { + try { + sourceFileByte.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFormLink.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFormLink.java new file mode 100644 index 00000000..3a190f85 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateFormLink.java @@ -0,0 +1,89 @@ +package com.actionsoft.apps.kms.aslp; + +import java.sql.Timestamp; +import java.util.Map; + +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class CreateFormLink implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'cardId', required: true, desc: '知识ID'", "name: 'formJSON', required: true, desc: '表单链接所需的JSON信息,格式:{"processInstId":"xxx","taskInstId":"xxx","formName":"xxx"}'", "name: 'createUser', required: false, desc: '表单链接创建人,某些特殊场景下,sid和createUser代表的用户并不一样,如果此参数为null,则使用sid代表的用户'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String cardId = (String) params.get("cardId"); + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + + String createUser; + String createUserParam = (String) params.get("createUser"); + if (createUserParam == null) { + createUser = UserContext.fromSessionId(sid).getUID(); + } else { + createUser = createUserParam; + } + UserModel createUserModel = SDK.getORGAPI().getUser(createUser); + if (createUserModel == null || createUserModel.isClosed()) { + ro = ResponseObject.newErrResponse("创建人UID不存在或已注销"); + return ro; + } + + String formJSON = (String) params.get("formJSON"); + JSONObject formJO = JSONObject.parseObject(formJSON); + if (!formJO.containsKey("processInstId") || !formJO.containsKey("taskInstId") || !formJO.containsKey("formName")) { + ro = ResponseObject.newErrResponse("[表单链接所需的JSON信息]格式错误"); + return ro; + } + + FileModel fileModel = new FileModel(); + fileModel.setCardId(cardId); + fileModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + fileModel.setCreateUser(createUser); + fileModel.setFileName(formJSON); + fileModel.setFileSize(-1); + fileModel.setFileVer("-1"); + String fileId = UUIDGener.getObjectId(); + fileModel.setId(fileId); + fileModel.setFileState(2);//2代表表单链接 + fileModel.setIsFullsearch(2);//2代表无需全文检索 + + FileDao fileDao = new FileDao(); + int result = fileDao.insert(fileModel); + if (result == 1) { + ro = ResponseObject.newOkResponse("创建成功").put("fileId", fileId); + } else { + ro = ResponseObject.newErrResponse("创建失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateKnwl.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateKnwl.java new file mode 100644 index 00000000..be75c2e0 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/CreateKnwl.java @@ -0,0 +1,99 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Date; +import java.util.Map; + +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class CreateKnwl implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: false, desc: 'sid,如果为空,则需要传createUser参数'", "name: 'knwlName', required: true, desc: '知识名称'", "name: 'createUser', required: false, desc: '知识创建人,某些特殊场景下,sid和createUser代表的用户并不一样,如果此参数为null,则使用sid代表的用户'", "name: 'validDate', required: false, desc: '有效期:yyyy-MM-dd'", "name: 'onlineLevel', required: true, desc: '只读控制,1:在线阅读和下载 0:在线阅读'", "name: 'securityLevel', required: true, desc: '保密级别, 0: 普通 1:秘密 2:机密'", "name: 'isComment', required: true, desc: '是否可以评论'", "name: 'isRate', required: true, desc: '是否可以评分'", + "name:'cardContext',required:false,desc:'知识内容'", "name: 'externalUrl',required:false,desc:'外部知识链接,可以展示外部知识的链接'", "name: 'extParams',required:false,desc:'扩展信息,JSON字符串'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (UtilString.isNotEmpty(sid) && !SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String knwlName = (String) params.get("knwlName"); + if (UtilString.isEmpty(knwlName) || UtilString.isEmpty(knwlName.trim())) { + ro = ResponseObject.newErrResponse("知识名称不允许为空"); + return ro; + } + + Date validDate = params.get("validDate") == null ? null : UtilDate.parse(params.get("validDate").toString()); + + Integer onlineLevel = (Integer) params.get("onlineLevel"); + if (onlineLevel.intValue() != 1 && onlineLevel.intValue() != 0) { + ro = ResponseObject.newErrResponse("只读控制值不正确"); + return ro; + } + + Integer securityLevel = (Integer) params.get("securityLevel"); + if (securityLevel.intValue() != 0 && securityLevel.intValue() != 1 && securityLevel.intValue() != 2) { + ro = ResponseObject.newErrResponse("保密级别值不正确"); + return ro; + } + + Boolean isComment = (Boolean) params.get("isComment"); + + Boolean isRate = (Boolean) params.get("isRate"); + + String url = (String) params.get("externalUrl"); + + String extParams = (String) params.get("extParams"); + + String createUser; + String createUserParam = (String) params.get("createUser"); + if (createUserParam == null) { + if (UtilString.isEmpty(sid)) { + ro = ResponseObject.newErrResponse("sid和createUser不能都为空值"); + return ro; + } + createUser = UserContext.fromSessionId(sid).getUID(); + } else { + createUser = createUserParam; + } + UserModel createUserModel = SDK.getORGAPI().getUser(createUser); + if (createUserModel == null || createUserModel.isClosed()) { + ro = ResponseObject.newErrResponse("创建人UID不存在或已注销"); + return ro; + } + + CardService cardService = new CardService(); + String cardId = UUIDGener.getObjectId(); + String cardContext = ""; + if (params.containsKey("cardContext")) { + cardContext = (String) params.get("cardContext"); + } + boolean result = cardService.insertCard(createUser, cardId, knwlName, validDate == null ? null : new java.sql.Date(validDate.getTime()), onlineLevel, securityLevel, 0, isComment == true ? 1 : 0, isRate == true ? 1 : 0, cardContext, url, extParams); + + if (result) { + ro = ResponseObject.newOkResponse("创建成功").put("cardId", cardId); + } else { + ro = ResponseObject.newOkResponse("创建失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/FullSearch.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/FullSearch.java new file mode 100644 index 00000000..dc3c8a6a --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/FullSearch.java @@ -0,0 +1,62 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.service.SearchService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; + +/** + * @author wangshibao + */ +public class FullSearch implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'curPage', required: true, desc: '当前页码,从0开始'", "name: 'rowsPerPage', required: true, desc: '每页的条数'", "name: 'searchText', required: true, desc: '查询的关键词'", "name: 'docTypes', required: false, desc: '文档类型,JSON数组,格式:["pdf","doc","ppt","xls","txt"]'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String uid = UserContext.fromSessionId(sid).getUID(); + UserModel userModel = SDK.getORGAPI().getUser(uid); + if (userModel == null || userModel.isClosed()) { + ro = ResponseObject.newErrResponse("查询者UID不存在或已注销"); + return ro; + } + + Integer curPage = Integer.valueOf(params.get("curPage").toString()); + + Integer rowsPerPage = Integer.valueOf(params.get("rowsPerPage").toString()); + + String searchText = (String) params.get("searchText"); + + String docTypes = (String) params.get("docTypes"); + List docTypeList = new ArrayList<>(); + if (docTypes != null) { + docTypeList = JSONArray.parseArray(docTypes, String.class); + } + String result = new SearchService().fullSearchWrap(UserContext.fromSessionId(sid), curPage, rowsPerPage, searchText, docTypeList, "1"); + ResponseObject resultRO = ResponseObject.parse(result); + if (resultRO.isOk()) { + ro = resultRO.msg("查询成功"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetDimension.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetDimension.java new file mode 100644 index 00000000..eec0ec41 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetDimension.java @@ -0,0 +1,61 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class GetDimension implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'dimensionId', required: true, desc: '维度ID'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String dimensionId = (String) params.get("dimensionId"); + + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + ro = ResponseObject.newErrResponse("维度不存在"); + return ro; + } + + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("dimensionName", dimensionModel.getDimensionName()); + dimensionJO.put("showType", dimensionModel.getShowType()); + dimensionJO.put("isExamine", dimensionModel.getIsExamine() == 1 ? true : false); + dimensionJO.put("memo", dimensionModel.getMemo()); + dimensionJO.put("createUsername", UserCache.getModel(dimensionModel.getCreateUser()) == null ? dimensionModel.getCreateUser() : UserCache.getModel(dimensionModel.getCreateUser()).getUserName()); + dimensionJO.put("createTime", UtilDate.datetimeFormat(dimensionModel.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + dimensionJO.put("isEnabled", dimensionModel.getIsEnabled() == 1 ? true : false); + dimensionJO.put("hotspotDefId", dimensionModel.getHotspotDefId()); + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + + ro = ResponseObject.newOkResponse("查询成功").put("dimension", dimensionJO); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetFile.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetFile.java new file mode 100644 index 00000000..7e435b9d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetFile.java @@ -0,0 +1,77 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class GetFile implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'fileId', required: true, desc: '文件ID'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String fileId = (String) params.get("fileId"); + + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel == null) { + ro = ResponseObject.newErrResponse("文件不存在"); + return ro; + } + + JSONObject fileJO = new JSONObject(); + fileJO.put("fileId", fileModel.getId()); + fileJO.put("cardId", fileModel.getCardId()); + fileJO.put("fileName", fileModel.getFileName()); + fileJO.put("fileVer", fileModel.getFileVer()); + fileJO.put("fileSize", fileModel.getFileSize()); + fileJO.put("fileState", fileModel.getFileState()); + fileJO.put("createTime", UtilDate.datetimeFormat24(fileModel.getCreateTime())); + fileJO.put("createUser", fileModel.getCreateUser()); + String knwlId=fileModel.getCardId(); + fileJO.put("isFullsearch", fileModel.getIsFullsearch()); + String fileName = fileModel.getFileName(); + CardCache cardCache = CardCache.getCache(); + CardModel cardModel = cardCache.get(fileModel.getCardId()); + DCContext dcContext = new DCContext(UserContext.fromSessionId(sid), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), knwlId, KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + dcContext.setFileNameShow(fileName); + fileJO.put("fileDownloadURL", dcContext.getDownloadURL()); + fileJO.put("repositoryName", KMSConstant.DOC_REPOSITORY_NAME); + fileJO.put("groupValue", cardModel.getCreateUser()); + fileJO.put("fileValue", knwlId); + fileJO.put("fileName", KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + fileJO.put("extParams", "{}"); + ro = ResponseObject.newOkResponse("查询成功").put("file", fileJO); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetKnwl.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetKnwl.java new file mode 100644 index 00000000..aa0c07fc --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/GetKnwl.java @@ -0,0 +1,68 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class GetKnwl implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'knwlId', required: true, desc: '知识ID'", "name: 'isPage', required: false, desc: '是否是独立页面(非侧边栏打开)'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String knwlId = (String) params.get("knwlId"); + + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + boolean isPage = false; + if (params.containsKey("isPage")) { + isPage = Boolean.valueOf(params.get("isPage").toString()); + } + + JSONObject cardJO = new JSONObject(); + cardJO.put("knwlId", cardModel.getId()); + cardJO.put("knwlName", cardModel.getCardName()); + cardJO.put("createUser", cardModel.getCreateUser()); + cardJO.put("createTime", UtilDate.datetimeFormat24(cardModel.getCreateTime())); + cardJO.put("lastUpdate", UtilDate.datetimeFormat24(cardModel.getLastUpdate())); + cardJO.put("onlineLevel", cardModel.getOnlineLevel()); + cardJO.put("securityLevel", cardModel.getSecurityLevel()); + cardJO.put("readCount", cardModel.getReadCount()); + cardJO.put("isPublished", cardModel.getIsPublished() == 1 ? true : false); + cardJO.put("validDate", UtilDate.dateFormat(cardModel.getValidDate())); + cardJO.put("isComment", cardModel.getIsComment() == 1 ? true : false); + cardJO.put("isRate", cardModel.getIsRate() == 1 ? true : false); + cardJO.put("accessURL", "./w?sid=" + sid + "&cmd=com.actionsoft.apps.kms_knwl_center_browse_card_page&cardId=" + knwlId + "&isPage=" + isPage); + cardJO.put("externalUrl", cardModel.getExternalUrl()); + cardJO.put("extParams", cardModel.getExtParams()); + ro = ResponseObject.newOkResponse("查询成功").put("knwl", cardJO); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/PublishKnwl.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/PublishKnwl.java new file mode 100644 index 00000000..43ff7337 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/PublishKnwl.java @@ -0,0 +1,90 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class PublishKnwl implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'knwlIDArray', required: true, desc: '要发布的知识ID的JSON数组字符串'", "name: 'dimensionIDArray', required: true, desc: '要发布到的维度ID的JSON数组字符串'", + "name: 'schemaMetaDataObject', required: false, desc: '元数据,格式:{"2":[{"metaValue":"类型为文本框的值","schemaId":"元数据ID"}],"01":[{"attrId":"属性ID","schemaId":"元数据ID"}]}'", "name: 'tagArray', required: false, desc: '标签的JSON数组字符串'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + String uid = UserContext.fromSessionId(sid).getUID(); + UserModel userModel = SDK.getORGAPI().getUser(uid); + if (userModel == null || userModel.isClosed()) { + ro = ResponseObject.newErrResponse("查询者UID不存在或已注销"); + return ro; + } + + JSONArray publishKnwlIDArray = JSONArray.parseArray(params.get("knwlIDArray").toString()); + for (int i = 0; i < publishKnwlIDArray.size(); i++) { + String knwlId = publishKnwlIDArray.getString(i); + if (CardCache.getCache().get(knwlId) == null) { + ro = ResponseObject.newErrResponse("知识不存在:" + knwlId); + return ro; + } + } + + JSONArray publishDimensionIDArray = JSONArray.parseArray(params.get("dimensionIDArray").toString()); + for (int i = 0; i < publishDimensionIDArray.size(); i++) { + String dimensionId = publishDimensionIDArray.getString(i); + if (DimensionCache.getCache().get(dimensionId) == null) { + ro = ResponseObject.newErrResponse("维度不存在:" + dimensionId); + return ro; + } + } + + JSONObject schemaMetaDataJO = null; + if (params.get("schemaMetaDataObject") == null) { + schemaMetaDataJO = new JSONObject(); + schemaMetaDataJO.put("01", new JSONArray()); + schemaMetaDataJO.put("2", new JSONArray()); + } else { + schemaMetaDataJO = JSONObject.parseObject(params.get("schemaMetaDataObject").toString()); + } + + JSONArray tagArray = new JSONArray(); + if (params.get("tagArray") != null) { + tagArray = JSONArray.parseArray(params.get("tagArray").toString()); + } + String join = ""; + if (tagArray != null) { + join = StringUtils.join(tagArray.toArray(new String[0]), KMSConstant.TAG_SEPRATOR); + } + CardService cardService = new CardService(); + cardService.publishCard(UserContext.fromSessionId(sid), publishKnwlIDArray, publishDimensionIDArray, schemaMetaDataJO, join, null); + ro = ResponseObject.newOkResponse("发布成功"); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchDimensionList.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchDimensionList.java new file mode 100644 index 00000000..7d64a3c0 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchDimensionList.java @@ -0,0 +1,107 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class SearchDimensionList implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'parentId', required: true, desc: '父维度ID'", "name: 'permType', required: false, desc: '维度的权限类型,值:manage、access,分别代表管理权限、访问权限,默认是管理权限'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String parentId = (String) params.get("parentId"); + if (!UtilString.isEmpty(parentId)) { + DimensionModel dimensionModel = DimensionCache.getCache().get(parentId); + if (dimensionModel == null) { + ro = ResponseObject.newErrResponse("父维度Id不存在"); + return ro; + } + } + String permType = "manage"; + if (params.containsKey("permType")) { + permType = (String) params.get("permType"); + } + if (!permType.equals("manage") && !permType.equals("access") && !permType.equals("all") && !permType.equals("allenable")) { + ro = ResponseObject.newErrResponse("权限类型错误"); + return ro; + } + if ("root".equals(parentId)) { + parentId = ""; + } + JSONArray dimensionJA = new JSONArray(); + DimensionService dimensionService = new DimensionService(); + List dimensionModels = new ArrayList<>(); + if (permType.equals("manage")) { + dimensionModels = dimensionService.queryListMgrDimensionsByParentId(parentId, UserContext.fromSessionId(sid).getUID()); + } else if (permType.equals("access")) { + String uid = UserContext.fromSessionId(sid).getUID(); + dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(parentId, uid, KMSUtil.isKnwlManager(uid)); + } else if (permType.equals("all")) { + dimensionModels = dimensionService.queryListMgrDimensionsByParentId(parentId); + } else if (permType.equals("allenable")) { + dimensionModels = dimensionService.queryTreeEnabledDimensionsByParentId(parentId); + } + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("dimensionName", dimensionModel.getDimensionName()); + dimensionJO.put("showType", dimensionModel.getShowType()); + dimensionJO.put("isExamine", dimensionModel.getIsExamine() == 1 ? true : false); + dimensionJO.put("memo", dimensionModel.getMemo()); + dimensionJO.put("createUsername", UserCache.getModel(dimensionModel.getCreateUser()) == null ? dimensionModel.getCreateUser() : UserCache.getModel(dimensionModel.getCreateUser()).getUserName()); + dimensionJO.put("createTime", UtilDate.datetimeFormat(dimensionModel.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + dimensionJO.put("isEnabled", dimensionModel.getIsEnabled() == 1 ? true : false); + dimensionJO.put("hotspotDefId", dimensionModel.getHotspotDefId()); + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + + dimensionJA.add(dimensionJO); + } + } + ro = ResponseObject.newOkResponse("查询成功").put("list", dimensionJA); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + + public boolean hasRepeatDimension(JSONArray dimensions, DimensionModel dimensionModel) { + for (int i = 0; i < dimensions.size(); i++) { + JSONObject dimensionJO = dimensions.getJSONObject(i); + if (dimensionModel.getId().equals(dimensionJO.getString("id"))) { + return true; + } + } + return false; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchFileList.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchFileList.java new file mode 100644 index 00000000..a42165e5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchFileList.java @@ -0,0 +1,92 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.service.FileService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class SearchFileList implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'knwlId', required: true, desc: '知识ID'", "name: 'isLatestVersion', required: false, desc: '是否只返回最新版的文件,默认false'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String uid = UserContext.fromSessionId(sid).getUID(); + UserModel userModel = SDK.getORGAPI().getUser(uid); + if (userModel == null || userModel.isClosed()) { + ro = ResponseObject.newErrResponse("查询者UID不存在或已注销"); + return ro; + } + + String knwlId = (String) params.get("knwlId"); + if (CardCache.getCache().get(knwlId) == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + + Boolean isLatestVersion = (Boolean) params.get("isLatestVersion"); + List fileModels = new ArrayList<>(); + if (isLatestVersion != null && isLatestVersion == true) { + fileModels = new FileService().queryLatestFiles(knwlId); + } else { + fileModels = new FileService().queryFiles(knwlId); + } + JSONArray dataJson = new JSONArray(); + CardCache cardCache = CardCache.getCache(); + for (FileModel fileModel : fileModels) { + JSONObject fileJO = new JSONObject(); + + String fileName = fileModel.getFileName(); + CardModel cardModel = cardCache.get(fileModel.getCardId()); + DCContext dcContext = new DCContext(UserContext.fromSessionId(sid), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), knwlId, KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + dcContext.setFileNameShow(fileName); + + fileJO.put("fileDownloadURL", dcContext.getDownloadURL()); + fileJO.put("id", fileModel.getId()); + fileJO.put("fileName", fileName); + fileJO.put("versionFileName", KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + fileJO.put("fileVer", fileModel.getFileVer()); + fileJO.put("fileSize", fileModel.getFileSize()); + fileJO.put("createTime", UtilDate.datetimeFormat(fileModel.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + fileJO.put("createUser", fileModel.getCreateUser()); + fileJO.put("fileState", fileModel.getFileState()); + fileJO.put("extParams", "{}"); + dataJson.add(fileJO); + } + ro = ResponseObject.newOkResponse("查询成功").put("searchResult", dataJson); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchKnwlList.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchKnwlList.java new file mode 100644 index 00000000..d096a2e8 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/SearchKnwlList.java @@ -0,0 +1,135 @@ +package com.actionsoft.apps.kms.aslp; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.kms.service.SearchService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + */ +public class SearchKnwlList implements ASLP { + + // 元数据,格式:Html.encodeForHTML("{\"2\":[{\"metaValue\":\"类型为文本框的值\",\"schemaId\":\"元数据ID\"}],\"01\":[{\"attrId\":\"属性ID\",\"schemaId\":\"元数据ID\"}]}"); + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'curPage', required: true, desc: '当前页码'", "name: 'rowsPerPage', required: true, desc: '每页的条数'", "name: 'sortIndx', required: true, desc: '排序字段,READCOUNT : 阅读次数、CARDNAME : 知识名称、PUBLISHTIME : 发布时间、COMMENTCOUNT : 评论次数'", "name: 'sortDir', required: true, desc: '顺序,up : 升序,down : 降序'", "name: 'dimensionIdArray', required: false, desc: '维度ID的JSON数组字符串'", + "name: 'schemaMetaDataObject', required: false, desc: '元数据,格式:{"2":[{"metaValue":"类型为文本框的值","schemaId":"元数据ID"}],"01":[{"attrId":"属性ID","schemaId":"元数据ID"}]}'", "name: 'knwlName', required: false, desc: '知识名称'", + "name: 'publishStartDate', required: false, desc: '发布开始时间 : yyyy-MM-dd'", "name: 'publishEndDate', required: false, desc: '发布结束时间 : yyyy-MM-dd'", "name: 'publishUsers', required: false, desc: '发布人UID的JSON数组字符串'", "name: 'tag', required: false, desc: '标签'", "name: 'lastPublishId', required: false, desc: '上一页最后一个publishId,用于增强查询性能'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String uid = UserContext.fromSessionId(sid).getUID(); + UserModel userModel = SDK.getORGAPI().getUser(uid); + if (userModel == null || userModel.isClosed()) { + ro = ResponseObject.newErrResponse("查询者UID不存在或已注销"); + return ro; + } + + Integer curPage = Integer.valueOf(params.get("curPage").toString()); + + Integer rowsPerPage = Integer.valueOf(params.get("rowsPerPage").toString()); + + String sortIndx = (String) params.get("sortIndx"); + if (!sortIndx.equals("READCOUNT") && !sortIndx.equals("CARDNAME") && !sortIndx.equals("PUBLISHTIME") && !sortIndx.equals("COMMENTCOUNT")) { + ro = ResponseObject.newErrResponse("排序字段值不正确"); + return ro; + } + + String sortDir = (String) params.get("sortDir"); + if (!sortDir.equals("up") && !sortDir.equals("down")) { + ro = ResponseObject.newErrResponse("顺序值不正确"); + return ro; + } + + List dimensionIdList = params.get("dimensionIdArray") == null ? new ArrayList() : JSONArray.parseArray(params.get("dimensionIdArray").toString(), String.class); + + JSONObject schemaMetaDataJO = null; + if (params.get("schemaMetaDataObject") == null) { + schemaMetaDataJO = new JSONObject(); + schemaMetaDataJO.put("01", new JSONArray()); + schemaMetaDataJO.put("2", new JSONArray()); + } else { + schemaMetaDataJO = JSONObject.parseObject(params.get("schemaMetaDataObject").toString()); + } + + String cardName = (String) params.get("knwlName"); + + Timestamp publishStartDate = params.get("publishStartDate") == null ? null : UtilDate.parseTsFromDate(params.get("publishStartDate").toString()); + + Timestamp publishEndDate = params.get("publishEndDate") == null ? null : UtilDate.parseTsFromDate(params.get("publishEndDate").toString()); + + List publishUsers = params.get("publishUsers") == null ? new ArrayList() : JSONArray.parseArray(params.get("publishUsers").toString(), String.class); + + List tagList = new ArrayList<>(); + if (params.get("tag") != null) { + tagList.add(params.get("tag").toString()); + } + String lastPublishId = params.get("lastPublishId") == null ? "" : params.get("lastPublishId").toString(); + DimensionService dimensionService = new DimensionService(); + SearchService searchService = new SearchService(); + List publishModels = searchService.attrSearchCard(curPage, rowsPerPage, sortIndx, sortDir, uid, dimensionIdList, schemaMetaDataJO, cardName, publishStartDate, publishEndDate, publishUsers, tagList, lastPublishId, "",""); + JSONObject dataJson = new JSONObject(); + if (publishModels.size() < rowsPerPage + 1L) { + dataJson.put("totalRecords", (curPage - 1) * rowsPerPage + publishModels.size()); + } else { + dataJson.put("totalRecords", searchService.totalRecords); + if (publishModels.size() > 0) { + publishModels.remove(publishModels.size() - 1);//移除最后一条 + } + } + JSONArray cardJA = new JSONArray(); + for (PublishModel publishModel : publishModels) { + JSONObject cardJO = new JSONObject(); + cardJO.put("cardId", publishModel.getCardModel().getId()); + cardJO.put("cardName", publishModel.getCardModel().getCardName()); + cardJO.put("cardType", publishModel.getCardModel().getCardType()); + cardJO.put("onlineLevel", publishModel.getCardModel().getOnlineLevel()); + cardJO.put("securityLevel", publishModel.getCardModel().getSecurityLevel()); + // cardJO.put("lastUpdate", publishModel.getCardModel().getLastUpdate()); + cardJO.put("readCount", publishModel.getCardModel().getReadCount()); + cardJO.put("commentCount", publishModel.getCardModel().getCommentCount()); + cardJO.put("isPublished", publishModel.getCardModel().getIsPublished()); + cardJO.put("validDate", UtilDate.dateFormat(publishModel.getCardModel().getValidDate())); + UserModel publishUserModel = UserCache.getModel(publishModel.getPublishUser()); + cardJO.put("publishUsername", publishUserModel == null ? publishModel.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm:ss")); + cardJO.put("dimensionId", publishModel.getDimensionId()); + cardJO.put("dimensionPath", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + cardJO.put("externalUrl", "https://www.awspaas.com"); + cardJO.put("extParams", "{}"); + cardJA.add(cardJO); + } + + dataJson.put("data", cardJA); + dataJson.put("curPage", curPage); + + ro = ResponseObject.newOkResponse("查询成功").put("searchResult", dataJson); + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateDimension.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateDimension.java new file mode 100644 index 00000000..4079bce5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateDimension.java @@ -0,0 +1,101 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class UpdateDimension implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'dimensionId', required: true, desc: '维度ID'", "name: 'dimensionName', required: false, desc: '维度名称'", "name: 'parentId', required: false, desc: '父维度Id:\"\"表示根维度'", "name: 'showType', required: false, desc: '维度类型,1:允许发布知识 2:不允许发布知识'", "name: 'isExamine', required: false, desc: '发布是否需要审批,默认false'", "name: 'memo', required: false, desc: '维度描述'", "name: 'isEnabled', required: false, desc: '是否启用,默认启用'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String dimensionId = (String) params.get("dimensionId"); + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionId == null || dimensionModel == null) { + ro = ResponseObject.newErrResponse("维度不存在"); + return ro; + } + + String dimensionName = (String) params.get("dimensionName"); + if (dimensionName == null) { + dimensionName = dimensionModel.getDimensionName(); + } else if (dimensionName.trim().equals("")) { + ro = ResponseObject.newErrResponse("维度名称不允许为空"); + return ro; + } + + String parentId = (String) params.get("parentId"); + if (parentId == null) { + parentId = dimensionModel.getParentId(); + } else if (parentId.equals("")) { + + } else { + DimensionModel parentDimensionModel = DimensionCache.getCache().get(parentId); + if (parentDimensionModel == null) { + ro = ResponseObject.newErrResponse("父维度不存在"); + return ro; + } + } + + Integer showTypeI = params.get("showType") == null ? null : Integer.valueOf(params.get("showType").toString()); + if (showTypeI == null) { + showTypeI = dimensionModel.getShowType(); + } else { + int showType = showTypeI.intValue(); + if (showType != KMSConstant.SHOWTYPE_CATEGORY && showType != KMSConstant.SHOWTYPE_DIMENSION) { + ro = ResponseObject.newErrResponse("维度类型不正确"); + return ro; + } + } + + Boolean isExamine = params.get("isExamine") == null ? null : Boolean.valueOf(params.get("isExamine").toString()); + if (isExamine == null) { + isExamine = dimensionModel.getIsExamine() == KMSConstant.EXAMINE; + } + + String memo = (String) params.get("memo"); + if (memo == null) { + memo = dimensionModel.getMemo(); + } + + Boolean isEnabled = params.get("isEnabled") == null ? null : Boolean.valueOf(params.get("isEnabled").toString()); + if (isEnabled == null) { + isEnabled = dimensionModel.getIsEnabled() == KMSConstant.ENABLED; + } + + DimensionService dimensionService = new DimensionService(); + int result = dimensionService.updateDimension(dimensionId, dimensionName, showTypeI, isExamine, memo, "", isEnabled); + + if (result == 1) { + ro = ResponseObject.newOkResponse("修改成功"); + } else { + ro = ResponseObject.newErrResponse("修改失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateKnwl.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateKnwl.java new file mode 100644 index 00000000..2d3cc13c --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/aslp/UpdateKnwl.java @@ -0,0 +1,95 @@ +package com.actionsoft.apps.kms.aslp; + +import java.util.Date; +import java.util.Map; + +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.apps.resource.interop.aslp.Meta; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; + +/** + * @author wangshibao + */ +public class UpdateKnwl implements ASLP { + + @Override + @Meta(parameter = { "name: 'sid', required: true, desc: 'sid'", "name: 'knwlId', required: true, desc: '知识ID'", "name: 'knwlName', required: false, desc: '知识名称'", "name: 'validDate', required: false, desc: '有效期:yyyy-MM-dd,如果为null则表示长期有效'", "name: 'onlineLevel', required: false, desc: '只读控制,1:在线阅读和下载 0:在线阅读'", "name: 'securityLevel', required: false, desc: '保密级别, 0: 普通 1:秘密 2:机密'", "name: 'isComment', required: false, desc: '是否可以评论'", "name: 'isRate', required: false, desc: '是否可以评分'", "name:'cardContext',required:false,desc:'知识内容'", + "name: 'externalUrl',required:false,desc:'外部知识链接,可以展示外部知识的链接'", "name: 'extParams',required:false,desc:'扩展信息,JSON字符串'" }) + public ResponseObject call(Map params) { + ResponseObject ro = ResponseObject.newWarnResponse("结果未知"); + try { + // 校验参数 + String sid = (String) params.get("sid"); + if (!SDK.getPortalAPI().checkSession(sid)) { + ro = ResponseObject.newErrResponse("sid无效"); + return ro; + } + + String knwlId = (String) params.get("knwlId"); + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel == null) { + ro = ResponseObject.newErrResponse("知识不存在"); + return ro; + } + + String knwlName = (String) params.get("knwlName"); + if (knwlName == null) { + knwlName = cardModel.getCardName(); + } + + Date validDate = params.get("validDate") == null ? null : UtilDate.parse(params.get("validDate").toString()); + + Integer onlineLevel = params.get("onlineLevel") == null ? cardModel.getOnlineLevel() : Integer.parseInt(params.get("onlineLevel").toString()); + if (params.get("onlineLevel") != null) { + if (onlineLevel.intValue() != 1 && onlineLevel.intValue() != 0) { + ro = ResponseObject.newErrResponse("只读控制值不正确"); + return ro; + } + } + + Integer securityLevel = params.get("securityLevel") == null ? cardModel.getSecurityLevel() : Integer.parseInt(params.get("securityLevel").toString()); + if (params.get("securityLevel") != null) { + if (securityLevel.intValue() != 0 && securityLevel.intValue() != 1 && securityLevel.intValue() != 2) { + ro = ResponseObject.newErrResponse("保密级别值不正确"); + return ro; + } + } + + Boolean isComment = params.get("isComment") == null ? (cardModel.getIsComment() == 1 ? true : false) : Boolean.parseBoolean(params.get("isComment").toString()); + + Boolean isRate = params.get("isRate") == null ? (cardModel.getIsRate() == 1 ? true : false) : Boolean.parseBoolean(params.get("isRate").toString()); + + String createUser = UserContext.fromSessionId(sid).getUID(); + UserModel createUserModel = SDK.getORGAPI().getUser(createUser); + if (createUserModel == null || createUserModel.isClosed()) { + ro = ResponseObject.newErrResponse("创建人UID不存在或已注销"); + return ro; + } + String cardContext = (String) params.get("cardContext"); + if (cardContext == null) { + cardContext = ""; + } + CardService cardService = new CardService(); + boolean result = cardService.updateCard(createUser, knwlId, knwlName, validDate == null ? null : new java.sql.Date(validDate.getTime()), onlineLevel, securityLevel, 0, isComment == true ? 1 : 0, isRate == true ? 1 : 0, cardContext); + + if (result) { + ro = ResponseObject.newOkResponse("修改成功"); + } else { + ro = ResponseObject.newOkResponse("创建失败"); + } + } catch (Exception e) { + e.printStackTrace(); + ro = ResponseObject.newErrResponse(e.getMessage()); + } + return ro; + + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardCache.java new file mode 100644 index 00000000..82cefe92 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardCache.java @@ -0,0 +1,37 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 知识缓存 + * + * @author wangshibao + */ +public class CardCache extends Cache { + + public CardCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + CardDao cardDao = new CardDao(); + IDaoQuery iDaoQuery = cardDao.query(); + List cardModels = iDaoQuery.list(); + for (CardModel cardModel : cardModels) { + put(cardModel.getId(), cardModel, false); + } + } + + public static CardCache getCache() { + return CacheManager.getCache(CardCache.class); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardPermCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardPermCache.java new file mode 100644 index 00000000..31c191c6 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/CardPermCache.java @@ -0,0 +1,58 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.HashMap; + +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; + +/** + * 知识缓存 + * + * @author wangshibao + */ +public class CardPermCache extends Cache> { + + public CardPermCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + + } + + public static CardPermCache getCache() { + return CacheManager.getCache(CardPermCache.class); + } + + public static void put(String cardId, String uid, boolean isPerm) { + HashMap uidMap = getCache().get(cardId); + if (uidMap != null) { + if (!uidMap.containsKey(uid)) { + uidMap.put(uid, isPerm); + getCache().put(cardId, uidMap); + } + } else { + uidMap = new HashMap(); + uidMap.put(uid, isPerm); + getCache().put(cardId, uidMap); + } + } + + public static boolean getPermByUID(String cardId, String uid) { + HashMap uidMap = getCache().get(cardId); + if (uidMap == null) { + return false; + } + return uidMap.get(uid); + } + + public static boolean hasCacheByUID(String cardId, String uid) { + HashMap uidMap = getCache().get(cardId); + if (uidMap == null) { + return false; + } + return uidMap.containsKey(uid); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionCache.java new file mode 100644 index 00000000..e2f75c68 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionCache.java @@ -0,0 +1,51 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.DimensionDao; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.cache.ListValueIndex; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 维度缓存 + * + * @author wangshibao + */ +public class DimensionCache extends Cache { + + public DimensionCache(CachePluginProfile configuration) { + super(configuration); + registeIndex(DimensionParentIndex.class, new DimensionParentIndex()); + } + + public List getDimensionListOfParent(String parentDimensionId) { + List list = iteratorToList(getCache().getByIndex(DimensionParentIndex.class, parentDimensionId)); + return list; + } + + @Override + protected void load() { + DimensionDao dimensionDao = new DimensionDao(); + IDaoQuery iDaoQuery = dimensionDao.query(); + List dimensionModels = iDaoQuery.list(); + for (DimensionModel dimensionModel : dimensionModels) { + put(dimensionModel.getId(), dimensionModel, false); + } + } + + public static DimensionCache getCache() { + return CacheManager.getCache(DimensionCache.class); + } + + class DimensionParentIndex extends ListValueIndex { + + @Override + public String key(DimensionModel t) { + return t.getParentId(); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionPermCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionPermCache.java new file mode 100644 index 00000000..4c96e3df --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionPermCache.java @@ -0,0 +1,58 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.HashMap; + +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; + +/** + * 维度缓存 + * + * @author wangshibao + */ +public class DimensionPermCache extends Cache> { + + public DimensionPermCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + + } + + public static DimensionPermCache getCache() { + return CacheManager.getCache(DimensionPermCache.class); + } + + public static void put(String dimensionId, String uid, boolean isPerm) { + HashMap uidMap = getCache().get(dimensionId); + if (uidMap != null) { + if (!uidMap.containsKey(uid)) { + uidMap.put(uid, isPerm); + getCache().put(dimensionId, uidMap); + } + } else { + uidMap = new HashMap(); + uidMap.put(uid, isPerm); + getCache().put(dimensionId, uidMap); + } + } + + public static boolean getPermByUID(String dimensionId, String uid) { + HashMap uidMap = getCache().get(dimensionId); + if (uidMap == null) { + return false; + } + return uidMap.get(uid); + } + + public static boolean hasCacheByUID(String dimensionId, String uid) { + HashMap uidMap = getCache().get(dimensionId); + if (uidMap == null) { + return false; + } + return uidMap.containsKey(uid); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionTreeCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionTreeCache.java new file mode 100644 index 00000000..8e9e7a6c --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/DimensionTreeCache.java @@ -0,0 +1,27 @@ +package com.actionsoft.apps.kms.cache; + +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.alibaba.fastjson.JSONArray; + +/** + * 知识缓存 + * + * @author wangshibao + */ +public class DimensionTreeCache extends Cache { + + public DimensionTreeCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + + } + + public static DimensionTreeCache getCache() { + return CacheManager.getCache(DimensionTreeCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/FileCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/FileCache.java new file mode 100644 index 00000000..ab8f8ae9 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/FileCache.java @@ -0,0 +1,36 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 文件缓存 + * + * @author wangshibao + * + */ +public class FileCache extends Cache { + public FileCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + FileDao fileDao = new FileDao(); + IDaoQuery iDaoQuery = fileDao.query(); + List fileModels = iDaoQuery.list(); + for (FileModel fileModel : fileModels) { + put(fileModel.getId(), fileModel, false); + } + } + + public static FileCache getCache() { + return CacheManager.getCache(FileCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/HotspotCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/HotspotCache.java new file mode 100644 index 00000000..e6e63135 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/HotspotCache.java @@ -0,0 +1,37 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.HotspotDao; +import com.actionsoft.apps.kms.model.HotspotModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 知识地图缓存(图形和维度的绑定缓存) + * + * @author wangshibao + * + */ +public class HotspotCache extends Cache { + public HotspotCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + HotspotDao hotspotDao = new HotspotDao(); + IDaoQuery iDaoQuery = hotspotDao.query(); + List hotspotModels = iDaoQuery.list(); + for (HotspotModel hotspotModel : hotspotModels) { + put(hotspotModel.getId(), hotspotModel, false); + } + } + + public static HotspotCache getCache() { + return CacheManager.getCache(HotspotCache.class); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaAttrCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaAttrCache.java new file mode 100644 index 00000000..740d793a --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaAttrCache.java @@ -0,0 +1,30 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.MetaAttrDao; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +public class MetaAttrCache extends Cache { + public MetaAttrCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + MetaAttrDao metaAttrDao = new MetaAttrDao(); + IDaoQuery iDaoQuery = metaAttrDao.query(); + List metaAttrModels = iDaoQuery.list(); + for (MetaAttrModel metaAttrModel : metaAttrModels) { + put(metaAttrModel.getId(), metaAttrModel, false); + } + } + + public static MetaAttrCache getCache() { + return CacheManager.getCache(MetaAttrCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaDataCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaDataCache.java new file mode 100644 index 00000000..918c2b2a --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaDataCache.java @@ -0,0 +1,45 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.MetaDataDao; +import com.actionsoft.apps.kms.model.MetaDataModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.cache.ListValueIndex; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +public class MetaDataCache extends Cache { + public MetaDataCache(CachePluginProfile configuration) { + super(configuration); + registeIndex(metaDataCardIndex.class, new metaDataCardIndex()); + } + + @Override + protected void load() { + MetaDataDao metaDataDao = new MetaDataDao(); + IDaoQuery iDaoQuery = metaDataDao.query(); + List metaDataModels = iDaoQuery.list(); + for (MetaDataModel metaDataModel : metaDataModels) { + put(metaDataModel.getId(), metaDataModel, false); + } + } + + public static MetaDataCache getCache() { + return CacheManager.getCache(MetaDataCache.class); + } + + public List getMetaDataListOfCardId(String cardId) { + List list = iteratorToList(getCache().getByIndex(metaDataCardIndex.class, cardId)); + return list; + } + + class metaDataCardIndex extends ListValueIndex { + + @Override + public String key(MetaDataModel t) { + return t.getCardId(); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaSchemaCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaSchemaCache.java new file mode 100644 index 00000000..60f07e90 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/MetaSchemaCache.java @@ -0,0 +1,36 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.MetaSchemaDao; +import com.actionsoft.apps.kms.model.MetaSchemaModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 元数据缓存 + * + * @author wangshibao + * + */ +public class MetaSchemaCache extends Cache { + public MetaSchemaCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + MetaSchemaDao metaSchemaDao = new MetaSchemaDao(); + IDaoQuery iDaoQuery = metaSchemaDao.query(); + List metaschemaModels = iDaoQuery.list(); + for (MetaSchemaModel metaSchemaModel : metaschemaModels) { + put(metaSchemaModel.getId(), metaSchemaModel, false); + } + } + + public static MetaSchemaCache getCache() { + return CacheManager.getCache(MetaSchemaCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/OptCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/OptCache.java new file mode 100644 index 00000000..f336b33c --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/OptCache.java @@ -0,0 +1,37 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.OptDao; +import com.actionsoft.apps.kms.model.OptModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +/** + * 操作缓存(评论、评分、反馈) + * + * @author wangshibao + * + */ +public class OptCache extends Cache { + + public OptCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + OptDao optDao = new OptDao(); + IDaoQuery iDaoQuery = optDao.query(); + List optModels = iDaoQuery.list(); + for (OptModel optModel : optModels) { + put(optModel.getId(), optModel, false); + } + } + + public static OptCache getCache() { + return CacheManager.getCache(OptCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/PublishCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/PublishCache.java new file mode 100644 index 00000000..2830cfa8 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/PublishCache.java @@ -0,0 +1,32 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.PublishDao; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +public class PublishCache extends Cache { + + public PublishCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + PublishDao publishDao = new PublishDao(); + IDaoQuery iDaoQuery = publishDao.query(); + List publishModels = iDaoQuery.list(); + for (PublishModel publishModel : publishModels) { + put(publishModel.getId(), publishModel, false); + } + } + + public static PublishCache getCache() { + return CacheManager.getCache(PublishCache.class); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/VersionCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/VersionCache.java new file mode 100644 index 00000000..ad094389 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/cache/VersionCache.java @@ -0,0 +1,30 @@ +package com.actionsoft.apps.kms.cache; + +import java.util.List; + +import com.actionsoft.apps.kms.dao.VersionDao; +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.apps.resource.plugin.profile.CachePluginProfile; +import com.actionsoft.bpms.commons.cache.Cache; +import com.actionsoft.bpms.commons.cache.CacheManager; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; + +public class VersionCache extends Cache { + public VersionCache(CachePluginProfile configuration) { + super(configuration); + } + + @Override + protected void load() { + VersionDao versionDao = new VersionDao(); + IDaoQuery iDaoQuery = versionDao.query(); + List versionModels = iDaoQuery.list(); + for (VersionModel versionModel : versionModels) { + put(versionModel.getId(), versionModel, false); + } + } + + public static VersionCache getCache() { + return CacheManager.getCache(VersionCache.class); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlCenterController.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlCenterController.java new file mode 100644 index 00000000..592e21de --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlCenterController.java @@ -0,0 +1,388 @@ +package com.actionsoft.apps.kms.controller; + +import java.sql.Date; + +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.web.KnwlCenterWeb; +import com.actionsoft.apps.processon.HotspotWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * 知识中心(KMS前台)控制器类 + * + * @author wangshibao 知识中心 + */ +@Controller public class KnwlCenterController { + /* 知识中心iframe框架 */ + @Mapping("com.actionsoft.apps.kms_knwl") + public String getKnwlHome(UserContext uc, String page) { + PublishCache.getCache().reload(); + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getKnwlHome(page); + } + + /* 知识中心主页面 */ + @Mapping("com.actionsoft.apps.kms_knwl_center") + public String getKnwlCenterHome(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getKnwlCenterHome(); + } + + /* 知识中心主页面 */ + @Mapping("com.actionsoft.apps.kms_knwl_mobile_center_knowladge_count") + public String getMobileKnwlCenterCount(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getKnowladgeCount(); + } + + /* 知识中心-个人-我的知识-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_me_card_list_json") + public String getMeCardListJson(UserContext uc, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getMeCardListJson(curPage, rowsPerPage, sortIndx, sortDir, filter); + } + + /* 知识中心-个人-我发布的-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_publish_card_list_json") + public String getPublishCardListJson(UserContext uc, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getPublishListJson(curPage, rowsPerPage, sortIndx, sortDir, filter); + } + + /* 知识中心-个人-我借阅的-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_borrow_card_list_json") + public String getBorrowCardListJson(UserContext uc, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getBorrowListJson(curPage, rowsPerPage, sortIndx, sortDir, filter); + } + + /* 知识中心-个人-发布待审-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_publish_examine_card_list_json") + public String getPublishExamineCardListJson(UserContext uc, int curPage, int rowsPerPage) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getPublishExamineListJson(curPage, rowsPerPage); + } + + /* 知识中心-全部-获取维度树json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_dimension_tree_json") + public String getDimensionTreeJson(UserContext uc, String parentId, boolean isDimensionKnwlPage) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getDimensionTreeJson(parentId, isDimensionKnwlPage); + } + + /* 知识中心-个人-发布知识-获取元数据以及属性json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_schema_attr_list_json") + public String getSchemaAttrJson(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getSchemaAttr(); + } + + /* 知识中心-个人-发布知识-获取维度树json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_me_publish_dimension_tree_json") + public String getMeDimensionTreeJson(UserContext uc, String parentId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getMeDimensionTreeJson(parentId); + } + + /* 知识中心-全部-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_dimension_card_list_json") + public String getDimensionCardListJson(UserContext uc, String dimensionId, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getDimensionCardListJson(dimensionId, curPage, rowsPerPage, sortIndx, sortDir, filter); + } + + /* 知识中心-全部-知识列表json(不分页) */ + @Mapping("com.actionsoft.apps.kms_knwl_center_dimension_card_list_all_json") + public String getDimensionCardListAllJson(UserContext uc, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getDimensionCardListAllJson(dimensionId); + } + + /* 知识中心-删除文件 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_file") + public String deleteFile(UserContext uc, String cardId, String fileId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.deleteFile(cardId, fileId); + } + + /* 知识中心-新建知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_insert_card") + public String insertCard(UserContext uc, String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, boolean isComment, boolean isRate, String cardContext) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.insertCard(cardId, cardName, validDate, onlineLevel, securityLevel, cardType, isComment, isRate, cardContext); + } + + /* 知识中心-编辑知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_update_card") + public String updateCard(UserContext uc, String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, boolean isComment, boolean isRate, String cardContext) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.updateCard(cardId, cardName, validDate, onlineLevel, securityLevel, cardType, isComment, isRate, cardContext); + } + + /* 知识中心-删除知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_card") + public String deleteFile(UserContext uc, String cardIds) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.deleteCards(cardIds); + } + + /* 知识中心-文件列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_file_list_json") + public String getFileListJson(UserContext uc, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getFileListJson(cardId); + } + + /* 知识中心-发布知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_publish_card") + public String publishCard(UserContext uc, String publishCardIds, String publishDimensionIds, String schemaMetaData, String tags, String publishMemo) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.publishCard(uc,publishCardIds, publishDimensionIds, schemaMetaData, tags, publishMemo); + } + + /* 知识中心-给知识评分 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_rate_card") + public String rateCard(UserContext uc, String rateId, String cardId, Integer rateLevel) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.rateCard(rateId, cardId, rateLevel); + } + + /* 知识中心-查询浏览信息 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_browse_card_info_json") + public String getBrowseCardInfo(UserContext uc, String cardId, boolean isBorrow, String boId, boolean isEdit, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getBrowseCardInfo(uc,cardId, isBorrow, boId, isEdit, dimensionId); + } + + /* 知识中心-发送邀请 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_send_browse_invitation") + public String sendBrowseInvitation(UserContext uc,String dimensionId, String cardId, String targetUsers) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.sendBrowseInvitation(dimensionId,cardId, targetUsers); + } + + /* 知识中心-打开浏览页面 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_browse_card_page") + public String openBrowseCardPage(UserContext uc,String dimensionId, String cardId, boolean isPage) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.openBrowseCardPage(dimensionId,cardId, isPage); + } + + /* 知识中心-新增评论 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_comment_insert") + public String insertComment(UserContext uc, String cardId, String commentContent) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.insertComment(cardId, commentContent); + } + + /* 知识中心-统计数据 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_stat_json") + public String statCardFile(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.statCardFile(); + } + + /* 启动借阅流程 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_borrow_card_process_start") + public String startBorrowProcwss(UserContext uc, String cardId, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.startBorrowProcessType(cardId, dimensionId); + } + + /* 启动发布流程 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_publish_card_process_start") + public String startPublishProcess(UserContext uc, String cardIds, String dimensionId, String schemaMetaData, String tags, String publishMemo) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.startPublishProcessType(cardIds, dimensionId, schemaMetaData, tags, publishMemo); + } + + /* 取消发布知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_cancel_publish_card") + public String cancelPublishCard(UserContext uc, String publishId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.cancelPublishCard(publishId); + } + + /* 打开知识地图home页 */ + @Mapping("com.actionsoft.apps.kms_hotspot_home") + public String getHotspotHome(UserContext uc, String dimensionId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.getHotspot(dimensionId); + } + + /* 查询维度的tree路径 */ + @Mapping("com.actionsoft.apps.kms_get_dimension_path_from_root") + public String getDimensionPath(UserContext uc, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getDimensionPath(dimensionId); + } + + /* 打包下载 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_package_files") + public String packageFiels(UserContext uc, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.packageFiels(cardId); + } + + /* 收藏知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_collect_card") + public String collectCard(UserContext uc, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.collectCard(cardId); + } + + /* 删除未保存的知识卡片上传的文件 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_unsaved_files") + public String deleteUnsavedFiles(UserContext uc, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.deleteUnsavedFiles(cardId); + } + + /* 反馈 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_report_card") + public String reportCard(UserContext uc, String cardId, String dimensionId, String reportContent) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.reportCard(cardId, dimensionId, reportContent); + } + + /* 预览 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_preview_file") + public String previewFile(UserContext uc, String fileId, boolean isDownload, boolean isCopy) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.previewFile(uc, fileId, isDownload, isCopy); + } + + /* 下载文件 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_download_file") + public String downloadFile(UserContext uc, String fileId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.downloadFile(uc,fileId); + } + + /* 知识中心-个人-我的知识-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_log_list") + public String getLogListJson(UserContext uc, int curPage, int rowsPerPage, String cardId, String sortIndx, String sortDir) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getLogListJson(curPage, rowsPerPage, cardId, sortIndx, sortDir); + } + + /* 知识中心-个人-我的知识-知识列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_latest_comment") + public String getLatestComment(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getLatestComment(); + } + + /* 加载工作网络树页面 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_get_network_page") + public String getNetworkPage(UserContext uc, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getNetWorkPage(cardId); + } + + /* 加载工作网络树 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_get_network_tree") + public String getNetworkTree(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getNetworkTree(); + } + + /* 分享到工作网络 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_shareto_network") + public String shareToNetwork(UserContext uc, String cardId, String teamId, String networkId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.shareToNetwork(cardId, teamId, networkId); + } + + /* 知识中心-全部-移动复制知识-获取维度树json */ + @Mapping("com.actionsoft.apps.kms_knwl_center_all_move_dimension_tree_json") + public String getMoveKnwlDimensionTreeJson(UserContext uc, String parentId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.getMoveKnwlDimensionTreeJson(parentId); + } + + /* 知识中心-全部-移动知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_move_card") + public String moveCard(UserContext uc, String cardIds, String dimensionIds, String currDimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.moveCard(cardIds, dimensionIds, currDimensionId); + } + + /* 知识中心-全部-复制知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_copy_card") + public String copyCard(UserContext uc, String cardIds, String dimensionIds, String currDimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.copyCard(cardIds, dimensionIds, currDimensionId); + } + + /* 知识中心-全部-移交知识 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_change_carduser") + public String changeCardUser(UserContext uc, String cardIds, String handoverCardUser) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.changeCardUser(cardIds, handoverCardUser); + } + /* 知识中心-发布-检查知识下是否存在文件 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_check_card_has_file") + public String checkCardHasFile(UserContext uc, String cardIds) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.checkCardHasFile(cardIds); + } + + /* 知识中心-发布-检查知识下是否存在文件 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_cancel_publish_card_process_start") + public String startCancelPublishProcess(UserContext uc, String publishId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.startCancelPublishProcess(publishId); + } + + /* 浏览器预览文件(区别于onlinedoc) */ + @Mapping("com.actionsoft.apps.kms_knwl_browser_preview") + public String browserPreview(UserContext uc, String fileId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.browserPreview(fileId); + } + + /* 浏览器预览图片 */ + @Mapping("com.actionsoft.apps.kms_knwl_browser_preview_image") + public String browserPreviewImg(UserContext uc, String fileId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.browserPreviewImg(fileId); + } + + /* 浏览器预览表单 */ + @Mapping("com.actionsoft.apps.kms_knwl_browser_preview_form") + public String browserPreviewForm(UserContext uc, String fileId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.browserPreviewForm(fileId); + } + + /* 加载公共维度知识列表html */ + @Mapping("com.actionsoft.apps.kms_dimension_grid_html") + public String dimensionGridHtml(UserContext uc) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.dimensionGridHtml(); + } + + /* 独立知识展示页面 iframe(为了和知识中心的架构保持一致) */ + @Mapping("com.actionsoft.apps.kms_dimension_grid_page_iframe") + public String dimensionGridPageIframe(UserContext uc, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.dimensionGridPageIframe(dimensionId); + } + + /* 独立知识展示页面 */ + @Mapping("com.actionsoft.apps.kms_dimension_grid_page") + public String dimensionGridPage(UserContext uc, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.dimensionGridPage(dimensionId); + } + + /* 独立知识展示页面 */ + @Mapping("com.actionsoft.apps.kms_dimension_write_log") + public String dimensionGridWriteLog(UserContext uc, String fileId, String cardId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.dimensionWriteLog(fileId, cardId); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMgrController.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMgrController.java new file mode 100644 index 00000000..49b2f8cb --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMgrController.java @@ -0,0 +1,246 @@ +package com.actionsoft.apps.kms.controller; + +import com.actionsoft.apps.kms.web.KnwlMgrWeb; +import com.actionsoft.apps.processon.HotspotWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * 知识维护(KMS后台)控制器类 + * + * @author wangshibao + */ +@Controller +public class KnwlMgrController { + /* 知识维护主页面 */ + @Mapping("com.actionsoft.apps.kms_mgr") + public String getMgrHome(UserContext uc, String page, String tab) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getMgrHome(page, tab); + } + + /* 知识维护主页面 */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr") + public String getKnwlMgrHome(UserContext uc) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getKnwlMgrHome(); + } + + /* 获取维度树json-维度维护 */ + @Mapping("com.actionsoft.apps.kms_dimension_tree_json") + public String getDimensionTreeJson(UserContext uc, String parentId) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getDimensionTreeJson(parentId); + } + + /* 获取维度树json-设置知识地图 */ + @Mapping("com.actionsoft.apps.kms_dimension_tree_bindhotspot_json") + public String getDimensionBindHotspotTreeJson(UserContext uc, String parentId) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getDimensionBindHotspotTreeJson(parentId); + } + + /* 获取维度树json-有效期维度 */ + @Mapping("com.actionsoft.apps.kms_dimension_validdate_tree_json") + public String getDimensionValiddateTreeJson(UserContext uc, String parentId) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getDimensionValiddateTreeJson(parentId); + } + + /* 获取维度树json-有效期维度-全部加载 */ + @Mapping("com.actionsoft.apps.kms_dimension_validdate_tree_all_json") + public String getDimensionValiddateTreeAllJson(UserContext uc) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getDimensionValiddateTreeAllJson(); + } + + /* 获取维度树json */ + @Mapping("com.actionsoft.apps.kms_dimension_list_json") + public String getDimensionJson(UserContext uc, String parentId) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.getDimensionListJson(parentId); + } + + /* 新建维度 */ + @Mapping("com.actionsoft.apps.kms_add_dimension") + public String addDimension(UserContext uc, String parentId, String dimensionNames, boolean showtype, boolean isPublishKnwl, boolean isExamine, String memo, String hotspotName, boolean isEnabled) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.createDimension(dimensionNames, parentId, showtype, isPublishKnwl, isExamine, memo, hotspotName, isEnabled); + } + + /* 修改维度 */ + @Mapping("com.actionsoft.apps.kms_update_dimension") + public String updateDimension(UserContext uc, String id, String dimensionName, boolean showtype, boolean isPublishKnwl, boolean isExamine, String memo, String hotspotName, boolean isEnabled) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.updateDimension(id, dimensionName, showtype, isPublishKnwl, isExamine, memo, hotspotName, isEnabled); + } + + /* 删除维度 */ + @Mapping("com.actionsoft.apps.kms_delete_dimension") + public String deleteDimension(UserContext uc, String ids) { + KnwlMgrWeb mgrWeb = new KnwlMgrWeb(uc); + return mgrWeb.deleteDimension(ids); + } + + /* 知识维护-元数据-列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_schema_list_json") + public String getSchemaListJson(UserContext uc, int curPage, int rowsPerPage, String sortIndx, String sortDir) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getSchemaListJson(curPage, rowsPerPage, sortIndx, sortDir); + } + + /* 知识维护-有效期-列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_valid_date_card_list_json") + public String getValidDateCardListJson(UserContext uc, int curPage, int rowsPerPage, String dimensionIdArr, String validDate, String sortIndx, String sortDir) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getValidDateCardListJson(curPage, rowsPerPage, dimensionIdArr, validDate, sortIndx, sortDir); + } + + /* 知识维护-元数据-属性列表json */ + @Mapping("com.actionsoft.apps.kms_meta_attr_list_json") + public String getMetaAttrListJson(UserContext uc, String schemaId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getMetaAttrListJson(schemaId); + } + + /* 知识维护-元数据-新建元数据 (包括属性) */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_add_meta_schema") + public String addMetaSchema(UserContext uc, String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.addMetaSchema(schemaTitle, schemaShowtype, isNullable, isSearch, schemaDesc, metaAttr); + } + + /* 知识维护-元数据-修改元数据 (包括属性) */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_update_meta_schema") + public String updateMetaSchema(UserContext uc, String schemaId, String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.updateMetaSchema(schemaId, schemaTitle, schemaShowtype, isNullable, isSearch, schemaDesc, metaAttr); + } + + /* 知识维护-元数据-删除元数据 (包括属性) */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_delete_meta_schema") + public String deleteMetaSchema(UserContext uc, String schemaIds) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.deleteSchema(schemaIds); + } + + /* 打开绑定维度到知识地图页面 */ + @Mapping("com.actionsoft.apps.kms_hotspot_binding") + public String getBindingHotspotHome(UserContext uc, String dimensionId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc, dimensionId); + return hotspotWeb.getBindHotspot(dimensionId); + } + + /* 绑定维度到知识地图 */ + @Mapping("com.actionsoft.apps.kms_hotspot_bind") + public String bindHotspot(UserContext uc, String dimensionId, String shapeId, String hotspotDefId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.bindHotspot(dimensionId, shapeId, hotspotDefId); + } + + /* 绑定知识到知识地图 */ + @Mapping("com.actionsoft.apps.kms_hotspot_bind_card") + public String bindHotspotCard(UserContext uc, String cardId, String shapeId, String hotspotDefId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.bindHotspotCard(cardId, shapeId, hotspotDefId); + } + + /* 绑定维度到知识地图 */ + @Mapping("com.actionsoft.apps.kms_hotspot_bind_linkurl") + public String bindHotspotLinkURL(UserContext uc, String linkurl, String target, String shapeId, String hotspotDefId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.bindHotspotLinkURL(linkurl, target, shapeId, hotspotDefId); + } + + /* 删除绑定知识地图 */ + @Mapping("com.actionsoft.apps.kms_hotspot_delete_bind") + public String deleteHotspot(UserContext uc, String hotspotId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.deleteHotspot(hotspotId); + } + + /* 删除绑定知识地图 */ + @Mapping("com.actionsoft.apps.kms_hotspot_render_hotspot_div") + public String getAsyncBindingShapeHotspot(UserContext uc, String dimensionId, String shapeId) { + HotspotWeb hotspotWeb = new HotspotWeb(uc); + return hotspotWeb.getAsyncBindingShapeHotspot(dimensionId, shapeId); + } + + /* 移动维度 */ + @Mapping("com.actionsoft.apps.kms_move_dimension") + public String moveDimension(UserContext uc, String sourceDimensionId, String targetDimensionId, String sort) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.moveDimension(sourceDimensionId, targetDimensionId, sort); + } + + /* 延期维度 */ + @Mapping("com.actionsoft.apps.kms_delay_validdate") + public String delayValiddate(UserContext uc, String cardIdArr, String validDate, String sort) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.delayValiddate(cardIdArr, validDate); + } + + /* 元数据排序 */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_meta_schema_order_index_save") + public String saveMetaSchemaOrderIndex(UserContext uc, String sourceId, String targetId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.saveMetaSchemaOrderIndex(sourceId, targetId); + } + + /* 有效期-取消发布知识(全部维度)前的检查 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_cancel_publishes_card_check") + public String cancelPublishesCardCheck(UserContext uc, String cardId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.cancelPublishesCardCheck(cardId); + } + + /* 有效期-取消发布知识(全部维度) */ + @Mapping("com.actionsoft.apps.kms_knwl_center_cancel_publishes_card") + public String cancelPublishesCard(UserContext uc, String cardId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.cancelPublishesCard(cardId); + } + + /* 有效期-取消发布知识(全部维度) */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_get_examine_user") + public String getExamineUser(UserContext uc, String dimensionId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getExamineUser(dimensionId); + } + + /* usertask-维度树页面 */ + @Mapping("com.actionsoft.apps.kms_usertask_html") + public String getKMSUsertaskHTML(UserContext uc, String formToKMSOptionDimensionIdJA) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getKMSUsertaskHTML(formToKMSOptionDimensionIdJA); + } + + /* 维度策略报告 */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_report") + public String getDimensionReport(UserContext uc, String dimensionId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.getDimensionReport(dimensionId); + } + + /* 应用当前维度的ac权限到后代 */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_dimension_ac_to_des") + public String dimensionACToDes(UserContext uc, String dimensionId, String style) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.dimensionACToDes(dimensionId, style); + } + + /* 复制维度 */ + @Mapping("com.actionsoft.apps.kms_knwl_mgr_dimension_copy") + public String copyDimension(UserContext uc, String newDimensionName, String currDimensionId) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.copyDimension(uc, newDimensionName, currDimensionId); + } + + /* 移交维度 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_change_dimensionuser") + public String changeCardUser(UserContext uc, String dimensionIds, String handoverCardUser) { + KnwlMgrWeb knwlMgrWeb = new KnwlMgrWeb(uc); + return knwlMgrWeb.changeDimensionUser(dimensionIds, handoverCardUser); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMobileController.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMobileController.java new file mode 100644 index 00000000..0814bd84 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlMobileController.java @@ -0,0 +1,60 @@ +package com.actionsoft.apps.kms.controller; + +import com.actionsoft.apps.kms.web.KnwlCenterWeb; +import com.actionsoft.apps.kms.web.KnwlMobileWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +@Controller +public class KnwlMobileController { + /* 主页面 */ + @Mapping("com.actionsoft.apps.kms_mobile_home") + public String getMobileHome(UserContext uc) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.getMobileHome(); + } + + @Mapping("com.actionsoft.apps.kms_mobile_lists") + public String getLists(UserContext uc, String sortIndx, String sortDir, String searchDimensionIds, String schemaMetaData, String cardName, String publishTime, String publishUser, String tags, String lastPublishId, String searchType,String departId) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.mobileListsData(uc, sortIndx, sortDir, searchDimensionIds, schemaMetaData, cardName, publishTime, publishUser, tags, lastPublishId, searchType,departId); + } + + /* 启动发布流程 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_publish_card_process_start_mobile") + public String startPublishProcess(UserContext uc, String cardIds, String dimensionId, String schemaMetaData, String tags, String publishMemo) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.startPublishProcess(cardIds, dimensionId, schemaMetaData, tags, publishMemo, "mobile"); + } + + /* 启动借阅流程 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_borrow_card_process_start_mobile") + public String startBorrowProcwss(UserContext uc, String cardId, String dimensionId) { + KnwlCenterWeb knwlCenterWeb = new KnwlCenterWeb(uc); + return knwlCenterWeb.startBorrowProcess(cardId, dimensionId, "mobile"); + } + @Mapping("com.actionsoft.apps.kms_mobile_center_dimension_tree_json") + public String getDimensionTreeJson(UserContext uc, String parentId, boolean isDimensionKnwlPage) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.getDimensionTreeJson(uc, parentId, isDimensionKnwlPage); + } + + @Mapping("com.actionsoft.apps.kms_mobile_center_dimension_search") + public String getDimensionSearchByName(UserContext uc, String key) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.getDimensionSearchByName(uc, key); + } + + @Mapping("com.actionsoft.apps.kms_knwl_center_mobile_schema_attr_list_json") + public String getSchemaMobile(UserContext uc) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.getSchemaMobile(); + } + + @Mapping("com.actionsoft.apps.kms_knwl_center_mobile_check_fullsearch") + public String checkFullsearchAppActive(UserContext uc) { + KnwlMobileWeb web = new KnwlMobileWeb(uc); + return web.checkFullsearchAppActive(uc); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlSearchController.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlSearchController.java new file mode 100644 index 00000000..e87d11c0 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/KnwlSearchController.java @@ -0,0 +1,167 @@ +package com.actionsoft.apps.kms.controller; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.web.KnwlSearchWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * @author wangshibao + */ +@Controller +public class KnwlSearchController { + /* 知识检索home页 */ + @Mapping("com.actionsoft.apps.kms_knwl_search") + public String getKnwlMgrHome(UserContext uc, String searchType, String sortIndx) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.getKnwlSearchHome(searchType, sortIndx); + } + + /* 知识检索-属性-维度树json */ + @Mapping("com.actionsoft.apps.kms_knwl_search_attr_dimension_tree_json") + public String getAttrSearchDimensionTreeJson(UserContext uc, String parentId) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.getAttrSearchDimensionTreeJson(parentId, KMSUtil.isKnwlManager(uc.getUID())); + } + + /* 知识检索-属性-维度树json */ + @Mapping("com.actionsoft.apps.kms_knwl_search_attr_dimension_tree_all_json") + public String getAttrSearchDimensionTreeAllJson(UserContext uc) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.getAttrSearchDimensionTreeAllJson(); + } + + /* 知识检索-属性-元数据列表json */ + @Mapping("com.actionsoft.apps.kms_knwl_search_schema_attr_list_json") + public String getSchemaAttrListJson(UserContext uc) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.getSchemaAttr(); + } + + /* 知识检索-属性-检索数据库 */ + @Mapping("com.actionsoft.apps.kms_knwl_attr_search_dosearch") + public String attrSearchCard(UserContext uc, int curPage, int rowsPerPage, String sortIndx, String sortDir, String searchDimensionIds, String schemaMetaData, String cardName, String publishUser, String publishTime, String tags, String lastPublishId, String searchType,String departId) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + System.out.println("departId>>>>>>>>>>>"+departId); + return knwlSearchWeb.attrSearchCard(curPage, rowsPerPage, sortIndx, sortDir, searchDimensionIds, schemaMetaData, cardName, publishTime, publishUser, tags, lastPublishId, searchType,departId); + } + + /* 全文检索 */ + @Mapping("com.actionsoft.apps.kms_knwl_fullsearch_list_json") + public String fullSearch(UserContext uc, int curPage, int rowsPerPage, String searchText, String docTypes, String searchType) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.fullSearch(curPage, rowsPerPage, searchText, docTypes, searchType); + } + + // 键盘地址本查询团队成员模糊匹配 + @Mapping("com.actionsoft.apps.kms_knwl_memberlist") + public String getApplicationManagementDeploy(UserContext uc, String term) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + // term为组件默认参数 + return knwlSearchWeb.getUserList(term); + } + + /** + * 全文检索查询 + * + * @param me + * @param q 关键词 + * @return + */ + @Mapping("com.actionsoft.apps.kms_es_search") + public String openEsSearchPage(UserContext me, String q) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.openEsSearchPage(q); + } + + /** + * kms注册的xpages页面 + * + * @param me + * @return + */ + @Mapping("com.actionsoft.apps.kms_xpages") + public String kmsXPages(UserContext me, String showIndex, String showStyle) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.kmsXPages(showIndex, showStyle); + } + + @Mapping("com.actionsoft.apps.kms_querycardtoplist") + public String queryCardTopList(UserContext me, String sortIndx) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.queryCardTopList(sortIndx); + } + + @Mapping("com.actionsoft.apps.kms_querycardtoplistpage") + public String queryCardTopPage(UserContext me, String sortIndx) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.queryCardTopPage(sortIndx); + } + + @Mapping("com.actionsoft.apps.kms_xpage_opencardbydirctory") + public String openCardbyDirctory(UserContext me, String rootDirectoryId, String showType, String showIndex, String ifShowDirectory, String sortIndx, String showStyle, String publishTimeFormat) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.openCardByDirctory(rootDirectoryId, showType, showIndex, ifShowDirectory, sortIndx, showStyle, publishTimeFormat); + } + + @Mapping("com.actionsoft.apps.kms_xpage_getcardbydirctory") + public String getCardByDirctory(UserContext me, String directoryId, String sortIndx, String hasPerm, String publishTimeFormat) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.getCardByDirctory(directoryId, sortIndx, hasPerm, publishTimeFormat); + } + + @Mapping("com.actionsoft.apps.kms_xpage_getxpagecategory") + public String getXpageCategory(UserContext me) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.getXpageCategory(); + } + + @Mapping("com.actionsoft.apps.kms_xpage_savexpagecategory") + public String saveXpageCategory(UserContext me, String categoryName) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.saveXpageCategory(categoryName); + } + + @Mapping("com.actionsoft.apps.kms_xpage_openfastcard") + public String openFastCard(UserContext me, String category, String showType, String showIndex, String showStyle, String publishTimeFormat) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.openFastCard(category, showType, showIndex, showStyle, publishTimeFormat); + } + + @Mapping("com.actionsoft.apps.kms_xpage_savexpagefastcard") + public String saveXpageFastCard(UserContext me, String categoryName, String cardIds) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.saveXpageFastCard(categoryName, cardIds); + } + + @Mapping("com.actionsoft.apps.kms_xpage_deletexpagefastcard") + public String deleteXpageFastCard(UserContext me, String id) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.deleteXpageFastCard(id); + } + + @Mapping("com.actionsoft.apps.kms_xpage_loadfastcard") + public String loadFastCard(UserContext me, String categoryName, String publishTimeFormat) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.loadFastCard(categoryName, publishTimeFormat); + } + + @Mapping("com.actionsoft.apps.kms_xpage_savefastcardorder") + public String saveFastCardOrder(UserContext me, String data) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.saveFastCardOrder(data); + } + + @Mapping("com.actionsoft.apps.kms_xpage_getcardtree") + public String getCardTree(UserContext me) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.getCardTree(); + } + + @Mapping("com.actionsoft.apps.kms_xpage_getcardtreedata") + public String getCardTreeData(UserContext me, String type, String pid, String hasPerm) { + KnwlSearchWeb web = new KnwlSearchWeb(me); + return web.getCardTreeData(type, pid, hasPerm); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/SystemMgrController.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/SystemMgrController.java new file mode 100644 index 00000000..718fde88 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/controller/SystemMgrController.java @@ -0,0 +1,83 @@ +package com.actionsoft.apps.kms.controller; + +import com.actionsoft.apps.kms.web.SystemMgrWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * + * @author wangshibao + */ +@Controller +public class SystemMgrController { + /* 系统维护home页 */ + @Mapping("com.actionsoft.apps.kms_system_mgr") + public String getKnwlMgrHome(UserContext uc) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.getSystemMgrHome(); + } + + /* 系统维护版本号列表json */ + @Mapping("com.actionsoft.apps.kms_version_list_json") + public String getVersionListJson(UserContext uc) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.getVersionListJson(); + } + + /* 系统维护知识地图定义列表json */ + @Mapping("com.actionsoft.apps.kms_hotspot_def_list_json") + public String getHotspotDefListJson(UserContext uc) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.getHotspotDefListJson(); + } + + /* 保存知识参数 */ + @Mapping("com.actionsoft.apps.kms_system_mgr_save_param") + public String saveSystemParam(UserContext uc, String maxFileSize, String blackFileList, String gridRowPP, String browserPreview) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.saveSystemParam(maxFileSize, blackFileList, gridRowPP, browserPreview); + } + + /* 获取知识参数 */ + @Mapping("com.actionsoft.apps.kms_system_mgr_get_param_json") + public String getSystemParam(UserContext uc) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.getSystemParam(); + } + + /* 新建版本号 */ + @Mapping("com.actionsoft.apps.kms_system_mgr_add_version") + public String addVersion(UserContext uc, String versionNo, String memo) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.addVersion(versionNo, memo); + } + + /* 新建知识地图定义 */ + @Mapping("com.actionsoft.apps.kms_system_mgr_add_hotspot_def") + public String addHotspotDef(UserContext uc, String hotspotName, String hotspotMetaId, String memo) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.addHotspotDef(hotspotName, hotspotMetaId, memo); + } + + /* 删除版本号 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_version") + public String deleteVersions(UserContext uc, String versionNos) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.deleteVersions(versionNos); + } + + /* 删除知识地图定义 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_hotspot_def") + public String deleteHotspotDefs(UserContext uc, String hotspotDefIds) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.deleteHotspotDefs(hotspotDefIds); + } + + /* 删除知识地图定义 */ + @Mapping("com.actionsoft.apps.kms_knwl_center_delete_hotspot_check") + public String deleteHotspotDefsCheck(UserContext uc, String hotspotDefIds) { + SystemMgrWeb systemMgrWeb = new SystemMgrWeb(uc); + return systemMgrWeb.deleteHotspotDefsCheck(hotspotDefIds); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/CardDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/CardDao.java new file mode 100644 index 00000000..a2f6072d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/CardDao.java @@ -0,0 +1,170 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 知识 + * + * @author wangshibao + */ +public class CardDao extends DaoObject { + + @Override + public int insert(CardModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(CardModel.ID, model.getId()); + paraMap.put(CardModel.CARDNAME, model.getCardName()); + paraMap.put(CardModel.CARDTYPE, model.getCardType()); + paraMap.put(CardModel.CREATETIME, model.getCreateTime()); + paraMap.put(CardModel.CREATEUSER, model.getCreateUser()); + paraMap.put(CardModel.ONLINELEVEL, model.getOnlineLevel()); + paraMap.put(CardModel.ISPUBLISHED, model.getIsPublished()); + paraMap.put(CardModel.ISFULLSEARCH, model.getIsFullSearch()); + paraMap.put(CardModel.READCOUNT, model.getReadCount()); + paraMap.put(CardModel.SECURITYLEVEL, model.getSecurityLevel()); + + if (model.getLastUpdate() == null) { + SQLNullValue lastUpdateNull = SQLNullValue.newInstance(Types.DATE); + paraMap.put(CardModel.LASTUPDATE, lastUpdateNull); + } else { + paraMap.put(CardModel.LASTUPDATE, model.getLastUpdate()); + } + if (model.getValidDate() == null) { + SQLNullValue validDateNull = SQLNullValue.newInstance(Types.DATE); + paraMap.put(CardModel.VALIDDATE, validDateNull); + } else { + paraMap.put(CardModel.VALIDDATE, model.getValidDate()); + } + + paraMap.put(CardModel.ISCOMMENT, model.getIsComment()); + paraMap.put(CardModel.ISRATE, model.getIsRate()); + paraMap.put(CardModel.CARDCONTEXT, ""); + if (model.getExternalUrl() == null) { + paraMap.put(CardModel.EXTERNALURL, ""); + } else { + paraMap.put(CardModel.EXTERNALURL, model.getExternalUrl()); + } + if (model.getExtParams() == null) { + paraMap.put(CardModel.EXTPARAMS, ""); + } else { + paraMap.put(CardModel.EXTPARAMS, model.getExtParams()); + } + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + CardCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(CardModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(CardModel.CARDNAME, model.getCardName()); + paraMap.put(CardModel.CARDTYPE, model.getCardType()); + paraMap.put(CardModel.CREATETIME, model.getCreateTime()); + paraMap.put(CardModel.CREATEUSER, model.getCreateUser()); + paraMap.put(CardModel.ONLINELEVEL, model.getOnlineLevel()); + paraMap.put(CardModel.ISPUBLISHED, model.getIsPublished()); + paraMap.put(CardModel.ISFULLSEARCH, model.getIsFullSearch()); + paraMap.put(CardModel.READCOUNT, model.getReadCount()); + paraMap.put(CardModel.SECURITYLEVEL, model.getSecurityLevel()); + if (model.getLastUpdate() == null) { + SQLNullValue lastUpdateNull = SQLNullValue.newInstance(Types.DATE); + paraMap.put(CardModel.LASTUPDATE, lastUpdateNull); + } else { + paraMap.put(CardModel.LASTUPDATE, model.getLastUpdate()); + } + if (model.getValidDate() == null) { + SQLNullValue validDateNull = SQLNullValue.newInstance(Types.DATE); + paraMap.put(CardModel.VALIDDATE, validDateNull); + } else { + paraMap.put(CardModel.VALIDDATE, model.getValidDate()); + } + paraMap.put(CardModel.ISCOMMENT, model.getIsComment()); + paraMap.put(CardModel.ISRATE, model.getIsRate()); + paraMap.put(CardModel.CARDCONTEXT, ""); + if (model.getExternalUrl() == null) { + paraMap.put(CardModel.EXTERNALURL, ""); + } else { + paraMap.put(CardModel.EXTERNALURL, model.getExternalUrl()); + } + if (model.getExtParams() == null) { + paraMap.put(CardModel.EXTPARAMS, ""); + } else { + paraMap.put(CardModel.EXTPARAMS, model.getExtParams()); + } + int result = update(model.getId(), paraMap); + if (result == 1) { + CardCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_CARD; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public CardModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public CardModel record2Model(ResultSet rs) { + CardModel cardModel = null; + try { + if (rs.getString(CardModel.CARDTYPE) == null) { + return cardModel; + } + cardModel = new CardModel(); + cardModel.setId(rs.getString(CardModel.ID)); + cardModel.setCardName(rs.getString(CardModel.CARDNAME)); + cardModel.setCardType(rs.getInt(CardModel.CARDTYPE)); + cardModel.setCreateTime(rs.getTimestamp(CardModel.CREATETIME)); + cardModel.setCreateUser(rs.getString(CardModel.CREATEUSER)); + cardModel.setIsPublished(rs.getInt(CardModel.ISPUBLISHED)); + cardModel.setLastUpdate(rs.getTimestamp(CardModel.LASTUPDATE)); + cardModel.setOnlineLevel(rs.getInt(CardModel.ONLINELEVEL)); + cardModel.setReadCount(rs.getLong(CardModel.READCOUNT)); + cardModel.setSecurityLevel(rs.getInt(CardModel.SECURITYLEVEL)); + cardModel.setValidDate(rs.getDate(CardModel.VALIDDATE)); + cardModel.setIsComment(rs.getInt(CardModel.ISCOMMENT)); + cardModel.setIsRate(rs.getInt(CardModel.ISRATE)); + cardModel.setCardContext(rs.getString(CardModel.CARDCONTEXT)); + cardModel.setIsFullSearch(rs.getInt(CardModel.ISFULLSEARCH)); + cardModel.setExternalUrl(rs.getString(cardModel.EXTERNALURL)); + cardModel.setExtParams(rs.getString(cardModel.EXTPARAMS)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return cardModel; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/DimensionDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/DimensionDao.java new file mode 100644 index 00000000..866aba34 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/DimensionDao.java @@ -0,0 +1,217 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 维度 + * + * @author wangshibao + */ +public class DimensionDao extends DaoObject { + /** + * 重载方法,传入Connection提高效率 + * + * @param conn + * @param model + * @return + * @throws AWSDataAccessException + * @author wangshibao + */ + public int insert(Connection conn, DimensionModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(DimensionModel.ID, model.getId()); + paraMap.put(DimensionModel.DIMENSIONNAME, model.getDimensionName()); + paraMap.put(DimensionModel.CREATEUSER, model.getCreateUser()); + paraMap.put(DimensionModel.CREATETIME, model.getCreateTime()); + paraMap.put(DimensionModel.HOTSPOTDEFID, model.getHotspotDefId()); + paraMap.put(DimensionModel.ISENABLED, model.getIsEnabled()); + paraMap.put(DimensionModel.ISEXAMINE, model.getIsExamine()); + + if (model.getMemo() == null) { + paraMap.put(DimensionModel.MEMO, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(DimensionModel.MEMO, model.getMemo()); + } + + paraMap.put(DimensionModel.PARENTID, model.getParentId()); + paraMap.put(DimensionModel.SHOWTYPE, model.getShowType()); + + if (model.getLastUpdate() == null) { + paraMap.put(DimensionModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(DimensionModel.LASTUPDATE, model.getLastUpdate()); + } + + paraMap.put(DimensionModel.ORDERINDEX, model.getOrderIndex()); + + int result = 0; + if (conn == null) { + result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + } else { + result = DBSql.update(conn, DBSql.getInsertStatement(entityName(), paraMap), paraMap); + } + if (result == 1) {// 更新cache + DimensionCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int insert(DimensionModel model) throws AWSDataAccessException { + return insert(null, model); + } + + /** + * 重载方法,传入Connection提高效率 + * + * @param conn + * @param model + * @return + * @throws AWSDataAccessException + * @author wangshibao + */ + public int update(Connection conn, DimensionModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(DimensionModel.DIMENSIONNAME, model.getDimensionName()); + paraMap.put(DimensionModel.CREATEUSER, model.getCreateUser()); + paraMap.put(DimensionModel.CREATETIME, model.getCreateTime()); + paraMap.put(DimensionModel.HOTSPOTDEFID, model.getHotspotDefId()); + paraMap.put(DimensionModel.ISENABLED, model.getIsEnabled()); + paraMap.put(DimensionModel.ISEXAMINE, model.getIsExamine()); + paraMap.put(DimensionModel.MEMO, model.getMemo()); + paraMap.put(DimensionModel.PARENTID, model.getParentId()); + paraMap.put(DimensionModel.SHOWTYPE, model.getShowType()); + if (model.getLastUpdate() == null) { + paraMap.put(DimensionModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(DimensionModel.LASTUPDATE, model.getLastUpdate()); + } + + paraMap.put(DimensionModel.ORDERINDEX, model.getOrderIndex()); + + int result = 0; + if (conn == null) { + result = update(model.getId(), paraMap); + } else { + result = update(conn, model.getId(), paraMap); + } + if (result == 1) {// 更新cache + DimensionCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(DimensionModel model) throws AWSDataAccessException { + return update(null, model); + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_DIMENSION; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public DimensionModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public DimensionModel record2Model(ResultSet rs) { + DimensionModel dimensionModel = new DimensionModel(); + try { + dimensionModel.setId(rs.getString(DimensionModel.ID)); + dimensionModel.setCreateTime(rs.getTimestamp(DimensionModel.CREATETIME)); + dimensionModel.setCreateUser(rs.getString(DimensionModel.CREATEUSER)); + dimensionModel.setDimensionName(rs.getString(DimensionModel.DIMENSIONNAME)); + dimensionModel.setHotspotDefId(rs.getString(DimensionModel.HOTSPOTDEFID)); + dimensionModel.setIsEnabled(rs.getInt(DimensionModel.ISENABLED)); + dimensionModel.setIsExamine(rs.getInt(DimensionModel.ISEXAMINE)); + dimensionModel.setLastUpdate(rs.getTimestamp(DimensionModel.LASTUPDATE)); + dimensionModel.setMemo(rs.getString(DimensionModel.MEMO)); + String parentId = rs.getString(DimensionModel.PARENTID); + dimensionModel.setParentId(parentId == null ? "" : parentId.trim());// sqlserver和db2把char(36)类型的空字符串默认处理为36位空格 oracle把char(36)类型的空字符串处理为NULL + dimensionModel.setShowType(rs.getInt(DimensionModel.SHOWTYPE)); + dimensionModel.setOrderIndex(rs.getInt(DimensionModel.ORDERINDEX)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return dimensionModel; + } + + /** + * 删除维度(一并删除子维度) + * + * @param dimensionIdList 维度集合 + * @return + * @throws AWSDataAccessException + * @author wangshibao + */ + public int delete(List dimensionIdList) throws AWSDataAccessException { + + StringBuilder sqlWhere = new StringBuilder("("); + for (int i = 0; i < dimensionIdList.size(); i++) { + sqlWhere.append("'" + dimensionIdList.get(i) + "',"); + } + String sqlWhere1 = sqlWhere.substring(0, sqlWhere.lastIndexOf(",")); + sqlWhere1 += ")"; + String sql = "DELETE FROM " + entityName() + " WHERE " + pkFieldName() + " IN " + sqlWhere1; + + int result = DBSql.update(sql); + // 更新cache + DimensionCache dimensionCache = DimensionCache.getCache(); + for (String id : dimensionIdList) { + dimensionCache.remove(id); + } + return result; + } + + /** + * 填充后代维度id + * + * @param id + * @param dimensionIds + * @author wangshibao + */ + public void fillDescendantDimensions(String id, List dimensionIds) { + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (id.equals(dimensionModel.getParentId())) { + dimensionIds.add(dimensionModel.getId()); + String id1 = dimensionModel.getId(); + fillDescendantDimensions(id1, dimensionIds); + } + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/FileDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/FileDao.java new file mode 100644 index 00000000..ff466792 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/FileDao.java @@ -0,0 +1,117 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 知识-文件 + * + * @author wangshibao + */ +public class FileDao extends DaoObject { + + @Override + public int insert(FileModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(FileModel.ID, model.getId()); + paraMap.put(FileModel.CARDID, model.getCardId()); + paraMap.put(FileModel.CREATETIME, model.getCreateTime()); + paraMap.put(FileModel.CREATEUSER, model.getCreateUser()); + paraMap.put(FileModel.FILENAME, model.getFileName()); + paraMap.put(FileModel.FILESIZE, model.getFileSize()); + paraMap.put(FileModel.FILESTATE, model.getFileState()); + paraMap.put(FileModel.FILEVER, model.getFileVer()); + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + // 更新缓存 + FileCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(FileModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(FileModel.CARDID, model.getCardId()); + paraMap.put(FileModel.CREATETIME, model.getCreateTime()); + paraMap.put(FileModel.CREATEUSER, model.getCreateUser()); + paraMap.put(FileModel.FILENAME, model.getFileName()); + paraMap.put(FileModel.FILESIZE, model.getFileSize()); + paraMap.put(FileModel.FILESTATE, model.getFileState()); + paraMap.put(FileModel.FILEVER, model.getFileVer()); + paraMap.put(FileModel.ISFULLSEARCH, model.getIsFullsearch()); + int result = update(model.getId(), paraMap); + if (result == 1) { + // 更新缓存 + FileCache.getCache().put(model.getId(), model); + } + return result; + } + + /** + * 删除文件(但不删除缓存,在调用方删除缓存) + * + * @param id + * @return + * @throws AWSDataAccessException + * @author wangshibao + */ + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_FILE; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public FileModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public FileModel record2Model(ResultSet rs) { + FileModel fileModel = new FileModel(); + try { + fileModel.setCardId(rs.getString(FileModel.CARDID)); + fileModel.setCreateTime(rs.getTimestamp(FileModel.CREATETIME)); + fileModel.setCreateUser(rs.getString(FileModel.CREATEUSER)); + fileModel.setFileName(rs.getString(FileModel.FILENAME)); + fileModel.setFileSize(rs.getLong(FileModel.FILESIZE)); + fileModel.setFileState(rs.getInt(FileModel.FILESTATE)); + fileModel.setFileVer(rs.getString(FileModel.FILEVER)); + fileModel.setId(rs.getString(FileModel.ID)); + fileModel.setIsFullsearch(rs.getInt(FileModel.ISFULLSEARCH)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return fileModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDao.java new file mode 100644 index 00000000..1b934599 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDao.java @@ -0,0 +1,144 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.HotspotCache; +import com.actionsoft.apps.kms.model.HotspotModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 知识地图 + * + * @author wangshibao + */ +public class HotspotDao extends DaoObject { + + @Override + public int insert(HotspotModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getObjectId()); + } + Map paraMap = new HashMap<>(); + paraMap.put(HotspotModel.ID, model.getId()); + paraMap.put(HotspotModel.HOTSPOTDEFID, model.getHotspotDefId()); + if (model.getDimensionId() == null) { + paraMap.put(HotspotModel.DIMENSIONID, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.DIMENSIONID, model.getDimensionId()); + } + + paraMap.put(HotspotModel.SHAPEID, model.getShapeId()); + paraMap.put(HotspotModel.BINDTYPE, model.getBindType()); + if (model.getLinkURL() == null) { + paraMap.put(HotspotModel.LINKURL, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.LINKURL, model.getLinkURL()); + } + if (model.getTarget() == null) { + paraMap.put(HotspotModel.TARGET, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.TARGET, model.getTarget()); + } + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + // 更新缓存 + HotspotCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(HotspotModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(HotspotModel.HOTSPOTDEFID, model.getHotspotDefId()); + if (model.getDimensionId() == null) { + paraMap.put(HotspotModel.DIMENSIONID, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.DIMENSIONID, model.getDimensionId()); + } + paraMap.put(HotspotModel.SHAPEID, model.getShapeId()); + paraMap.put(HotspotModel.BINDTYPE, model.getBindType()); + if (model.getLinkURL() == null) { + paraMap.put(HotspotModel.LINKURL, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.LINKURL, model.getLinkURL()); + } + if (model.getTarget() == null) { + paraMap.put(HotspotModel.TARGET, SQLNullValue.newInstance(Types.VARCHAR)); + } else { + paraMap.put(HotspotModel.TARGET, model.getTarget()); + } + int result = update(model.getId(), paraMap); + if (result == 1) { + // 更新缓存 + HotspotCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + HotspotCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + + int result = super.delete(conn, id); + if (result == 1) { + HotspotCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_HOTSPOT; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public HotspotModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public HotspotModel record2Model(ResultSet rs) { + HotspotModel hotspotModel = new HotspotModel(); + try { + hotspotModel.setDimensionId(rs.getString(HotspotModel.DIMENSIONID)); + hotspotModel.setShapeId(rs.getString(HotspotModel.SHAPEID)); + hotspotModel.setHotspotDefId(rs.getString(HotspotModel.HOTSPOTDEFID)); + hotspotModel.setId(rs.getString(HotspotModel.ID)); + hotspotModel.setBindType(rs.getInt(HotspotModel.BINDTYPE)); + hotspotModel.setLinkURL(rs.getString(HotspotModel.LINKURL)); + hotspotModel.setTarget(rs.getString(hotspotModel.TARGET)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return hotspotModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDefDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDefDao.java new file mode 100644 index 00000000..820d93c4 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/HotspotDefDao.java @@ -0,0 +1,99 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.model.HotspotDefModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 知识地图定义 + * + * @author wangshibao + */ +public class HotspotDefDao extends DaoObject { + + @Override + public int insert(HotspotDefModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(HotspotDefModel.ID, model.getId()); + paraMap.put(HotspotDefModel.CREATETIME, model.getCreateTime()); + paraMap.put(HotspotDefModel.CREATEUSER, model.getCreateUser()); + paraMap.put(HotspotDefModel.HOTSPOTNAME, model.getHotspotName()); + paraMap.put(HotspotDefModel.HOTSPOTMETAID, model.getHotspotMetaId()); + paraMap.put(HotspotDefModel.MEMO, model.getMemo()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + return result; + } + + @Override + public int update(HotspotDefModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(HotspotDefModel.CREATETIME, model.getCreateTime()); + paraMap.put(HotspotDefModel.CREATEUSER, model.getCreateUser()); + paraMap.put(HotspotDefModel.HOTSPOTNAME, model.getHotspotName()); + paraMap.put(HotspotDefModel.HOTSPOTMETAID, model.getHotspotMetaId()); + paraMap.put(HotspotDefModel.MEMO, model.getMemo()); + int result = update(model.getId(), paraMap); + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_HOTSPOT_DEF; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public HotspotDefModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public HotspotDefModel record2Model(ResultSet rs) { + HotspotDefModel hotspotDefModel = new HotspotDefModel(); + try { + hotspotDefModel.setCreateTime(rs.getTimestamp(HotspotDefModel.CREATETIME)); + hotspotDefModel.setId(rs.getString(HotspotDefModel.ID)); + hotspotDefModel.setCreateUser(rs.getString(HotspotDefModel.CREATEUSER)); + hotspotDefModel.setHotspotName(rs.getString(HotspotDefModel.HOTSPOTNAME)); + hotspotDefModel.setHotspotMetaId(rs.getString(HotspotDefModel.HOTSPOTMETAID)); + hotspotDefModel.setMemo(rs.getString(HotspotDefModel.MEMO)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return hotspotDefModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/LogDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/LogDao.java new file mode 100644 index 00000000..6432c755 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/LogDao.java @@ -0,0 +1,107 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.model.LogModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 日志 + * + * @author wangshibao + */ +public class LogDao extends DaoObject { + + @Override + public int insert(LogModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(LogModel.ID, model.getId()); + paraMap.put(LogModel.ACCESSTIME, model.getAccessTime()); + paraMap.put(LogModel.ACCESSUSER, model.getAccessUser()); + paraMap.put(LogModel.CARDID, model.getCardId()); + + if (model.getFileId() == null) { + SQLNullValue fileIdNull = SQLNullValue.newInstance(Types.VARCHAR); + paraMap.put(LogModel.FILEID, fileIdNull); + } else { + paraMap.put(LogModel.FILEID, model.getFileId()); + } + paraMap.put(LogModel.IPADDRESS, model.getIpAddress()); + paraMap.put(LogModel.LOGTYPE, model.getLogType()); + paraMap.put(LogModel.LOGINFO, model.getLogInfo()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + return result; + } + + @Override + public int update(LogModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(LogModel.ACCESSTIME, model.getAccessTime()); + paraMap.put(LogModel.ACCESSUSER, model.getAccessUser()); + paraMap.put(LogModel.CARDID, model.getCardId()); + if (model.getFileId() == null) { + SQLNullValue fileIdNull = SQLNullValue.newInstance(Types.VARCHAR); + paraMap.put(LogModel.FILEID, fileIdNull); + } else { + paraMap.put(LogModel.FILEID, model.getFileId()); + } + paraMap.put(LogModel.IPADDRESS, model.getIpAddress()); + paraMap.put(LogModel.LOGTYPE, model.getLogType()); + paraMap.put(LogModel.LOGINFO, model.getLogInfo()); + int result = update(model.getId(), paraMap); + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_LOG; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public LogModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public LogModel record2Model(ResultSet rs) { + LogModel logModel = new LogModel(); + try { + logModel.setAccessTime(rs.getTimestamp(LogModel.ACCESSTIME)); + logModel.setAccessUser(rs.getString(LogModel.ACCESSUSER)); + logModel.setCardId(rs.getString(LogModel.CARDID)); + logModel.setFileId(rs.getString(LogModel.FILEID)); + logModel.setId(rs.getString(LogModel.ID)); + logModel.setIpAddress(rs.getString(LogModel.IPADDRESS)); + logModel.setLogType(rs.getInt(LogModel.LOGTYPE)); + logModel.setLogInfo(rs.getString(LogModel.LOGINFO)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return logModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaAttrDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaAttrDao.java new file mode 100644 index 00000000..dfcae945 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaAttrDao.java @@ -0,0 +1,107 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.MetaAttrCache; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 元数据-属性 + * + * @author wangshibao + */ +public class MetaAttrDao extends DaoObject { + + @Override + public int insert(MetaAttrModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaAttrModel.ID, model.getId()); + paraMap.put(MetaAttrModel.ATTRTITLE, model.getAttrTitle()); + paraMap.put(MetaAttrModel.CREATETIME, model.getCreateTime()); + paraMap.put(MetaAttrModel.CREATEUSER, model.getCreateUser()); + paraMap.put(MetaAttrModel.SCHEMAID, model.getSchemaId()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + MetaAttrCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(MetaAttrModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaAttrModel.ATTRTITLE, model.getAttrTitle()); + int result = update(model.getId(), paraMap); + if (result == 1) { + MetaAttrModel metaAttrModel = MetaAttrCache.getCache().get(model.getId()); + metaAttrModel.setAttrTitle(model.getAttrTitle()); + MetaAttrCache.getCache().put(model.getId(), metaAttrModel); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + MetaAttrCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + MetaAttrCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_META_ATTR; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public MetaAttrModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public MetaAttrModel record2Model(ResultSet rs) { + MetaAttrModel metaAttrModel = new MetaAttrModel(); + try { + metaAttrModel.setAttrTitle(rs.getString(MetaAttrModel.ATTRTITLE)); + metaAttrModel.setCreateTime(rs.getTimestamp(MetaAttrModel.CREATETIME)); + metaAttrModel.setCreateUser(rs.getString(MetaAttrModel.CREATEUSER)); + metaAttrModel.setId(rs.getString(MetaAttrModel.ID)); + metaAttrModel.setSchemaId(rs.getString(MetaAttrModel.SCHEMAID)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return metaAttrModel; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaDataDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaDataDao.java new file mode 100644 index 00000000..1b54c4d0 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaDataDao.java @@ -0,0 +1,116 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.model.MetaDataModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 元数据-数据 + * + * @author wangshibao + */ +public class MetaDataDao extends DaoObject { + + @Override + public int insert(MetaDataModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaDataModel.ID, model.getId()); + paraMap.put(MetaDataModel.ATTRID, model.getAttrId()); + paraMap.put(MetaDataModel.CARDID, model.getCardId()); + paraMap.put(MetaDataModel.CREATETIME, model.getCreateTime()); + paraMap.put(MetaDataModel.CREATEUSER, model.getCreateUser()); + paraMap.put(MetaDataModel.METATEXT, model.getMetaText()); + paraMap.put(MetaDataModel.SCHEMAID, model.getSchemaId()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + MetaDataCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(MetaDataModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaDataModel.ATTRID, model.getAttrId()); + paraMap.put(MetaDataModel.CARDID, model.getCardId()); + paraMap.put(MetaDataModel.CREATETIME, model.getCreateTime()); + paraMap.put(MetaDataModel.CREATEUSER, model.getCreateUser()); + paraMap.put(MetaDataModel.METATEXT, model.getMetaText()); + paraMap.put(MetaDataModel.SCHEMAID, model.getSchemaId()); + int result = update(model.getId(), paraMap); + if (result == 1) { + MetaDataCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + + int result = super.delete(id); + if (result == 1) { + MetaDataCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + MetaDataCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_META_DATA; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public MetaDataModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public MetaDataModel record2Model(ResultSet rs) { + MetaDataModel metaDataModel = new MetaDataModel(); + try { + metaDataModel.setAttrId(rs.getString(MetaDataModel.ATTRID)); + metaDataModel.setCardId(rs.getString(MetaDataModel.CARDID)); + metaDataModel.setCreateTime(rs.getTimestamp(MetaDataModel.CREATETIME)); + metaDataModel.setCreateUser(rs.getString(MetaDataModel.CREATEUSER)); + metaDataModel.setId(rs.getString(MetaDataModel.ID)); + metaDataModel.setMetaText(rs.getString(MetaDataModel.METATEXT)); + metaDataModel.setSchemaId(rs.getString(MetaDataModel.SCHEMAID)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return metaDataModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaSchemaDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaSchemaDao.java new file mode 100644 index 00000000..a2eec253 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/MetaSchemaDao.java @@ -0,0 +1,134 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.MetaSchemaCache; +import com.actionsoft.apps.kms.model.MetaSchemaModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 元数据 + * + * @author wangshibao + */ +public class MetaSchemaDao extends DaoObject { + + @Override + public int insert(MetaSchemaModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaSchemaModel.ID, model.getId()); + paraMap.put(MetaSchemaModel.CREATETIME, model.getCreateTime()); + paraMap.put(MetaSchemaModel.CREATEUSER, model.getCreateUser()); + paraMap.put(MetaSchemaModel.ISNULLABLE, model.getIsNullable()); + paraMap.put(MetaSchemaModel.ISSEARCH, model.getIsSearch()); + paraMap.put(MetaSchemaModel.SCHEMADESC, model.getSchemaDesc()); + paraMap.put(MetaSchemaModel.SCHEMASHOWTYPE, model.getSchemaShowtype()); + paraMap.put(MetaSchemaModel.SCHEMATITLE, model.getSchemaTitle()); + + if (model.getLastUpdate() == null) { + paraMap.put(MetaSchemaModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(MetaSchemaModel.LASTUPDATE, model.getLastUpdate()); + } + paraMap.put(MetaSchemaModel.ORDERINDEX, model.getOrderIndex()); + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + MetaSchemaCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(MetaSchemaModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(MetaSchemaModel.ISNULLABLE, model.getIsNullable()); + paraMap.put(MetaSchemaModel.CREATETIME, model.getCreateTime()); + paraMap.put(MetaSchemaModel.CREATEUSER, model.getCreateUser()); + paraMap.put(MetaSchemaModel.ISSEARCH, model.getIsSearch()); + paraMap.put(MetaSchemaModel.SCHEMADESC, model.getSchemaDesc()); + paraMap.put(MetaSchemaModel.SCHEMASHOWTYPE, model.getSchemaShowtype()); + paraMap.put(MetaSchemaModel.SCHEMATITLE, model.getSchemaTitle()); + if (model.getLastUpdate() == null) { + paraMap.put(MetaSchemaModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(MetaSchemaModel.LASTUPDATE, model.getLastUpdate()); + } + paraMap.put(MetaSchemaModel.ORDERINDEX, model.getOrderIndex()); + int result = update(model.getId(), paraMap); + if (result == 1) { + MetaSchemaCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + MetaSchemaCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + MetaSchemaCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_META_SCHEMA; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public MetaSchemaModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public MetaSchemaModel record2Model(ResultSet rs) { + MetaSchemaModel schemaModel = new MetaSchemaModel(); + try { + schemaModel.setCreateTime(rs.getTimestamp(MetaSchemaModel.CREATETIME)); + schemaModel.setCreateUser(rs.getString(MetaSchemaModel.CREATEUSER)); + schemaModel.setId(rs.getString(MetaSchemaModel.ID)); + schemaModel.setIsNullable(rs.getInt(MetaSchemaModel.ISNULLABLE)); + schemaModel.setIsSearch(rs.getInt(MetaSchemaModel.ISSEARCH)); + schemaModel.setLastUpdate(rs.getTimestamp(MetaSchemaModel.LASTUPDATE)); + schemaModel.setSchemaDesc(rs.getString(MetaSchemaModel.SCHEMADESC)); + schemaModel.setSchemaShowtype(rs.getInt(MetaSchemaModel.SCHEMASHOWTYPE)); + schemaModel.setSchemaTitle(rs.getString(MetaSchemaModel.SCHEMATITLE)); + schemaModel.setOrderIndex(rs.getInt(MetaSchemaModel.ORDERINDEX)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return schemaModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/OptDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/OptDao.java new file mode 100644 index 00000000..281a10be --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/OptDao.java @@ -0,0 +1,107 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.OptCache; +import com.actionsoft.apps.kms.model.OptModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +public class OptDao extends DaoObject { + + @Override + public int insert(OptModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(OptModel.ID, model.getId()); + paraMap.put(OptModel.CARDID, model.getCardId()); + paraMap.put(OptModel.OPTCONTENT, model.getOptContent()); + paraMap.put(OptModel.OPTTIME, model.getOptTime()); + paraMap.put(OptModel.OPTUSER, model.getOptUser()); + paraMap.put(OptModel.OPTTYPE, model.getOptType()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) {// 更新cache + OptCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(OptModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + + Map paraMap = new HashMap<>(); + paraMap.put(OptModel.CARDID, model.getCardId()); + paraMap.put(OptModel.OPTCONTENT, model.getOptContent()); + paraMap.put(OptModel.OPTTIME, model.getOptTime()); + paraMap.put(OptModel.OPTUSER, model.getOptUser()); + paraMap.put(OptModel.OPTTYPE, model.getOptType()); + int result = update(model.getId(), paraMap); + if (result == 1) {// 更新cache + OptCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + OptCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + OptCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_OPT; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public OptModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public OptModel record2Model(ResultSet rs) { + try { + OptModel optModel = new OptModel(); + optModel.setCardId(rs.getString(OptModel.CARDID)); + optModel.setId(rs.getString(OptModel.ID)); + optModel.setOptContent(rs.getString(OptModel.OPTCONTENT)); + optModel.setOptTime(rs.getTimestamp(OptModel.OPTTIME)); + optModel.setOptUser(rs.getString(OptModel.OPTUSER)); + optModel.setOptType(rs.getInt(OptModel.OPTTYPE)); + return optModel; + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/PublishDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/PublishDao.java new file mode 100644 index 00000000..256643fd --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/PublishDao.java @@ -0,0 +1,144 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 发布 + * + * @author wangshibao + */ +public class PublishDao extends DaoObject { + + @Override + public int insert(PublishModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(PublishModel.ID, model.getId()); + paraMap.put(PublishModel.CARDID, model.getCardId()); + paraMap.put(PublishModel.DIMENSIONID, model.getDimensionId()); + paraMap.put(PublishModel.MEMO, model.getMemo()); + + paraMap.put(PublishModel.PUBLISHTIME, model.getPublishTime()); + paraMap.put(PublishModel.PUBLISHUSER, model.getPublishUser()); + paraMap.put(PublishModel.TAG, model.getTag()); + + if (model.getExamineInfo() == null) { + SQLNullValue examineNull = SQLNullValue.newInstance(Types.VARCHAR); + paraMap.put(PublishModel.EXAMINEINFO, examineNull); + } else { + paraMap.put(PublishModel.EXAMINEINFO, model.getExamineInfo()); + } + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + // 更新缓存 + PublishCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(PublishModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(PublishModel.CARDID, model.getCardId()); + paraMap.put(PublishModel.DIMENSIONID, model.getDimensionId()); + paraMap.put(PublishModel.MEMO, model.getMemo()); + + paraMap.put(PublishModel.PUBLISHTIME, model.getPublishTime()); + paraMap.put(PublishModel.PUBLISHUSER, model.getPublishUser()); + paraMap.put(PublishModel.TAG, model.getTag()); + if (model.getExamineInfo() == null) { + SQLNullValue examineNull = SQLNullValue.newInstance(Types.VARCHAR); + paraMap.put(PublishModel.EXAMINEINFO, examineNull); + } else { + paraMap.put(PublishModel.EXAMINEINFO, model.getExamineInfo()); + } + int result = update(model.getId(), paraMap); + if (result == 1) { + // 更新缓存 + PublishCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + // 更新缓存 + PublishCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + // 更新缓存 + PublishCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_PUBLISH; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public PublishModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public PublishModel record2Model(ResultSet rs) { + PublishModel publishModel = new PublishModel(); + try { + publishModel.setCardId(rs.getString(PublishModel.CARDID)); + // 处理CardModel + publishModel.setCardModel(CardCache.getCache().get(publishModel.getCardId())); + + publishModel.setDimensionId(rs.getString(PublishModel.DIMENSIONID)); + // 处理DimensionModel + publishModel.setDimensionModel(DimensionCache.getCache().get(publishModel.getDimensionId())); + + publishModel.setId(rs.getString(PublishModel.ID)); + publishModel.setMemo(rs.getString(PublishModel.MEMO)); + publishModel.setPublishTime(rs.getTimestamp(PublishModel.PUBLISHTIME)); + publishModel.setPublishUser(rs.getString(PublishModel.PUBLISHUSER)); + publishModel.setTag(rs.getString(PublishModel.TAG)); + publishModel.setExamineInfo(rs.getString(PublishModel.EXAMINEINFO)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return publishModel; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/SchemaDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/SchemaDao.java new file mode 100644 index 00000000..be752dea --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/SchemaDao.java @@ -0,0 +1,106 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.model.SchemaModel; +import com.actionsoft.bpms.bo.engine.SQLNullValue; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 元数据 + * + * @author wangshibao + */ +public class SchemaDao extends DaoObject { + + @Override + public int insert(SchemaModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(SchemaModel.ID, model.getId()); + paraMap.put(SchemaModel.CREATETIME, model.getCreateTime()); + paraMap.put(SchemaModel.CREATEUSER, model.getCreateUser()); + paraMap.put(SchemaModel.ISNULLABLE, model.getIsNullable()); + paraMap.put(SchemaModel.ISSEARCH, model.getIsSearch()); + paraMap.put(SchemaModel.SCHEMADESC, model.getSchemaDesc()); + paraMap.put(SchemaModel.SCHEMASHOWTYPE, model.getSchemaShowtype()); + paraMap.put(SchemaModel.SCHEMATITLE, model.getSchemaTitle()); + + if (model.getLastUpdate() == null) { + paraMap.put(SchemaModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(SchemaModel.LASTUPDATE, model.getLastUpdate()); + } + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + return result; + } + + @Override + public int update(SchemaModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(SchemaModel.ISNULLABLE, model.getIsNullable()); + paraMap.put(SchemaModel.ISSEARCH, model.getIsSearch()); + paraMap.put(SchemaModel.SCHEMADESC, model.getSchemaDesc()); + paraMap.put(SchemaModel.SCHEMASHOWTYPE, model.getSchemaShowtype()); + paraMap.put(SchemaModel.SCHEMATITLE, model.getSchemaTitle()); + if (model.getLastUpdate() == null) { + paraMap.put(SchemaModel.LASTUPDATE, SQLNullValue.newInstance(Types.DATE)); + } else { + paraMap.put(SchemaModel.LASTUPDATE, model.getLastUpdate()); + } + int result = update(model.getId(), paraMap); + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_META_SCHEMA; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public SchemaModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public SchemaModel record2Model(ResultSet rs) { + SchemaModel schemaModel = new SchemaModel(); + try { + schemaModel.setCreateTime(rs.getTimestamp(SchemaModel.CREATETIME)); + schemaModel.setCreateUser(rs.getString(SchemaModel.CREATEUSER)); + schemaModel.setId(rs.getString(SchemaModel.ID)); + schemaModel.setIsNullable(rs.getInt(SchemaModel.ISNULLABLE)); + schemaModel.setIsSearch(rs.getInt(SchemaModel.ISSEARCH)); + schemaModel.setLastUpdate(rs.getTimestamp(SchemaModel.LASTUPDATE)); + schemaModel.setSchemaDesc(rs.getString(SchemaModel.SCHEMADESC)); + schemaModel.setSchemaShowtype(rs.getInt(SchemaModel.SCHEMASHOWTYPE)); + schemaModel.setSchemaTitle(rs.getString(SchemaModel.SCHEMATITLE)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return schemaModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/VersionDao.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/VersionDao.java new file mode 100644 index 00000000..e68967bb --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dao/VersionDao.java @@ -0,0 +1,109 @@ +package com.actionsoft.apps.kms.dao; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.VersionCache; +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; + +/** + * 版本号 + * + * @author wangshibao + */ +public class VersionDao extends DaoObject { + + @Override + public int insert(VersionModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + model.setId(UUIDGener.getUUID()); + } + Map paraMap = new HashMap<>(); + paraMap.put(VersionModel.ID, model.getId()); + paraMap.put(VersionModel.CREATETIME, model.getCreateTime()); + paraMap.put(VersionModel.CREATEUSER, model.getCreateUser()); + paraMap.put(VersionModel.VERSIONNO, model.getVersionNo()); + paraMap.put(VersionModel.MEMO, model.getMemo()); + + int result = DBSql.update(DBSql.getInsertStatement(entityName(), paraMap), paraMap); + if (result == 1) { + VersionCache.getCache().put(model.getId(), model); + } + return result; + } + + @Override + public int update(VersionModel model) throws AWSDataAccessException { + if (UtilString.isEmpty(model.getId())) { + throw new AWSDataAccessException("Method getId() Does Not Allow Empty"); + } + Map paraMap = new HashMap<>(); + paraMap.put(VersionModel.CREATETIME, model.getCreateTime()); + paraMap.put(VersionModel.CREATEUSER, model.getCreateUser()); + paraMap.put(VersionModel.VERSIONNO, model.getVersionNo()); + paraMap.put(VersionModel.MEMO, model.getMemo()); + int result = update(model.getId(), paraMap); + if (result == 1) { + VersionCache.getCache().put(model.getId(), model); + } + return result; + } + + public int delete(String id) throws AWSDataAccessException { + int result = super.delete(id); + if (result == 1) { + VersionCache.getCache().remove(id); + } + return result; + } + + public int delete(Connection conn, String id) throws AWSDataAccessException { + int result = super.delete(conn, id); + if (result == 1) { + VersionCache.getCache().remove(id); + } + return result; + } + + @Override + public String entityName() { + return KMSConstant.ENTITY_NAME_VERSION; + } + + @Override + public RowMapper rowMapper() { + return new RowMapper() { + @Override + public VersionModel mapRow(ResultSet rs, int rowNum) throws SQLException { + return record2Model(rs); + } + }; + } + + public VersionModel record2Model(ResultSet rs) { + VersionModel versionModel = new VersionModel(); + try { + versionModel.setCreateTime(rs.getTimestamp(VersionModel.CREATETIME)); + versionModel.setId(rs.getString(VersionModel.ID)); + versionModel.setCreateUser(rs.getString(VersionModel.CREATEUSER)); + versionModel.setVersionNo(rs.getString(VersionModel.VERSIONNO)); + versionModel.setMemo(rs.getString(VersionModel.MEMO)); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + return versionModel; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocCardContentProcessor.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocCardContentProcessor.java new file mode 100644 index 00000000..8ac83c6d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocCardContentProcessor.java @@ -0,0 +1,8 @@ +package com.actionsoft.apps.kms.dc; + +import com.actionsoft.bpms.server.fs.AbstFileProcessor; +import com.actionsoft.bpms.server.fs.FileProcessorListener; + +public class DocCardContentProcessor extends AbstFileProcessor implements FileProcessorListener { + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocFileProcessor.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocFileProcessor.java new file mode 100644 index 00000000..f569cf1b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/DocFileProcessor.java @@ -0,0 +1,152 @@ +package com.actionsoft.apps.kms.dc; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.AbstFileProcessor; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.FileProcessorListener; +import com.actionsoft.bpms.server.fs.dc.DCMessage; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; + +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * @author wangshibao + */ +public class DocFileProcessor extends AbstFileProcessor implements FileProcessorListener { + + @Override + public boolean uploadReady(Map param) throws Exception { + DCContext dcContext = ((DCContext) param.get("DCContext")); + // 根据版本重命名(加上版本号信息,防止文件名冲突) + String cardId = dcContext.getFileValue(); + String fileName = dcContext.getFileName(); + param.put("originalFileName", fileName); + //判断是否有文件版本,存在则使用原版本(文件移交操作) + Map extParams = dcContext.getExtParams(); + String fileVersion = ""; + if (extParams.containsKey("transferFileVersion")) { + fileVersion = extParams.get("transferFileVersion").toString(); + } else { + fileVersion = KMSUtil.getNextFileVersion(cardId, fileName); + } + param.put("fileVersion", fileVersion); + dcContext.setFileName(KMSUtil.getFileNameOfVersion(fileName, fileVersion)); + + return super.uploadReady(param); + } + + /** + * 将文件信息插入数据库 + */ + @Override + public void uploadSuccess(Map param) { + try { + DCContext dcContext = (DCContext) param.get("DCContext"); + + LocalTxManager.getInstance().begin(); + + FileModel fileModel = new FileModel(); + fileModel.setCardId(dcContext.getFileValue()); + fileModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + fileModel.setCreateUser(dcContext.getSession().getUID()); + fileModel.setFileName((String) param.get("originalFileName")); + fileModel.setFileSize(Long.parseLong(dcContext.getFileLength())); + String fileId = UUIDGener.getObjectId(); + fileModel.setId(fileId); + + fileModel.setFileVer((String) param.get("fileVersion")); + fileModel.setFileState(1); + + // 更新其他版本为老版本 + int result = DBSql.update("UPDATE " + KMSConstant.ENTITY_NAME_FILE + " SET " + FileModel.FILESTATE + " = 0 WHERE " + FileModel.CARDID + " = ? AND " + FileModel.FILENAME + " = ? AND " + FileModel.FILESTATE + " = 1 AND " + FileModel.ID + "<> ?", new Object[] { dcContext.getFileValue(), (String) param.get("originalFileName"), fileId }); + // 新建file模型 + FileDao fileDao = new FileDao(); + fileDao.insert(fileModel); + + LocalTxManager.getInstance().commit(); + + if (result != 0) { + // 更新缓存 + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel2 = fileIterator.next(); + if (dcContext.getFileValue().equals(fileModel2.getCardId()) && fileModel2.getFileName().equals(param.get("originalFileName")) && fileModel2.getFileState() == 1 && !fileModel2.getId().equals(fileId)) { + fileModel2.setFileState(0); + fileCache.put(fileModel2.getId(), fileModel2); + } + } + } + + dcContext.setDCMessage(DCMessage.OK, ""); + dcContext.setFileNameShow((String) param.get("originalFileName")); + dcContext.getDCMessage().addAttr("fileDownloadURL", dcContext.getDownloadURL()); + dcContext.getDCMessage().addAttr("fileId", fileModel.getId()); + dcContext.getDCMessage().addAttr("fileVer", fileModel.getFileVer()); + dcContext.getDCMessage().addAttr("createUsername", UserCache.getCache().get(dcContext.getSession().getUID()).getUserName()); + dcContext.getDCMessage().addAttr("createTime", UtilDate.datetimeFormat(fileModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + dcContext.getDCMessage().addAttr("fileSuffixIcon", KMSUtil.getFileIconName((String) param.get("originalFileName"))); + dcContext.getDCMessage().addAttr("fileCreateUserPhoto", SDK.getPortalAPI().getUserPhoto(dcContext.getSession(), fileModel.getCreateUser())); + dcContext.getDCMessage().addAttr("fileCreateUser", fileModel.getCreateUser()); + //调用转换服务.在预览之前提前进行转换 + new Thread(new Runnable() { + @Override + public void run() { + fileCovert(dcContext.getSession(), dcContext, "true"); + fileCovert(dcContext.getSession(), dcContext, "false"); + } + }).start(); + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + } + } + + public static ResponseObject fileCovert(UserContext me, DCContext sourceDc, String isCopy) { + ResponseObject ro = ResponseObject.newOkResponse(); + AppAPI appAPI = SDK.getAppAPI(); + AppContext onlinedocApp = SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"); + if (onlinedocApp != null && SDK.getAppAPI().isActive(onlinedocApp.getId())) { + String sourceAppId = KMSConstant.APP_ID; + // 服务地址 + String aslp = "aslp://com.actionsoft.apps.addons.wpsonline/filePreviewUrl"; + Map params = new HashMap(); + try { + params.put("sid", me.getSessionId()); + //文件DC + params.put("sourceDc", sourceDc); + //文件是否允许复制 + params.put("isCopy", isCopy); + params.put("isPDFCovertPNG", "0"); + ro = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, params); + } catch (Exception e) { + e.printStackTrace(); + ro.err(e.getMessage()); + } + } + return ro; + } + + + @Override + public boolean downloadValidate(Map param) { + DCContext context = (DCContext) param.get("DCContext"); + System.out.println("下载校验--" + context.getPath() + context.getFileName()); + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/HotspotFileProcessor.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/HotspotFileProcessor.java new file mode 100644 index 00000000..220e54ad --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/HotspotFileProcessor.java @@ -0,0 +1,72 @@ +package com.actionsoft.apps.kms.dc; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.dao.HotspotDefDao; +import com.actionsoft.apps.kms.model.HotspotDefModel; +import com.actionsoft.apps.processon.posreader.PosReader; +import com.actionsoft.apps.processon.posreader.model.Document; +import com.actionsoft.bpms.server.fs.AbstFileProcessor; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.FileProcessorListener; +import com.actionsoft.bpms.server.fs.dc.DCMessage; +import com.actionsoft.bpms.util.UtilFile; +import com.actionsoft.exception.AWSException; + +public class HotspotFileProcessor extends AbstFileProcessor implements FileProcessorListener { + + @Override + public boolean uploadReady(Map param) { + DCContext dcContext = (DCContext) param.get("DCContext"); + String fileName = dcContext.getFileName(); + HotspotDefDao hotspotDefDao = new HotspotDefDao(); + List hotspotDefModels = hotspotDefDao.query(HotspotDefModel.HOTSPOTNAME + " = ?", new Object[] { fileName }).list(); + if (hotspotDefModels != null && hotspotDefModels.size() > 0) { + // 返回状态 + dcContext.getDCMessage(); + dcContext.setDCMessage(DCMessage.ERROR, "不能上传重名文件"); + return false; + } + return true; + + } + + @Override + public void uploadSuccess(Map param) { + super.uploadSuccess(param); + + // 判断是否已经上传过该文件(根据文件内容的meta的id判断) + DCContext dcContext = (DCContext) param.get("DCContext"); + UtilFile posFile = new UtilFile(dcContext.getFilePath()); + + PosReader reader = new PosReader(); + Document document = null; + try { + document = reader.read(posFile.readStr(StandardCharsets.UTF_8.name())); + } catch (Exception e) { + e.printStackTrace(); + } + if (document == null) { + // 先删除文件再返回异常 + dcContext.delete(); + // 返回状态 + dcContext.getDCMessage().addAttr("hotspotResult", "文件解析错误,请检查知识地图版本是否正确"); + throw new AWSException("文件解析错误,请检查知识地图版本是否正确"); + } + + HotspotDefDao hotspotDefDao = new HotspotDefDao(); + List hotspotDefModels = hotspotDefDao.query(HotspotDefModel.HOTSPOTMETAID + " = ?", new Object[] { document.getMeta().getId() }).list(); + if (hotspotDefModels != null && hotspotDefModels.size() > 0) { + // 先删除文件再返回异常 + dcContext.delete(); + // 返回状态 + dcContext.getDCMessage().addAttr("hotspotResult", "不能上传重复文件(重命名文件视为一个文件)"); + throw new AWSException("不能上传重复文件(重命名文件视为一个文件)"); + } + // 返回hotspotMetaId + dcContext.getDCMessage().addAttr("hotspotMetaId", document.getMeta().getId()); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/OnlinedocFileProcessor.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/OnlinedocFileProcessor.java new file mode 100644 index 00000000..c7915914 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/OnlinedocFileProcessor.java @@ -0,0 +1,8 @@ +package com.actionsoft.apps.kms.dc; + +import com.actionsoft.bpms.server.fs.AbstFileProcessor; +import com.actionsoft.bpms.server.fs.FileProcessorListener; + +public class OnlinedocFileProcessor extends AbstFileProcessor implements FileProcessorListener { + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/TmpFileProcessor.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/TmpFileProcessor.java new file mode 100644 index 00000000..c7d9cfa6 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/dc/TmpFileProcessor.java @@ -0,0 +1,18 @@ +package com.actionsoft.apps.kms.dc; + +import com.actionsoft.bpms.server.fs.AbstFileProcessor; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.FileProcessorListener; + +import java.util.Map; + +public class TmpFileProcessor extends AbstFileProcessor implements FileProcessorListener { + @Override + public boolean downloadValidate(Map param) { + DCContext context = (DCContext) param.get("DCContext"); + System.out.println("下载校验--" + context.getPath() + context.getFileName()); + return true; + } + + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyBeforeComplete.java new file mode 100644 index 00000000..0ba49629 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyBeforeComplete.java @@ -0,0 +1,29 @@ +package com.actionsoft.apps.kms.event.borrow; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.sdk.local.SDK; + +/** + * 借阅申请任务完成前事件 + * + * @author wangshibao + * + */ +public class ApplyBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "作废")) { + String processInstId = pec.getProcessInstance().getId(); + // 更新bo状态为作废 + String sqlBO = "UPDATE " + KMSConstant.BO_ENTITY_NAME_BORROW + " SET STATUS = '作废' WHERE BINDID = ?"; + DBSql.update(sqlBO, new Object[] { processInstId }); + } + + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyFormAfterLoad.java new file mode 100644 index 00000000..aec18668 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ApplyFormAfterLoad.java @@ -0,0 +1,19 @@ +package com.actionsoft.apps.kms.event.borrow; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; + +/** + * 借阅申请表单加载后事件 + * + * @author wangshibao + * + */ +public class ApplyFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + KMSUtil.commonFormAfterLoad(pec); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingAfterCreate.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingAfterCreate.java new file mode 100644 index 00000000..992057a8 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingAfterCreate.java @@ -0,0 +1,23 @@ +package com.actionsoft.apps.kms.event.borrow; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.util.DBSql; + +/*** + * 借阅审批任务创建后事件 + * + * @author wangshibao + * + */ +public class ExaminingAfterCreate extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + // 修改状态为"审批中" + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_BORROW + " SET STATUS = '审批中' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingBeforeComplete.java new file mode 100644 index 00000000..bf1e745d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingBeforeComplete.java @@ -0,0 +1,30 @@ +package com.actionsoft.apps.kms.event.borrow; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.sdk.local.SDK; + +/** + * 借阅审批任务完成前事件 + * + * @author wangshibao + * + */ +public class ExaminingBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + // 修改状态 + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "不同意")) { + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_BORROW + " SET STATUS = '不同意', READTIMES = 0 WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + } else if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "同意")) { + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_BORROW + " SET STATUS = '同意', READTIMES = 0 WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + } + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingFormAfterLoad.java new file mode 100644 index 00000000..e396374b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/borrow/ExaminingFormAfterLoad.java @@ -0,0 +1,32 @@ +package com.actionsoft.apps.kms.event.borrow; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; + +/** + * 借阅审批表单加载后事件 + * + * @author wangshibao + * + */ +public class ExaminingFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + // 查询文件列表 + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + String cardId = bo.getString("CARDID"); + + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + + KMSUtil.commonFormAfterLoad(pec); + KMSUtil.browseFormAfterLoad(pec); + macroLibraries.put("CARDID", cardId); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyBeforeComplete.java new file mode 100644 index 00000000..1d56ada8 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyBeforeComplete.java @@ -0,0 +1,29 @@ +package com.actionsoft.apps.kms.event.cancelpublish; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.sdk.local.SDK; + +/** + * 取消发布申请任务完成前事件 + * + * @author wangshibao + * + */ +public class ApplyBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "作废")) { + String processInstId = pec.getProcessInstance().getId(); + // 更新bo状态为作废 + String sqlBO = "UPDATE " + KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH + " SET STATUS = '作废' WHERE BINDID = ?"; + DBSql.update(sqlBO, new Object[] { processInstId }); + } + + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyFormAfterLoad.java new file mode 100644 index 00000000..6c7f0d29 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ApplyFormAfterLoad.java @@ -0,0 +1,28 @@ +package com.actionsoft.apps.kms.event.cancelpublish; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; + +/** + * 取消发布申请表单加载后事件 + * + * @author wangshibao + * + */ +public class ApplyFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + KMSUtil.commonFormAfterLoad(pec); + KMSUtil.browseFormAfterLoad(pec); + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + String cardId = bo.getString("CARDID"); + macroLibraries.put("CARDID", cardId); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingAfterCreate.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingAfterCreate.java new file mode 100644 index 00000000..a3bce387 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingAfterCreate.java @@ -0,0 +1,23 @@ +package com.actionsoft.apps.kms.event.cancelpublish; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.util.DBSql; + +/** + * 取消发布流程任务创建后事件 + * + * @author wangshibao + * + */ +public class ExaminingAfterCreate extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + // 修改状态为"审批中" + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH + " SET STATUS = '审批中' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingBeforeComplete.java new file mode 100644 index 00000000..998b5b26 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingBeforeComplete.java @@ -0,0 +1,71 @@ +package com.actionsoft.apps.kms.event.cancelpublish; + +import java.sql.Connection; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.kms.service.PublishService; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; + +/** + * 取消发布审批任务完成前事件 + * + * @author wangshibao + * + */ +public class ExaminingBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + // 修改状态 + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "同意")) { + boolean isInTx = false;// 标识是否当前方法打开的事务 + Connection conn = null; + try { + if (!LocalTxManager.getInstance().inTransaction()) { + LocalTxManager.getInstance().begin(); + isInTx = true; + } + conn = DBSql.open(); + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH + " SET STATUS = '同意' WHERE BINDID = ?"; + DBSql.update(conn, sql, new Object[] { pec.getProcessInstance().getId() }); + + // 删除发布信息 + String publishId = (String) SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH).detailByBindId(pec.getProcessInstance().getId(), "PUBLISHID"); + PublishService publishService = new PublishService(); + boolean result = publishService.delete(conn, publishId); + if (!result) { + throw new AWSException("删除知识发布信息失败"); + } else { + // 判断并修改知识的发布状态 + CardService cardService = new CardService(); + String cardId = (String) SDK.getBOAPI().getByProcess(KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH, pec.getProcessInstance().getId(), "CARDID"); + cardService.updateCardIsPublishedStatus(conn, cardId); + // 判断并删除全文检索 + publishService.deleteFullSearch(cardId); + } + if (isInTx) { + LocalTxManager.getInstance().commit(); + } + } catch (Exception e) { + if (isInTx) { + LocalTxManager.getInstance().rollback(); + } + e.printStackTrace(); + throw e; + } finally { + DBSql.close(conn); + } + } else if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "不同意")) { + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH + " SET STATUS = '不同意' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + } + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingFormAfterLoad.java new file mode 100644 index 00000000..c186668f --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/cancelpublish/ExaminingFormAfterLoad.java @@ -0,0 +1,32 @@ +package com.actionsoft.apps.kms.event.cancelpublish; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; + +/** + * 取消发布审批表单加载后事件 + * + * @author wangshibao + * + */ +public class ExaminingFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + // 查询文件列表 + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + String cardId = bo.getString("CARDID"); + + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + + KMSUtil.commonFormAfterLoad(pec); + KMSUtil.browseFormAfterLoad(pec); + macroLibraries.put("CARDID", cardId); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyBeforeComplete.java new file mode 100644 index 00000000..51c10c7a --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyBeforeComplete.java @@ -0,0 +1,55 @@ +package com.actionsoft.apps.kms.event.publish; + +import java.util.ArrayList; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; + +/** + * 发布申请任务完成前事件 + * + * @author wangshibao + * + */ +public class ApplyBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "作废")) { + String processInstId = pec.getProcessInstance().getId(); + // 更新bo状态为作废 + String sqlBO = "UPDATE " + KMSConstant.BO_ENTITY_NAME_PUBLISH + " SET STATUS = '作废' WHERE BINDID = ?"; + DBSql.update(sqlBO, new Object[] { processInstId }); + // 删除临时publish信息 + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).detailByBindId(processInstId); + String publishIds = bo.getString("PUBLISHIDS"); + List publishIdList = JSONArray.parseArray(publishIds, String.class); + + String sql = "DELETE FROM " + KMSConstant.ENTITY_NAME_PUBLISH + " WHERE " + PublishModel.ID + " IN ("; + List params = new ArrayList<>(); + for (String publishId : publishIdList) { + sql += "?,"; + params.add(publishId); + } + sql = sql.substring(0, sql.length() - 1); + sql += ")"; + DBSql.update(sql, params.toArray()); + + // 更新缓存 + for (String publishId : publishIdList) { + PublishCache.getCache().remove(publishId); + } + } + + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyFormAfterLoad.java new file mode 100644 index 00000000..68638c1e --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ApplyFormAfterLoad.java @@ -0,0 +1,50 @@ +package com.actionsoft.apps.kms.event.publish; + +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; +import com.actionsoft.bpms.util.UtilString; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 发布申请表单加载后事件 + * + * @author wangshibao + * + */ +public class ApplyFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + KMSUtil.commonFormAfterLoad(pec); + KMSUtil.browseFormAfterLoad(pec); + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + if (bo != null) { + String cardIds = bo.getString("CARDIDS"); + if (UtilString.isNotEmpty(cardIds)) { + List cardIdList = JSONArray.parseArray(cardIds, String.class); + JSONArray cardInfoJA = new JSONArray(); + for (String cardId : cardIdList) { + JSONObject cardInfoJO = new JSONObject(); + cardInfoJO.put("cardId", cardId); + CardModel cardModel = CardCache.getCache().get(cardId); + cardInfoJO.put("cardName", cardModel == null ? "知识不存在" : cardModel.getCardName()); + + cardInfoJA.add(cardInfoJO); + } + macroLibraries.put("cardInfoJA", cardInfoJA.toString()); + } else { + macroLibraries.put("cardInfoJA", ""); + } + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingAfterCreate.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingAfterCreate.java new file mode 100644 index 00000000..d9441459 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingAfterCreate.java @@ -0,0 +1,48 @@ +package com.actionsoft.apps.kms.event.publish; + +import java.util.Iterator; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.util.DBSql; +import com.alibaba.fastjson.JSONObject; + +/** + * 发布审批任务创建后事件 + * + * @author wangshibao + * + */ +public class ExaminingAfterCreate extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + String processInstId = pec.getProcessInstance().getId(); + // 修改BO状态为"审批中" + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_PUBLISH + " SET STATUS = '审批中' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { processInstId }); + // 修改publish状态为审批中 + JSONObject examineInfoJO1 = new JSONObject(); + examineInfoJO1.put("processInstId", processInstId); + examineInfoJO1.put("status", "申请中"); + JSONObject examineInfoJO2 = new JSONObject(); + examineInfoJO2.put("processInstId", processInstId); + examineInfoJO2.put("status", "审批中"); + + String tempPublishSql = "UPDATE " + KMSConstant.ENTITY_NAME_PUBLISH + " SET " + PublishModel.EXAMINEINFO + " =? WHERE " + PublishModel.EXAMINEINFO + " LIKE ?"; + DBSql.update(tempPublishSql, new Object[] { examineInfoJO2.toString(), "%" + processInstId + "%" }); + // 更新publish缓存 + Iterator publishIterator = PublishCache.getCache().iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getExamineInfo() != null && publishModel.getExamineInfo().contains(processInstId)) { + publishModel.setExamineInfo(examineInfoJO2.toString()); + PublishCache.getCache().put(publishModel.getId(), publishModel); + } + } + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingBeforeComplete.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingBeforeComplete.java new file mode 100644 index 00000000..8e59189a --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingBeforeComplete.java @@ -0,0 +1,81 @@ +package com.actionsoft.apps.kms.event.publish; + +import java.util.Iterator; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener; +import com.actionsoft.bpms.bpmn.engine.listener.InterruptListenerInterface; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 发布审批任务完成前事件 + * + * @author wangshibao + * + */ +public class ExaminingBeforeComplete extends InterruptListener implements InterruptListenerInterface { + + @Override + public boolean execute(ProcessExecutionContext pec) throws Exception { + String processInstId = pec.getProcessInstance().getId(); + if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "同意")) { + // 修改BO状态 + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_PUBLISH + " SET STATUS = '同意' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { processInstId }); + // 删除临时发布的publish数据 + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).detailByBindId(processInstId); + String tempPublishSql = "DELETE FROM " + KMSConstant.ENTITY_NAME_PUBLISH + " WHERE " + PublishModel.EXAMINEINFO + " LIKE ?"; + DBSql.update(tempPublishSql, new Object[] { "%" + processInstId + "%" }); + // 更新publish缓存 + Iterator publishIterator = PublishCache.getCache().iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getExamineInfo() != null && publishModel.getExamineInfo().contains(processInstId)) { + PublishCache.getCache().remove(publishModel.getId()); + } + } + // 发布 + JSONArray publishCardJA = JSONArray.parseArray(bo.getString("CARDIDS")); + JSONArray publishDimensionJA = new JSONArray(); + publishDimensionJA.add(bo.getString("DIMENSIONID")); + JSONObject schemaMetaDataJO = JSONObject.parseObject(bo.getString("SCHEMAMETADATA")); + String tags = bo.getString("TAGS"); + String publishMemo = bo.getString("PUBLISHMEMO"); + CardService cardService = new CardService(); + + JSONObject examineInfoJO3 = new JSONObject(); + examineInfoJO3.put("processInstId", processInstId); + examineInfoJO3.put("status", "同意"); + cardService.publishCard(UserContext.fromUID(bo.getString("APPLYUSER")), publishCardJA, publishDimensionJA, schemaMetaDataJO, tags, publishMemo, examineInfoJO3.toString()); + + } else if (SDK.getTaskAPI().isChoiceActionMenu(pec.getTaskInstance(), "不同意")) { + String sql = "UPDATE " + KMSConstant.BO_ENTITY_NAME_PUBLISH + " SET STATUS = '不同意' WHERE BINDID = ?"; + DBSql.update(sql, new Object[] { pec.getProcessInstance().getId() }); + // 修改publish表的发布信息 + JSONObject examineInfoJO3 = new JSONObject(); + examineInfoJO3.put("processInstId", processInstId); + examineInfoJO3.put("status", "不同意"); + String tempPublishSql = "UPDATE " + KMSConstant.ENTITY_NAME_PUBLISH + " SET " + PublishModel.EXAMINEINFO + " =? WHERE " + PublishModel.EXAMINEINFO + " LIKE ?"; + DBSql.update(tempPublishSql, new Object[] { examineInfoJO3.toString(), "%" + processInstId + "%" }); + // 更新publish缓存 + Iterator publishIterator = PublishCache.getCache().iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getExamineInfo() != null && publishModel.getExamineInfo().contains(processInstId)) { + publishModel.setExamineInfo(examineInfoJO3.toString()); + PublishCache.getCache().put(publishModel.getId(), publishModel); + } + } + } + return true; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingFormAfterLoad.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingFormAfterLoad.java new file mode 100644 index 00000000..e676bf7b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/event/publish/ExaminingFormAfterLoad.java @@ -0,0 +1,44 @@ +package com.actionsoft.apps.kms.event.publish; + +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext; +import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener; +import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 发布审批表单加载后事件 + * + * @author wangshibao + * + */ +public class ExaminingFormAfterLoad extends ExecuteListener { + + @Override + public void execute(ProcessExecutionContext pec) throws Exception { + KMSUtil.commonFormAfterLoad(pec); + KMSUtil.browseFormAfterLoad(pec); + Map macroLibraries = pec.getParameterOfMap(ListenerConst.FORM_EVENT_PARAM_TAGS); + BO bo = (BO) pec.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA); + String cardIds = bo.getString("CARDIDS"); + List cardIdList = JSONArray.parseArray(cardIds, String.class); + JSONArray cardInfoJA = new JSONArray(); + for (String cardId : cardIdList) { + JSONObject cardInfoJO = new JSONObject(); + cardInfoJO.put("cardId", cardId); + CardModel cardModel = CardCache.getCache().get(cardId); + cardInfoJO.put("cardName", cardModel == null ? "知识不存在" : cardModel.getCardName()); + + cardInfoJA.add(cardInfoJO); + } + macroLibraries.put("cardInfoJA", cardInfoJA.toString()); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSNotificationFormatter.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSNotificationFormatter.java new file mode 100644 index 00000000..997de356 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSNotificationFormatter.java @@ -0,0 +1,48 @@ +package com.actionsoft.apps.kms.formatter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.client.notification.NotificationMessageFormatter; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +public class KMSNotificationFormatter implements NotificationMessageFormatter { + /** + * KMS阅读邀请:当用户接收到提醒窗口或在通知中心点击通知条目时被触发,格式化通知的内容 + * + * @param userContext 通知查看人 + * @param content 发送的原始内容 + * @return ResponseObject,包含content和buttons两个变量 + */ + @Override public ResponseObject parser(UserContext userContext, String content) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject contentJO = JSONObject.parseObject(content); + String cardId = contentJO.getString("cardId"); + String dimensionId = contentJO.getString("dimensionId"); + String inviteUser = contentJO.getString("inviteUser"); + String cardName = contentJO.getString("cardName"); + ro.put("content", inviteUser + "邀请您阅读知识:" + cardName); + List> buttons = new ArrayList<>(); + if (!userContext.isMobileClient()){ + Map button = new HashMap<>(); + button.put("name", "阅读知识"); + button.put("target", "side");// 新窗口,不常用。只允许四个常量:_blank/mainFrame/ajax/app + button.put("action", "./w?sid=" + userContext.getSessionId() + "&cmd=com.actionsoft.apps.kms_knwl_center_browse_card_page&dimensionId="+dimensionId+"&cardId=" + cardId + "&isPage=true"); + + button.put("color", "blue");// 只允许三个常量:blue/white/red + button.put("functionId", SDK.getAppAPI().getAppContext(KMSConstant.APP_ID).getId()); + button.put("functionName", "浏览知识"); + buttons.add(button); + } + + ro.put("buttons", buttons); + return ro; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSReportFormatter.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSReportFormatter.java new file mode 100644 index 00000000..f7b60846 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/formatter/KMSReportFormatter.java @@ -0,0 +1,48 @@ +package com.actionsoft.apps.kms.formatter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.bpms.client.notification.NotificationMessageFormatter; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +public class KMSReportFormatter implements NotificationMessageFormatter { + /** + * KMS阅读邀请:当用户接收到提醒窗口或在通知中心点击通知条目时被触发,格式化通知的内容 + * + * @param userContext 通知查看人 + * @param content 发送的原始内容 + * @return ResponseObject,包含content和buttons两个变量 + */ + @Override public ResponseObject parser(UserContext userContext, String content) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject contentJO = JSONObject.parseObject(content); + String cardId = contentJO.getString("cardId"); + String reportUser = contentJO.getString("reportUser"); + String cardName = contentJO.getString("cardName"); + String reportContent = contentJO.getString("reportContent"); + ro.put("content", "来自" + reportUser + "的关于知识[" + cardName + "]的反馈:" + reportContent); + List> buttons = new ArrayList<>(); + if (!userContext.isMobileClient()){ + Map button = new HashMap<>(); + button.put("name", "查看知识"); + button.put("target", "mainFrame");// 新窗口,不常用。只允许四个常量:_blank/mainFrame/ajax/app + button.put("action", "./w?sid=" + userContext.getSessionId() + "&cmd=com.actionsoft.apps.kms_knwl_center_browse_card_page&cardId=" + cardId); + + button.put("color", "blue");// 只允许三个常量:blue/white/red + button.put("functionId", SDK.getAppAPI().getAppContext(KMSConstant.APP_ID).getId()); + button.put("functionName", "浏览知识"); + buttons.add(button); + } + + ro.put("buttons", buttons); + return ro; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/BorrowerExamineHP.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/BorrowerExamineHP.java new file mode 100644 index 00000000..6792d066 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/BorrowerExamineHP.java @@ -0,0 +1,33 @@ +package com.actionsoft.apps.kms.humanperformer; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.model.def.UserTaskModel; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.TaskInstance; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerAbst; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerInterface; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; + +/** + * 借阅流程-审批的参与者实现 + * + * @author wangshibao + */ +public class BorrowerExamineHP extends HumanPerformerAbst implements HumanPerformerInterface { + + @Override + public String getHumanPerformer(UserContext me, ProcessInstance processInstance, TaskInstance taskInstance, UserTaskModel userTaskModel, Map params) { + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).detailByBindId(processInstance.getId()); + return new DimensionService().getDimensionAdmin(bo.getString("DIMENSIONID")); + } + + @Override + public String getSetting(UserContext arg0, Map arg1) { + return null; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/CancelPublishExamineHP.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/CancelPublishExamineHP.java new file mode 100644 index 00000000..496d1f17 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/CancelPublishExamineHP.java @@ -0,0 +1,33 @@ +package com.actionsoft.apps.kms.humanperformer; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.model.def.UserTaskModel; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.TaskInstance; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerAbst; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerInterface; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; + +/** + * 发布流程-审批的参与者实现 + * + * @author wangshibao + */ +public class CancelPublishExamineHP extends HumanPerformerAbst implements HumanPerformerInterface { + + @Override + public String getHumanPerformer(UserContext me, ProcessInstance processInstance, TaskInstance taskInstance, UserTaskModel userTaskModel, Map params) { + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH).detailByBindId(processInstance.getId()); + return new DimensionService().getDimensionAdmin(bo.getString("DIMENSIONID")); + } + + @Override + public String getSetting(UserContext arg0, Map arg1) { + return null; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/PublishExamineHP.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/PublishExamineHP.java new file mode 100644 index 00000000..5e8461a9 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/humanperformer/PublishExamineHP.java @@ -0,0 +1,33 @@ +package com.actionsoft.apps.kms.humanperformer; + +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.model.def.UserTaskModel; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.TaskInstance; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerAbst; +import com.actionsoft.bpms.bpmn.engine.performer.HumanPerformerInterface; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; + +/** + * 发布流程-审批的参与者实现 + * + * @author wangshibao + */ +public class PublishExamineHP extends HumanPerformerAbst implements HumanPerformerInterface { + + @Override + public String getHumanPerformer(UserContext me, ProcessInstance processInstance, TaskInstance taskInstance, UserTaskModel userTaskModel, Map params) { + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).detailByBindId(processInstance.getId()); + return new DimensionService().getDimensionAdmin(bo.getString("DIMENSIONID")); + } + + @Override + public String getSetting(UserContext arg0, Map arg1) { + return null; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/FullsearchCreatedByFile.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/FullsearchCreatedByFile.java new file mode 100644 index 00000000..b1d61f9d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/FullsearchCreatedByFile.java @@ -0,0 +1,316 @@ +package com.actionsoft.apps.kms.job; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.schedule.IJob; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.file.ReadDCFile; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilFile; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 全文检索入库 + * + * @author wangshibao + */ +public class FullsearchCreatedByFile implements IJob { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + AppContext kmsApp = SDK.getAppAPI().getAppContext(KMSConstant.APP_ID); + FileCache fileCache = FileCache.getCache(); + CardCache cardCache = CardCache.getCache(); + CardService cardService = new CardService(); + //知识卡片入库 + Iterator cardIterator = cardCache.iterator(); + CardDao cardDao = new CardDao(); + JSONArray contents = new JSONArray(); + List cardModelList = new ArrayList(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardModel.getIsPublished() == 1 && cardModel.getIsFullSearch() == 0) { + cardModelList.add(cardModel); + JSONObject json = new JSONObject(); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + json.put("documentId", cardModel.getId()); + json.put("content", "");//信息附件 + json.put("abstract", cardContext);//信息摘要 + json.put("title", cardModel.getCardName());//信息标题 + json.put("createTime", UtilDate.datetimeFormat(cardModel.getCreateTime())); + contents.add(json); + } + } + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/createIndexesByContent"; + Map params = new HashMap(); + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX_CARD); + params.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE_CARD); + params.put("contents", contents); + AppAPI appAPI = SDK.getAppAPI(); + ResponseObject resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + if (!resultRO.isOk()) { + System.err.println("入库知识卡片时发生错误:" + resultRO.getMsg()); + SDK.getAppAPI().info(kmsApp, "---------入库全文检索时发生错误:" + resultRO.getMsg() + "---------"); + } else { + for (CardModel cardModel : cardModelList) { + cardModel.setIsFullSearch(1); + cardDao.update(cardModel); + } + } + Iterator fileIterator = fileCache.iterator(); + + // key:fileId File:解密后的文件 + Map targetFileMap = new HashMap<>(); + JSONObject fileNames = new JSONObject(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (fileModel != null) { + if (fileModel.getIsFullsearch() == 0 && !fileModel.getFileName().contains("processInstId")) {// 未入库的文件//流程链接不入库 + CardModel cardModel = cardCache.get(fileModel.getCardId()); + if (cardModel != null && cardModel.getIsPublished() == 1) {// 已发布的知识 + File targetFile = null; + try { + /* 开始入库操作 */ + // 1、构建文件DC + DCContext dcContext = new DCContext(UserContext.fromUID("admin"), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + + // 2、解密到tmp目录 + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp" + File.separator + cardModel.getId() + File.separator + fileModel.getId() + File.separator;// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + File targetFileDir = new File(targetDir); + if (!targetFileDir.exists()) { + targetFileDir.mkdirs(); + } + String newFileName = KMSUtil.toDigestUTF8(fileModel.getFileName()) + "." + fileModel.getFileName().substring(fileModel.getFileName().lastIndexOf(".") + 1); + targetFile = new File(targetDir + newFileName);// 名字不带版本号 + if (!targetFile.exists()) { + targetFile.createNewFile(); + } + OutputStream out = new FileOutputStream(targetFile); + try { + ReadDCFile.getInstance().read(out, dcContext); + targetFileMap.put(fileModel.getId(), targetFile); + fileNames.put(newFileName, fileModel.getFileName()); + } catch (Exception e) { + if ((e instanceof FileNotFoundException) || (e.getMessage() != null && e.getMessage().contains("key does not exist"))) { + System.err.println("[" + fileModel.getCreateUser() + "]的文件[" + fileModel.getCardId() + "][" + fileModel.getFileName() + "]文件不存在"); + } else { + throw e; + } + } finally { + out.close(); + } + } catch (Exception e) { + System.err.println("[" + fileModel.getCreateUser() + "]的文件[" + fileModel.getFileName() + "]入库全文检索时发生错误"); + e.printStackTrace(); + } catch (Error e) { + System.err.println("[" + fileModel.getCreateUser() + "]的文件[" + fileModel.getFileName() + "]入库全文检索时发生错误"); + e.printStackTrace(); + } + + } + } + } + } + creatCardModelContentFile(cardCache, fileCache, targetFileMap, fileNames, cardService); + try { + Set fileIdSet = targetFileMap.keySet(); + if (fileIdSet.size() > 0) { + FileDao fileDao = new FileDao(); + JSONArray docPathJA = new JSONArray(); + for (String fileId : fileIdSet) { + FileModel fileModel = fileCache.get(fileId); + CardModel cardModel = null; + if (fileModel != null) { + cardModel = cardCache.get(fileModel.getCardId()); + } else { + cardModel = cardCache.get(fileId); + } + getCardData(cardService, targetFileMap, docPathJA, fileId, cardModel); + } + // 3、入库全文检索 + aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/createIndexesByFile"; + Map params1 = new HashMap(); + params1.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params1.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + params1.put("documentsPath", docPathJA.toString()); + params1.put("fileNames", fileNames.toString()); + resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params1); + if (!resultRO.isOk()) { + System.err.println("入库全文检索时发生错误:" + resultRO.getMsg()); + } else { + // 4、标记FileModel为已入库 + for (String fileId : fileIdSet) { + try { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel != null) { + fileModel.setIsFullsearch(1); + fileDao.update(fileModel); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + for (String fileId : fileIdSet) { + try { + File targetFile = targetFileMap.get(fileId); + // 5、删除tmp文件 + if (targetFile != null && targetFile.exists()) { + targetFile.delete(); + File parentFileValueDir = targetFile.getParentFile();// 四级存储,获取名称为后三位的父文件夹 + if (parentFileValueDir.list().length == 0) { + UtilFile.removeFile(parentFileValueDir); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public void getCardData(CardService cardService, Map targetFileMap, JSONArray docPathJA, String fileId, CardModel cardModel) { + JSONObject docInfo = new JSONObject(); + if (cardModel != null) { + String cardName = cardModel.getCardName(); + docInfo.put("cardName", cardName); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + docInfo.put("cardContent", cardContext); + } else { + docInfo.put("cardName", ""); + docInfo.put("cardContent", ""); + } + docInfo.put("documentPath", targetFileMap.get(fileId).getPath()); + docPathJA.add(docInfo); + } + + /** + * @Author hunter + * @Datetime 2020/11/11 18:47 + * @Param + * @Return void + * @Description Todo-hul 创建知识简介的临时文件 + **/ + public void creatCardModelContentFile(CardCache cardCache, FileCache fileCache, Map targetFileMap, JSONObject fileNames, CardService cardService) { + Iterator cardIterator = cardCache.iterator(); + Iterator fileModelIterator = fileCache.iterator(); + Map map = new HashMap(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + List arrayList = new ArrayList<>(); + if (fileModelIterator.hasNext()) { + while (fileModelIterator.hasNext()) { + FileModel fileModel = fileModelIterator.next(); + String cardId = fileModel.getCardId(); + arrayList.add(cardId); + } + } + if (arrayList.size() > 0) { + if (!arrayList.contains(cardModel.getId())) { + map.put(cardModel.getId(), cardModel); + } + } else { + map.put(cardModel.getId(), cardModel); + } + } + if (map.size() > 0) { + for (CardModel cardModel : map.values()) { + File targetFile = null; + String cardContext = cardModel.getCardContext(); + OutputStream out = null; + if (cardModel.getIsPublished() == 1) { + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + if (UtilString.isEmpty(cardContext)) { + return; + } + try { + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp" + File.separator + cardModel.getId() + File.separator + cardModel.getId() + File.separator;// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + File targetFileDir = new File(targetDir); + if (!targetFileDir.exists()) { + boolean mkdirs = targetFileDir.mkdirs(); + } + String newFileName = KMSUtil.toDigestUTF8(cardModel.getCardName()) + ".doc"; + targetFile = new File(targetDir + newFileName);// 名字不带版本号 + if (!targetFile.exists()) { + targetFile.createNewFile(); + } + + byte bytes[] = new byte[512]; + bytes = cardContext.getBytes(); + out = new FileOutputStream(targetFile); + out.write(bytes); + targetFileMap.put(cardModel.getId(), targetFile); + fileNames.put(newFileName, newFileName); + } catch (IOException e) { + System.err.println("[" + cardModel.getCreateUser() + "]创建的知识[" + cardModel.getCardName() + "],知识简介部分入库全文检索时发生错误"); + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + } + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReIndexFullsearch.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReIndexFullsearch.java new file mode 100644 index 00000000..35f76b45 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReIndexFullsearch.java @@ -0,0 +1,378 @@ +package com.actionsoft.apps.kms.job; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.io.IOUtils; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.kms.service.SearchService; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.schedule.IJob; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.dc.DCUtil; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilFile; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 重新初始索引 + * + * @author lishan + */ +public class ReIndexFullsearch implements IJob { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + //将app_act_kms_file是否索引字段改成否 + AppContext kmsApp = SDK.getAppAPI().getAppContext(KMSConstant.APP_ID); + String sql = "UPDATE APP_ACT_KMS_FILE SET ISFULLSEARCH = 0 "; + DBSql.update(sql); + sql = "UPDATE APP_ACT_KMS_CARD SET ISFULLSEARCH = 0 "; + DBSql.update(sql); + //重新加载缓存 + FileCache.getCache().reload(); + CardCache.getCache().reload(); + //删除索引 + SearchService searchService = new SearchService(); + System.err.println("删除KMS全部索引"); + searchService.deleteAllIndex(); + //重新建立索引 + FileCache fileCache = FileCache.getCache(); + CardCache cardCache = CardCache.getCache(); + CardService cardService = new CardService(); + //知识卡片入库 + Iterator cardIterator = cardCache.iterator(); + CardDao cardDao = new CardDao(); + JSONArray contents = new JSONArray(); + List cardModelList = new ArrayList(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardModel.getIsPublished() == 1 && cardModel.getIsFullSearch() == 0) { + cardModelList.add(cardModel); + JSONObject json = new JSONObject(); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + json.put("documentId", cardModel.getId()); + json.put("content", "");//信息附件 + json.put("abstract", cardContext);//信息摘要 + json.put("title", cardModel.getCardName());//信息标题 + json.put("createTime", UtilDate.datetimeFormat(cardModel.getCreateTime())); + contents.add(json); + } + } + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/createIndexesByContent"; + Map params = new HashMap(); + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX_CARD); + params.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE_CARD); + params.put("contents", contents); + AppAPI appAPI = SDK.getAppAPI(); + ResponseObject resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + if (!resultRO.isOk()) { + System.err.println("入库知识卡片时发生错误:" + resultRO.getMsg()); + SDK.getAppAPI().info(kmsApp, "---------入库全文检索时发生错误:" + resultRO.getMsg() + "---------"); + } else { + for (CardModel cardModel : cardModelList) { + cardModel.setIsFullSearch(1); + cardDao.update(cardModel); + } + } + Iterator fileIterator = fileCache.iterator(); + // key:fileId File:解密后的文件 + Map targetFileMap = new HashMap<>(); + JSONObject fileNames = new JSONObject(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (fileModel.getIsFullsearch() == 0 && fileModel.getFileState() == 1) {// 未入库的文件 + CardModel cardModel = cardCache.get(fileModel.getCardId()); + if (cardModel != null && cardModel.getIsPublished() == 1) {// 已发布的知识 + File targetFile = null; + try { + /* 开始入库操作 */ + // 1、构建文件DC + DCContext dcContext = new DCContext(UserContext.fromUID("admin"), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + + // 2、解密到tmp目录 + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp" + File.separator + cardModel.getId() + File.separator + fileModel.getId() + File.separator;// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + File targetFileDir = new File(targetDir); + if (!targetFileDir.exists()) { + targetFileDir.mkdirs(); + } + String newFileName = KMSUtil.toDigestUTF8(fileModel.getFileName()) + "." + fileModel.getFileName().substring(fileModel.getFileName().lastIndexOf(".") + 1); + targetFile = new File(targetDir + newFileName);// 名字不带版本号 + if (!targetFile.exists()) { + targetFile.createNewFile(); + } + OutputStream out = new FileOutputStream(targetFile); + InputStream in = DCUtil.decryptFile(dcContext); + try { + IOUtils.copy(in, out); + in.close(); + out.close(); + } finally { + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(out); + } + targetFileMap.put(fileModel.getId(), targetFile); + fileNames.put(newFileName, fileModel.getFileName()); + } catch (Exception e) { + System.err.println("[" + fileModel.getCreateUser() + "]的文件[" + fileModel.getFileName() + "]入库全文检索时发生错误"); + System.err.println("[知识ID:" + cardModel.getId() + "] [文件版本:" + fileModel.getFileVer() + "]"); + e.printStackTrace(); + } catch (Error e) { + System.err.println("[" + fileModel.getCreateUser() + "]的文件[" + fileModel.getFileName() + "]入库全文检索时发生错误"); + System.err.println("[知识ID:" + cardModel.getId() + "] [文件版本:" + fileModel.getFileVer() + "]"); + e.printStackTrace(); + } + + } + } + } + creatCardModelContentFile(cardCache, fileCache, targetFileMap, fileNames, cardService); + try { + Set fileIdSet = targetFileMap.keySet(); + if (fileIdSet.size() > 0) { + FileDao fileDao = new FileDao(); + JSONArray docPathJA = new JSONArray(); + for (String fileId : fileIdSet) { + FileModel fileModel = fileCache.get(fileId); + CardModel cardModel = null; + if (fileModel != null) { + cardModel = cardCache.get(fileModel.getCardId()); + } else { + cardModel = cardCache.get(fileId); + } + getCardData(cardService, targetFileMap, docPathJA, fileId, cardModel); + } + // 3、入库全文检索 + System.err.println("KMS全库初始化开始..."); + SDK.getAppAPI().info(kmsApp, "---------KMS全库初始化开始---------"); + aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/createIndexesByFile"; + Map params1 = new HashMap(); + params1.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params1.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + params1.put("documentsPath", docPathJA.toString()); + params1.put("fileNames", fileNames.toString()); + resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params1); + if (!resultRO.isOk()) { + System.err.println("入库全文检索时发生错误:" + resultRO.getMsg()); + SDK.getAppAPI().info(kmsApp, "---------入库全文检索时发生错误:" + resultRO.getMsg() + "---------"); + } else { + System.err.println("KMS全库初始化完成..."); + SDK.getAppAPI().info(kmsApp, "---------KMS全库初始化完成---------"); + // 4、标记FileModel为已入库 + for (String fileId : fileIdSet) { + try { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel != null) { + fileModel.setIsFullsearch(1); + fileDao.update(fileModel); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + for (String fileId : fileIdSet) { + try { + File targetFile = targetFileMap.get(fileId); + // 5、删除tmp文件 + if (targetFile != null && targetFile.exists()) { + targetFile.delete(); + File parentFileValueDir = targetFile.getParentFile();// 四级存储,获取名称为后三位的父文件夹 + if (parentFileValueDir.list().length == 0) { + UtilFile.removeFile(parentFileValueDir); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void getCardData(CardService cardService, Map targetFileMap, JSONArray docPathJA, String fileId, CardModel cardModel) { + JSONObject docInfo = new JSONObject(); + if (cardModel != null) { + String cardName = cardModel.getCardName(); + docInfo.put("cardName", cardName); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + docInfo.put("cardContent", cardContext); + } else { + docInfo.put("cardName", ""); + docInfo.put("cardContent", ""); + } + docInfo.put("documentPath", targetFileMap.get(fileId).getPath()); + docPathJA.add(docInfo); + } + + /** + * @Author hunter + * @Datetime 2020/11/11 18:47 + * @Param + * @Return void + * @Description Todo-hul 创建知识简介的临时文件 + **/ + public void creatCardModelContentFile(CardCache cardCache, FileCache fileCache, Map targetFileMap, JSONObject fileNames, CardService cardService) { + Iterator cardIterator = cardCache.iterator(); + Iterator fileModelIterator = fileCache.iterator(); + Map map = new HashMap(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + List arrayList = new ArrayList<>(); + if (fileModelIterator.hasNext()) { + while (fileModelIterator.hasNext()) { + FileModel fileModel = fileModelIterator.next(); + String cardId = fileModel.getCardId(); + arrayList.add(cardId); + } + } + if (arrayList.size() > 0) { + if (!arrayList.contains(cardModel.getId())) { + map.put(cardModel.getId(), cardModel); + } + } else { + map.put(cardModel.getId(), cardModel); + } + } + if (map.size() > 0) { + for (CardModel cardModel : map.values()) { + File targetFile = null; + String cardContext = cardModel.getCardContext(); + OutputStream out = null; + if (cardModel.getIsPublished() == 1) { + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + if (UtilString.isEmpty(cardContext)) { + return; + } + try { + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp" + File.separator + cardModel.getId() + File.separator + cardModel.getId() + File.separator;// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + File targetFileDir = new File(targetDir); + if (!targetFileDir.exists()) { + boolean mkdirs = targetFileDir.mkdirs(); + } + String newFileName = KMSUtil.toDigestUTF8(cardModel.getCardName()) + ".doc"; + targetFile = new File(targetDir + newFileName);// 名字不带版本号 + if (!targetFile.exists()) { + targetFile.createNewFile(); + } + + byte bytes[] = new byte[512]; + bytes = cardContext.getBytes(); + out = new FileOutputStream(targetFile); + out.write(bytes); + targetFileMap.put(cardModel.getId(), targetFile); + fileNames.put(newFileName, newFileName); + } catch (IOException e) { + System.err.println("[" + cardModel.getCreateUser() + "]创建的知识[" + cardModel.getCardName() + "],知识简介部分入库全文检索时发生错误"); + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + } + } + + public void notFileFullsearch(AppContext kmsApp) { + CardCache cardCache = CardCache.getCache(); + CardService cardService = new CardService(); + Iterator iterator = cardCache.iterator(); + JSONArray docPathJA = new JSONArray(); + AppAPI appAPI = SDK.getAppAPI(); + while (iterator.hasNext()) { + CardModel cardModel = iterator.next(); + JSONObject docInfo = new JSONObject(); + if (cardModel != null && cardModel.getIsPublished() == 1) { + String cardName = cardModel.getCardName(); + docInfo.put("cardName", cardName); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.getCardContent(dc); + cardContext = KMSUtil.getPlainText(cardContext); + cardContext = KMSUtil.replaceText(cardContext); + } + docInfo.put("cardContent", cardContext); + } else { + docInfo.put("cardName", ""); + docInfo.put("cardContent", ""); + } + docInfo.put("documentPath", ""); + docPathJA.add(docInfo); + System.err.println("KMS全库初正文始化开始..."); + SDK.getAppAPI().info(kmsApp, "---------KMS全库正文初始化开始---------"); + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/createIndexesByFile"; + Map params1 = new HashMap(); + params1.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params1.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + params1.put("documentsPath", docPathJA.toString()); + params1.put("fileNames", ""); + ResponseObject resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params1); + if (!resultRO.isOk()) { + System.err.println("正文入库全文检索时发生错误:" + resultRO.getMsg()); + SDK.getAppAPI().info(kmsApp, "---------正文入库全文检索时发生错误:" + resultRO.getMsg() + "---------"); + } else { + System.err.println("KMS全库正文初始化完成..."); + SDK.getAppAPI().info(kmsApp, "---------KMS全库正文初始化完成---------"); + } + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReloadCache.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReloadCache.java new file mode 100644 index 00000000..d71007c5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/job/ReloadCache.java @@ -0,0 +1,40 @@ +package com.actionsoft.apps.kms.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.HotspotCache; +import com.actionsoft.apps.kms.cache.MetaAttrCache; +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.cache.MetaSchemaCache; +import com.actionsoft.apps.kms.cache.OptCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.cache.VersionCache; +import com.actionsoft.bpms.schedule.IJob; + +/** + * 同步将数据库和缓存(数据库操作使用了事务,预防某些异常导致的数据库和缓存不同步) + * + * @author wangshibao + * + */ +public class ReloadCache implements IJob { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + CardCache.getCache().reload(); + DimensionCache.getCache().reload(); + PublishCache.getCache().reload(); + FileCache.getCache().reload(); + HotspotCache.getCache().reload(); + MetaSchemaCache.getCache().reload(); + MetaAttrCache.getCache().reload(); + MetaDataCache.getCache().reload(); + OptCache.getCache().reload(); + VersionCache.getCache().reload(); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/CardModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/CardModel.java new file mode 100644 index 00000000..cf11391b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/CardModel.java @@ -0,0 +1,209 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Date; +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 知识 + * + * @author wangshibao + */ +public class CardModel extends ModelBean implements IModelBean { + + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDNAME = "CARDNAME"; + public static final String CARDTYPE = "CARDTYPE"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String CREATETIME = "CREATETIME"; + public static final String LASTUPDATE = "LASTUPDATE"; + public static final String READCOUNT = "READCOUNT"; + public static final String ONLINELEVEL = "ONLINELEVEL"; + public static final String SECURITYLEVEL = "SECURITYLEVEL"; + public static final String ISPUBLISHED = "ISPUBLISHED"; + public static final String VALIDDATE = "VALIDDATE"; + public static final String ISCOMMENT = "ISCOMMENT"; + public static final String ISRATE = "ISRATE"; + public static final String CARDCONTEXT = "CARDCONTEXT"; + public static final String ISFULLSEARCH = "ISFULLSEARCH"; + public static final String EXTERNALURL = "EXTERNALURL"; + public static final String EXTPARAMS = "EXTPARAMS"; + + private String id; + private String cardName; + private int cardType; + private String createUser; + private Timestamp createTime; + private Timestamp lastUpdate; + private long readCount; + private int onlineLevel; + private int securityLevel; + private int isPublished; + private int isFullSearch; + private Date validDate; + private int isComment; + private int isRate; + private String externalUrl; + private String extParams; + private int commentCount;// 内存使用,不存入数据库 + + public double getRateScore() { + return rateScore; + } + + public void setRateScore(double rateScore) { + this.rateScore = rateScore; + } + + private double rateScore;// 内存使用,不存入数据库 + + public String getCardContext() { + return cardContext; + } + + public void setCardContext(String cardContext) { + this.cardContext = cardContext; + } + + private String cardContext; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardName() { + return cardName; + } + + public void setCardName(String cardName) { + this.cardName = cardName; + } + + public int getCardType() { + return cardType; + } + + public void setCardType(int cardType) { + this.cardType = cardType; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public Timestamp getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Timestamp lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public long getReadCount() { + return readCount; + } + + public void setReadCount(long readCount) { + this.readCount = readCount; + } + + public int getOnlineLevel() { + return onlineLevel; + } + + public void setOnlineLevel(int onlineLevel) { + this.onlineLevel = onlineLevel; + } + + public int getSecurityLevel() { + return securityLevel; + } + + public void setSecurityLevel(int securityLevel) { + this.securityLevel = securityLevel; + } + + public int getIsPublished() { + return isPublished; + } + + public void setIsPublished(int isPublished) { + this.isPublished = isPublished; + } + + public int getIsFullSearch() { + return isFullSearch; + } + + public void setIsFullSearch(int isFullSearch) { + this.isFullSearch = isFullSearch; + } + + public Date getValidDate() { + return validDate; + } + + public void setValidDate(Date validDate) { + this.validDate = validDate; + } + + public int getIsComment() { + return isComment; + } + + public void setIsComment(int isComment) { + this.isComment = isComment; + } + + public int getCommentCount() { + return commentCount; + } + + public void setCommentCount(int commentCount) { + this.commentCount = commentCount; + } + + public int getIsRate() { + return isRate; + } + + public void setIsRate(int isRate) { + this.isRate = isRate; + } + + public String getExternalUrl() { + return externalUrl; + } + + public void setExternalUrl(String externalUrl) { + this.externalUrl = externalUrl; + } + + public String getExtParams() { + return extParams; + } + + public void setExtParams(String extParams) { + this.extParams = extParams; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/DimensionModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/DimensionModel.java new file mode 100644 index 00000000..f9ae0084 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/DimensionModel.java @@ -0,0 +1,173 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 维度 + * + * 将String类的null值处理为"" + * + * @author wangshibao + */ +public class DimensionModel extends ModelBean implements IModelBean, Cloneable { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String DIMENSIONNAME = "DIMENSIONNAME"; + public static final String PARENTID = "PARENTID"; + public static final String SHOWTYPE = "SHOWTYPE"; + public static final String ISEXAMINE = "ISEXAMINE"; + public static final String MEMO = "MEMO"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String CREATETIME = "CREATETIME"; + public static final String LASTUPDATE = "LASTUPDATE"; + public static final String HOTSPOTDEFID = "HOTSPOTDEFID"; + public static final String ISENABLED = "ISENABLED"; + public static final String ORDERINDEX = "ORDERINDEX"; + + private String id; + private String dimensionName; + private String parentId; + private int showType; + private int isExamine; + private String memo; + private String createUser; + private Timestamp createTime; + private Timestamp lastUpdate; + private String hotspotDefId; + private int isEnabled; + private int orderIndex; + private boolean hasPerm = true;// 是否有权限,仅逻辑上使用,不存入数据库(默认有权限) + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDimensionName() { + if (dimensionName == null) { + dimensionName = ""; + } + return dimensionName; + } + + public void setDimensionName(String dimensionName) { + this.dimensionName = dimensionName; + } + + public String getParentId() { + if (parentId == null) { + parentId = ""; + } + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public int getShowType() { + return showType; + } + + public void setShowType(int showType) { + this.showType = showType; + } + + public int getIsExamine() { + return isExamine; + } + + public void setIsExamine(int isExamine) { + this.isExamine = isExamine; + } + + public String getMemo() { + if (memo == null) { + memo = ""; + } + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getCreateUser() { + if (createUser == null) { + createUser = ""; + } + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public Timestamp getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Timestamp lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public String getHotspotDefId() { + if (hotspotDefId == null) { + hotspotDefId = ""; + } + return hotspotDefId; + } + + public void setHotspotDefId(String hotspotDefId) { + this.hotspotDefId = hotspotDefId; + } + + public int getIsEnabled() { + return isEnabled; + } + + public void setIsEnabled(int isEnabled) { + this.isEnabled = isEnabled; + } + + public int getOrderIndex() { + return orderIndex; + } + + public void setOrderIndex(int orderIndex) { + this.orderIndex = orderIndex; + } + + public boolean isHasPerm() { + return hasPerm; + } + + public void setHasPerm(boolean hasPerm) { + this.hasPerm = hasPerm; + } + + @Override + public DimensionModel clone() { + try { + return (DimensionModel) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/FileModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/FileModel.java new file mode 100644 index 00000000..53cbcf52 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/FileModel.java @@ -0,0 +1,119 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 知识-文件 + * + * @author wangshibao + */ +public class FileModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDID = "CARDID"; + public static final String FILENAME = "FILENAME"; + public static final String FILEVER = "FILEVER"; + public static final String FILESIZE = "FILESIZE"; + public static final String FILESTATE = "FILESTATE"; + public static final String CREATETIME = "CREATETIME"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String ISFULLSEARCH = "ISFULLSEARCH";//0:未入库 1:已入库 2:无需入库(比如表单类虚拟文件) + public static final String SECURITYLEVEL = "SECURITYLEVEL";//0:未入库 1:已入库 2:无需入库(比如表单类虚拟文件) + + + private String id; + private String cardId; + private String fileName; + private String fileVer; + private long fileSize; + private int fileState; + private Timestamp createTime; + private String createUser; + private int isFullsearch; + private int securityLevel; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileVer() { + return fileVer; + } + + public void setFileVer(String fileVer) { + this.fileVer = fileVer; + } + + public long getFileSize() { + return fileSize; + } + + public void setFileSize(long fileSize) { + this.fileSize = fileSize; + } + + public int getFileState() { + return fileState; + } + + public void setFileState(int fileState) { + this.fileState = fileState; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public int getIsFullsearch() { + return isFullsearch; + } + + public void setIsFullsearch(int isFullsearch) { + this.isFullsearch = isFullsearch; + } + + public int getSecurityLevel() { + return securityLevel; + } + + public void setSecurityLevel(int securityLevel) { + this.securityLevel = securityLevel; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotDefModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotDefModel.java new file mode 100644 index 00000000..67838d2b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotDefModel.java @@ -0,0 +1,78 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 知识地图-定义 + * + * @author wangshibao + */ +public class HotspotDefModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String HOTSPOTNAME = "HOTSPOTNAME"; + public static final String HOTSPOTMETAID = "HOTSPOTMETAID"; + public static final String CREATETIME = "CREATETIME"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String MEMO = "MEMO"; + + private String id; + private String hotspotName; + private String hotspotMetaId; + private Timestamp createTime; + private String createUser; + private String memo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getHotspotName() { + return hotspotName; + } + + public void setHotspotName(String hotspotName) { + this.hotspotName = hotspotName; + } + + public String getHotspotMetaId() { + return hotspotMetaId; + } + + public void setHotspotMetaId(String hotspotMetaId) { + this.hotspotMetaId = hotspotMetaId; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotModel.java new file mode 100644 index 00000000..265b3d34 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/HotspotModel.java @@ -0,0 +1,86 @@ +package com.actionsoft.apps.kms.model; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 流程 + * + * @author wangshibao + */ +public class HotspotModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String HOTSPOTDEFID = "HOTSPOTDEFID"; + public static final String SHAPEID = "SHAPEID"; + public static final String DIMENSIONID = "DIMENSIONID"; + public static final String BINDTYPE = "BINDTYPE"; + public static final String LINKURL = "LINKURL"; + public static final String TARGET = "TARGET"; + + private String id; + private String hotspotDefId; + private String shapeId; + private String dimensionId;// todo 重构成sourceId,因为此id在bindType为1的时候代表维度id,bindType为2的时候代表知识id + private int bindType; + private String linkURL; + private String target; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getHotspotDefId() { + return hotspotDefId; + } + + public void setHotspotDefId(String hotspotDefId) { + this.hotspotDefId = hotspotDefId; + } + + public String getShapeId() { + return shapeId; + } + + public void setShapeId(String shapeId) { + this.shapeId = shapeId; + } + + public String getDimensionId() { + return dimensionId; + } + + public void setDimensionId(String dimensionId) { + this.dimensionId = dimensionId; + } + + public int getBindType() { + return bindType; + } + + public void setBindType(int bindType) { + this.bindType = bindType; + } + + public String getLinkURL() { + return linkURL; + } + + public void setLinkURL(String linkURL) { + this.linkURL = linkURL; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/LogModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/LogModel.java new file mode 100644 index 00000000..534cd149 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/LogModel.java @@ -0,0 +1,100 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 日志 + * + * @author wangshibao + */ +public class LogModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDID = "CARDID"; + public static final String FILEID = "FILEID"; + public static final String ACCESSUSER = "ACCESSUSER"; + public static final String ACCESSTIME = "ACCESSTIME"; + public static final String IPADDRESS = "IPADDRESS"; + public static final String LOGTYPE = "LOGTYPE"; + public static final String LOGINFO = "LOGINFO"; + + private String id; + private String cardId; + private String fileId; + private String accessUser; + private Timestamp accessTime; + private String ipAddress; + private int logType; + private String logInfo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getAccessUser() { + return accessUser; + } + + public void setAccessUser(String accessUser) { + this.accessUser = accessUser; + } + + public Timestamp getAccessTime() { + return accessTime; + } + + public void setAccessTime(Timestamp accessTime) { + this.accessTime = accessTime; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public int getLogType() { + return logType; + } + + public void setLogType(int logType) { + this.logType = logType; + } + + public String getLogInfo() { + if (logInfo == null) { + return ""; + } + return logInfo; + } + + public void setLogInfo(String logInfo) { + this.logInfo = logInfo; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaAttrModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaAttrModel.java new file mode 100644 index 00000000..575c7f53 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaAttrModel.java @@ -0,0 +1,67 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 元数据-属性 + * + * @author wangshibao + */ +public class MetaAttrModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String SCHEMAID = "SCHEMAID"; + public static final String ATTRTITLE = "ATTRTITLE"; + public static final String CREATETIME = "CREATETIME"; + public static final String CREATEUSER = "CREATEUSER"; + + private String id; + private String schemaId; + private String attrTitle; + private Timestamp createTime; + private String createUser; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSchemaId() { + return schemaId; + } + + public void setSchemaId(String schemaId) { + this.schemaId = schemaId; + } + + public String getAttrTitle() { + return attrTitle; + } + + public void setAttrTitle(String attrTitle) { + this.attrTitle = attrTitle; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaDataModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaDataModel.java new file mode 100644 index 00000000..0249abed --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaDataModel.java @@ -0,0 +1,87 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 元数据-数据 + * @author wangshibao + */ +public class MetaDataModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDID = "CARDID"; + public static final String SCHEMAID = "SCHEMAID"; + public static final String ATTRID = "ATTRID"; + public static final String CREATETIME = "CREATETIME"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String METATEXT = "METATEXT"; + + private String id; + private String cardId; + private String schemaId; + private String attrId; + private Timestamp createTime; + private String createUser; + private String metaText; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getSchemaId() { + return schemaId; + } + + public void setSchemaId(String schemaId) { + this.schemaId = schemaId; + } + + public String getAttrId() { + return attrId; + } + + public void setAttrId(String attrId) { + this.attrId = attrId; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getMetaText() { + return metaText; + } + + public void setMetaText(String metaText) { + this.metaText = metaText; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaSchemaModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaSchemaModel.java new file mode 100644 index 00000000..05742d1f --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/MetaSchemaModel.java @@ -0,0 +1,118 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 元数据 + * + * @author wangshibao + */ +public class MetaSchemaModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String SCHEMATITLE = "SCHEMATITLE"; + public static final String SCHEMASHOWTYPE = "SCHEMASHOWTYPE"; + public static final String SCHEMADESC = "SCHEMADESC"; + public static final String CREATETIME = "CREATETIME"; + public static final String LASTUPDATE = "LASTUPDATE"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String ISNULLABLE = "ISNULLABLE"; + public static final String ISSEARCH = "ISSEARCH"; + public static final String ORDERINDEX = "ORDERINDEX"; + + private String id; + private String schemaTitle; + private int schemaShowtype; + private String schemaDesc; + private Timestamp createTime; + private Timestamp lastUpdate; + private String createUser; + private int isNullable; + private int isSearch; + private int orderIndex; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSchemaTitle() { + return schemaTitle; + } + + public void setSchemaTitle(String schemaTitle) { + this.schemaTitle = schemaTitle; + } + + public int getSchemaShowtype() { + return schemaShowtype; + } + + public void setSchemaShowtype(int schemaShowtype) { + this.schemaShowtype = schemaShowtype; + } + + public String getSchemaDesc() { + return schemaDesc; + } + + public void setSchemaDesc(String schemaDesc) { + this.schemaDesc = schemaDesc; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public Timestamp getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Timestamp lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public int getIsNullable() { + return isNullable; + } + + public void setIsNullable(int isNullable) { + this.isNullable = isNullable; + } + + public int getIsSearch() { + return isSearch; + } + + public void setIsSearch(int isSearch) { + this.isSearch = isSearch; + } + + public int getOrderIndex() { + return orderIndex; + } + + public void setOrderIndex(int orderIndex) { + this.orderIndex = orderIndex; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/OptModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/OptModel.java new file mode 100644 index 00000000..09aea63f --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/OptModel.java @@ -0,0 +1,73 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +public class OptModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDID = "CARDID"; + public static final String OPTUSER = "OPTUSER"; + public static final String OPTTYPE = "OPTTYPE"; + public static final String OPTTIME = "OPTTIME"; + public static final String OPTCONTENT = "OPTCONTENT"; + + private String id; + private String cardId; + private String optUser; + private int optType; + private Timestamp optTime; + private String optContent; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getOptUser() { + return optUser; + } + + public void setOptUser(String optUser) { + this.optUser = optUser; + } + + public int getOptType() { + return optType; + } + + public void setOptType(int optType) { + this.optType = optType; + } + + public Timestamp getOptTime() { + return optTime; + } + + public void setOptTime(Timestamp optTime) { + this.optTime = optTime; + } + + public String getOptContent() { + return optContent; + } + + public void setOptContent(String optContent) { + this.optContent = optContent; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/PublishModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/PublishModel.java new file mode 100644 index 00000000..c0d38c31 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/PublishModel.java @@ -0,0 +1,118 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 发布 + * + * @author wangshibao + */ +public class PublishModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String CARDID = "CARDID"; + public static final String DIMENSIONID = "DIMENSIONID"; + public static final String PUBLISHUSER = "PUBLISHUSER"; + public static final String PUBLISHTIME = "PUBLISHTIME"; + public static final String TAG = "TAG"; + public static final String MEMO = "MEMO"; + public static final String EXAMINEINFO = "EXAMINEINFO"; + + private String id; + private String cardId; + private String dimensionId; + private String publishUser; + private Timestamp publishTime; + private String tag; + private String memo; + private String examineInfo; + + // model + private CardModel cardModel; + private DimensionModel dimensionModel; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getDimensionId() { + return dimensionId; + } + + public void setDimensionId(String dimensionId) { + this.dimensionId = dimensionId; + } + + public String getPublishUser() { + return publishUser; + } + + public void setPublishUser(String publishUser) { + this.publishUser = publishUser; + } + + public Timestamp getPublishTime() { + return publishTime; + } + + public void setPublishTime(Timestamp publishTime) { + this.publishTime = publishTime; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public CardModel getCardModel() { + return cardModel; + } + + public void setCardModel(CardModel cardModel) { + this.cardModel = cardModel; + } + + public DimensionModel getDimensionModel() { + return dimensionModel; + } + + public void setDimensionModel(DimensionModel dimensionModel) { + this.dimensionModel = dimensionModel; + } + + public String getExamineInfo() { + return examineInfo; + } + + public void setExamineInfo(String examineInfo) { + this.examineInfo = examineInfo; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/SchemaModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/SchemaModel.java new file mode 100644 index 00000000..8deba08b --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/SchemaModel.java @@ -0,0 +1,108 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 元数据 + * + * @author wangshibao + */ +public class SchemaModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String SCHEMATITLE = "SCHEMATITLE"; + public static final String SCHEMASHOWTYPE = "SCHEMASHOWTYPE"; + public static final String SCHEMADESC = "SCHEMADESC"; + public static final String CREATETIME = "CREATETIME"; + public static final String LASTUPDATE = "LASTUPDATE"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String ISNULLABLE = "ISNULLABLE"; + public static final String ISSEARCH = "ISSEARCH"; + + private String id; + private String schemaTitle; + private int schemaShowtype; + private String schemaDesc; + private Timestamp createTime; + private Timestamp lastUpdate; + private String createUser; + private int isNullable; + private int isSearch; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSchemaTitle() { + return schemaTitle; + } + + public void setSchemaTitle(String schemaTitle) { + this.schemaTitle = schemaTitle; + } + + public int getSchemaShowtype() { + return schemaShowtype; + } + + public void setSchemaShowtype(int schemaShowtype) { + this.schemaShowtype = schemaShowtype; + } + + public String getSchemaDesc() { + return schemaDesc; + } + + public void setSchemaDesc(String schemaDesc) { + this.schemaDesc = schemaDesc; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public Timestamp getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Timestamp lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public int getIsNullable() { + return isNullable; + } + + public void setIsNullable(int isNullable) { + this.isNullable = isNullable; + } + + public int getIsSearch() { + return isSearch; + } + + public void setIsSearch(int isSearch) { + this.isSearch = isSearch; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/VersionModel.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/VersionModel.java new file mode 100644 index 00000000..73475b06 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/model/VersionModel.java @@ -0,0 +1,68 @@ +package com.actionsoft.apps.kms.model; + +import java.sql.Timestamp; + +import com.actionsoft.bpms.commons.mvc.model.IModelBean; +import com.actionsoft.bpms.commons.mvc.model.ModelBean; + +/** + * 版本号 + * + * @author wangshibao + */ +public class VersionModel extends ModelBean implements IModelBean { + private static final long serialVersionUID = 1L; + + public static final String ID = "ID"; + public static final String VERSIONNO = "VERSIONNO"; + public static final String CREATETIME = "CREATETIME"; + public static final String CREATEUSER = "CREATEUSER"; + public static final String MEMO = "MEMO"; + + private String id; + private String versionNo; + private Timestamp createTime; + private String createUser; + private String memo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersionNo() { + return versionNo; + } + + public void setVersionNo(String versionNo) { + this.versionNo = versionNo; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoEConstant.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoEConstant.java new file mode 100644 index 00000000..702263a6 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoEConstant.java @@ -0,0 +1,38 @@ +package com.actionsoft.apps.kms.pal; + +import java.util.Timer; + +public class CoEConstant { + + public static final String APP_ID = "com.actionsoft.apps.coe.pal"; //App name + + /** + * DC下资产库文件根目录 + */ + public static final String REPOSITORY_ROOT_DIR = "workspace"; + + public static final String PROPERTY_CUSTOM_DEFINE_SCHEMA = "CUSTOM_DEFINE_SCHEMA"; //属性-是否允许用户自定义,0:不允许;1:允许 + public static final String PROPERTY_DEFAULT_WSID = "DEFAULT_WSID"; //属性-默认的流程资产库Id + public static final String PROPERTY_PLDEPT_LAYER = "PLDEPT_LAYER"; //属性-流程责任部门组织级别 + public static final String PROPERTY_RELATION_TYPE = "RELATION_TYPE"; //属性-责任人和责任部门关联方式 + public static final String PROPERTY_SYS_AUTOSAVE = "SYS_AUTOSAVE"; //属性-流程自动保存 + + public static Timer timer1 = new Timer(); //用于清理设计器协作的同步消息 + public static final Timer timer2 = new Timer(); //用于清理设计器出现复制的同步消息 + + // 收藏模型文件标识 + public static final String COMMON_REPOSITORY_VERSIONID = "commonRepositoryVersionId"; + + public static final String APP_PROCESSLINK_ID = "com.actionsoft.apps.coe.pal.processlink";// 串联分析应用id + + public static final String APP_OUTPUT_ID = "com.actionsoft.apps.coe.pal.output";// 报告生成器应用id + + public static final String APP_OUTPUT_PR_ID = "com.actionsoft.apps.coe.pal.output.pr";// 流程手册应用id + + public static final String APP_ONLINE_DOC_ID = "com.actionsoft.apps.addons.onlinedoc";// 预览应用id + + public static final String APP_BATCH_ID = "com.actionsoft.apps.coe.pal.batch";// 流程批处理id + + public static final String APP_SUB_PROCESS_ID = "com.actionsoft.apps.coe.method.process.subprocess"; // 端到端应用ID + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoeProcessLevelDaoFacotory.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoeProcessLevelDaoFacotory.java new file mode 100644 index 00000000..61e90123 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/CoeProcessLevelDaoFacotory.java @@ -0,0 +1,21 @@ +package com.actionsoft.apps.kms.pal; + +import com.actionsoft.apps.coe.pal.constant.CoEConstant; +import com.actionsoft.apps.coe.pal.pal.repository.dao.PALRepository; +import com.actionsoft.bpms.commons.database.DaoFactory; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.util.ClassReflect; +import com.actionsoft.exception.AWSException; + +public class CoeProcessLevelDaoFacotory extends DaoFactory{ + public static final String DAO_CLASSPATH = "com.actionsoft.apps.coe.pal.pal.repository.dao"; + public static PALRepository createCoeProcessLevel() { + try { + Class c = ClassReflect.forName(DAO_CLASSPATH + "." + AWSServerConf.getDatabaseProvider() + ".CoeProcessLevelAdapter", CoEConstant.APP_ID); + return (PALRepository) create(c); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + throw new AWSException(e); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/PALRepository.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/PALRepository.java new file mode 100644 index 00000000..a70dbc1e --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/pal/PALRepository.java @@ -0,0 +1,4482 @@ +package com.actionsoft.apps.kms.pal; + +import com.actionsoft.apps.coe.pal.constant.CoEConstant; +import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache; +import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.constant.CoeProcessLevelConstant; +import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory; +import com.actionsoft.apps.coe.pal.pal.repository.designer.cache.CoeDesignerShapeCache; +import com.actionsoft.apps.coe.pal.pal.repository.designer.io.file.helper.CoeFile; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeCopyModel; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeFileRelationModel; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapePasteModel; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.apps.coe.pal.pal.repository.model.impl.PALRepositoryModelImpl; +import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil; +import com.actionsoft.apps.coe.pal.pal.repository.util.Number2ChineseNumUtil; +import com.actionsoft.apps.coe.pal.pal.ws.model.CoeWorkSpaceModel; +import com.actionsoft.apps.coe.pal.pal.ws.web.VersionUtil; +import com.actionsoft.apps.coe.pal.system.util.StringUtil; +import com.actionsoft.apps.coe.pal.teamwork.dao.TeamPerm; +import com.actionsoft.apps.lifecycle.api.AppsAPIManager; +import com.actionsoft.bpms.commons.database.RowMapper; +import com.actionsoft.bpms.commons.mvc.dao.DaoObject; +import com.actionsoft.bpms.commons.pagination.SQLPagination; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.i18n.I18nRes; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.sql.*; +import java.text.SimpleDateFormat; +import java.util.*; + +public class PALRepository extends DaoObject { + + public PALRepositoryModel getInstance(String uuid) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_UUID + "= ?"; + return DBSql.getObject(sql, new PALRespositoryModelMapper(), uuid); + } + + /** + * 获取repository表中的所有数据 + * @return + * @author tanj + */ + public List getAllInstance() { + return query().list(); + } + + private class PALRespositoryModelMapper implements RowMapper { + public PALRepositoryModel mapRow(ResultSet rs, int arg1) throws SQLException { + return record2Model(rs); + } + } + + @Override + public int insert(PALRepositoryModel obj) throws AWSDataAccessException { + Connection conn = DBSql.open(); + int r = 0; + r = insert(conn, obj); + DBSql.close(conn); + + return r; + } + + public int insert(Connection conn, PALRepositoryModel obj) throws AWSDataAccessException { + int r = 0; + PALRepositoryModelImpl model = (PALRepositoryModelImpl) obj; + if (model.getId().equals("") || model.getId().equals("0")) { + model.setId(UUIDGener.getUUID()); + if(model.getVersionId() == null || "".equals(model.getVersionId())) { + model.setVersionId(model.getId()); + } + } + if (model.getPlRid() == null || "".equals(model.getPlRid()) || "0".equals(model.getId())) { + model.setPlRid(UUIDGener.getUUID()); + } + + Map paraMap = new HashMap(); + paraMap.put(PALRepositoryModelImpl.FIELD_UUID, model.getId()); + paraMap.put(PALRepositoryModelImpl.FIELD_WS_ID, model.getWsId()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_NO, model.getNo()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_NAME, model.getName()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_LEVEL, model.getLevel()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_PARENT_ID, model.getParentId()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX, model.getOrderIndex()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_DESC, model.getDesc()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL, model.isBottomLevel()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_RD, model.getOwnerDept()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_RP, model.getOwnerUser()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_M, model.getMilestone()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE, model.getExecType()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME, model.getSystemName()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_AWS_PID, model.getAWSProcessId()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL, model.getDiagramUrl()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_COLOR, model.getColor()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_CATEGORY, model.getMethodCategory()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_METHODID, model.getMethodId()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_VER, model.getVersion()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_VERSION_UUID, model.getVersionId()); + paraMap.put(PALRepositoryModelImpl.FIELD_FILE_PATH, model.getFilePath() == null ? "" : model.getFilePath()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_INPUT, model.getInput() == null ? "" : model.getInput()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_OUTPUT, model.getOutput() == null ? "" : model.getOutput()); + //historyMaxVersion转为数字类型 + paraMap.put(PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION, "".equals(model.getHistoryMaxVersion()) ? 0 : Integer.parseInt(model.getHistoryMaxVersion()) ); + paraMap.put(PALRepositoryModelImpl.FIELD_IS_SYSTEM_FILE, model.isSystemFile() ? 1 : 0); + paraMap.put(PALRepositoryModelImpl.FIELD_IS_USE, model.isUse() ? 1 : 0); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_RID, model.getPlRid()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_ISPUBLISH, model.isPublish() ? 1 : 0); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_ISSTOP, model.isStop() ? 1 : 0); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL, model.isApproval() ? 1 : 0); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_CREATEUSER, model.getCreateUser()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_CREATEDATE, model.getCreateDate()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_MODIFYUSER, model.getModifyUser()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_MODIFYDATE, model.getModifyDate()); + paraMap.put(PALRepositoryModelImpl.FIELD_VIEWCOUNT, model.getViewCount()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT, model.getDutyDept()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON, model.getDutyUser()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_LOCKUSER, model.getLockUser()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_EXT1, model.getExt1()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_EXT2, model.getExt2()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_EXT3, model.getExt3()); + paraMap.put(PALRepositoryModelImpl.FIELD_PL_EXT4, model.getExt4()); + //三员管理 + if(null != model.getSecurityLevel()){ + paraMap.put(PALRepositoryModelImpl.FIELD_SECURITY_LEVEL,model.getSecurityLevel()); + }else { + model.setSecurityLevel(-1); + } + + String sql = DBSql.getInsertStatement(PALRepositoryModelImpl.DATABASE_ENTITY, paraMap); + model.setNewParentId(model.getParentId()); + r = DBSql.update(conn, sql, paraMap); + if (r > 0) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + /** + * 批量插入数据 + * + * @param list + * @return + * @author zhangming + */ + public boolean batchInsert(List list) { + Connection conn = DBSql.open(); + PreparedStatement prest = null; + try { + conn.setAutoCommit(false); + StringBuilder sql = new StringBuilder("INSERT INTO ").append(PALRepositoryModelImpl.DATABASE_ENTITY) + .append("(") + .append(PALRepositoryModelImpl.FIELD_UUID).append(",") + .append(PALRepositoryModelImpl.FIELD_WS_ID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_NO).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_NAME).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_LEVEL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_PARENT_ID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DESC).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RD).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RP).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_M).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_AWS_PID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_COLOR).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CATEGORY).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_METHODID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_VER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_VERSION_UUID).append(",") + .append(PALRepositoryModelImpl.FIELD_FILE_PATH).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_INPUT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_OUTPUT).append(",") + .append(PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION).append(",") + .append(PALRepositoryModelImpl.FIELD_IS_SYSTEM_FILE).append(",") + .append(PALRepositoryModelImpl.FIELD_IS_USE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISPUBLISH).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CREATEUSER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CREATEDATE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_MODIFYUSER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_MODIFYDATE).append(",") + .append(PALRepositoryModelImpl.FIELD_VIEWCOUNT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISSTOP).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT1).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT2).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT3).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT4).append(",") + .append(PALRepositoryModelImpl.FIELD_SECURITY_LEVEL).append(")") + .append(" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + prest = conn.prepareStatement(sql.toString(), ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); + for (PALRepositoryModel model : list) { + prest.setString(1, model.getId()); + prest.setString(2, model.getWsId()); + prest.setString(3, model.getNo()); + prest.setString(4, model.getName()); + prest.setInt(5, model.getLevel()); + prest.setString(6, model.getParentId()); + prest.setInt(7, model.getOrderIndex()); + prest.setString(8, model.getDesc()); + prest.setInt(9, model.isBottomLevel()); + prest.setString(10, model.getOwnerDept()); + prest.setString(11, model.getOwnerUser()); + prest.setString(12, model.getMilestone()); + prest.setInt(13, model.getExecType()); + prest.setString(14, model.getSystemName()); + prest.setString(15, model.getAWSProcessId()); + prest.setString(16, model.getDiagramUrl()); + prest.setString(17, model.getColor()); + prest.setString(18, model.getMethodCategory()); + prest.setString(19, model.getMethodId()); + prest.setDouble(20, model.getVersion()); + prest.setString(21, model.getVersionId()); + prest.setString(22, model.getFilePath() == null ? "" : model.getFilePath()); + prest.setString(23, model.getInput() == null ? "" : model.getInput()); + prest.setString(24, model.getOutput() == null ? "" : model.getOutput()); + // prest.setString(25, model.getHistoryMaxVersion()); + prest.setInt(25, UtilString.isEmpty(model.getHistoryMaxVersion()) ? 0 : Integer.parseInt(model.getHistoryMaxVersion())); + prest.setInt(26, model.isSystemFile() ? 1 : 0); + prest.setInt(27, model.isUse() ? 1 : 0); + prest.setString(28, model.getPlRid()); + prest.setInt(29, model.isPublish() ? 1 : 0); + prest.setString(30, model.getCreateUser()); + prest.setTimestamp(31, model.getCreateDate()); + prest.setString(32, model.getModifyUser()); + prest.setTimestamp(33, model.getModifyDate()); + prest.setLong(34, model.getViewCount()); + prest.setString(35, model.getDutyDept()); + prest.setString(36, model.getDutyUser()); + prest.setInt(37, model.isStop() ? 1 : 0); + prest.setInt(38, model.isApproval() ? 1 : 0); + prest.setString(39, model.getExt1()); + prest.setString(40, model.getExt2()); + prest.setString(41, model.getExt3()); + prest.setString(42, model.getExt4()); + if (null == model.getSecurityLevel()){ + prest.setInt(43, -1); + }else{ + prest.setInt(43, model.getSecurityLevel()); + } + prest.addBatch(); + } + prest.executeBatch(); + conn.commit(); + return true; + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn, prest, null); + } + return false; + } + + + /** + * 批量插入数据 + * + * @param list + * @return + */ + public boolean batchInsert(Connection conn, PreparedStatement prest, List list) { + if (list == null || list.size() == 0) { + return false; + } + try { + StringBuilder sql = new StringBuilder("INSERT INTO ").append(PALRepositoryModelImpl.DATABASE_ENTITY) + .append("(") + .append(PALRepositoryModelImpl.FIELD_UUID).append(",") + .append(PALRepositoryModelImpl.FIELD_WS_ID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_NO).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_NAME).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_LEVEL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_PARENT_ID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DESC).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RD).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RP).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_M).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_AWS_PID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_COLOR).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CATEGORY).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_METHODID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_VER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_VERSION_UUID).append(",") + .append(PALRepositoryModelImpl.FIELD_FILE_PATH).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_INPUT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_OUTPUT).append(",") + .append(PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION).append(",") + .append(PALRepositoryModelImpl.FIELD_IS_SYSTEM_FILE).append(",") + .append(PALRepositoryModelImpl.FIELD_IS_USE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_RID).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISPUBLISH).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CREATEUSER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_CREATEDATE).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_MODIFYUSER).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_MODIFYDATE).append(",") + .append(PALRepositoryModelImpl.FIELD_VIEWCOUNT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISSTOP).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT1).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT2).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT3).append(",") + .append(PALRepositoryModelImpl.FIELD_PL_EXT4).append(",") + .append(PALRepositoryModelImpl.FIELD_SECURITY_LEVEL).append(")") + .append(" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + prest = conn.prepareStatement(sql.toString(), ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); + for (PALRepositoryModel model : list) { + prest.setString(1, model.getId()); + prest.setString(2, model.getWsId()); + prest.setString(3, model.getNo()); + prest.setString(4, model.getName()); + prest.setInt(5, model.getLevel()); + prest.setString(6, model.getParentId()); + prest.setInt(7, model.getOrderIndex()); + prest.setString(8, model.getDesc()); + prest.setInt(9, model.isBottomLevel()); + prest.setString(10, model.getOwnerDept()); + prest.setString(11, model.getOwnerUser()); + prest.setString(12, model.getMilestone()); + prest.setInt(13, model.getExecType()); + prest.setString(14, model.getSystemName()); + prest.setString(15, model.getAWSProcessId()); + prest.setString(16, model.getDiagramUrl()); + prest.setString(17, model.getColor()); + prest.setString(18, model.getMethodCategory()); + prest.setString(19, model.getMethodId()); + prest.setDouble(20, model.getVersion()); + prest.setString(21, model.getVersionId()); + prest.setString(22, model.getFilePath() == null ? "" : model.getFilePath()); + prest.setString(23, model.getInput() == null ? "" : model.getInput()); + prest.setString(24, model.getOutput() == null ? "" : model.getOutput()); + // prest.setString(25, model.getHistoryMaxVersion()); + prest.setInt(25, UtilString.isEmpty(model.getHistoryMaxVersion()) ? 0 : Integer.parseInt(model.getHistoryMaxVersion())); + prest.setInt(26, model.isSystemFile() ? 1 : 0); + prest.setInt(27, model.isUse() ? 1 : 0); + prest.setString(28, model.getPlRid()); + prest.setInt(29, model.isPublish() ? 1 : 0); + prest.setString(30, model.getCreateUser()); + prest.setTimestamp(31, model.getCreateDate()); + prest.setString(32, model.getModifyUser()); + prest.setTimestamp(33, model.getModifyDate()); + prest.setLong(34, model.getViewCount()); + prest.setString(35, model.getDutyDept()); + prest.setString(36, model.getDutyUser()); + prest.setInt(37, model.isStop() ? 1 : 0); + prest.setInt(38, model.isApproval() ? 1 : 0); + prest.setString(39, model.getExt1()); + prest.setString(40, model.getExt2()); + prest.setString(41, model.getExt3()); + prest.setString(42, model.getExt4()); + if (null == model.getSecurityLevel()){ + prest.setInt(43, -1); + }else{ + prest.setInt(43, model.getSecurityLevel()); + } + prest.addBatch(); + } + prest.executeBatch(); + return true; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 批量刷新缓存 + * @param list + */ + public void refreshCache(List list) { + if (list == null) { + return; + } + for (PALRepositoryModel model : list) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + } + + /** + * 根据流程资产的id去拿他下面的所有流程 + * + * @param wsId + * @return + */ + public List getInstanceToList(String wsId) { + String sql = "select * from APP_ACT_COE_PAL_REPOSITORY where " + PALRepositoryModelImpl.FIELD_WS_ID + "=?"; + return DBSql.query(sql, new PALRespositoryModelMapper(), wsId); + } + + public PALRepositoryModel record2Model(ResultSet rs) throws SQLException { + PALRepositoryModelImpl model = new PALRepositoryModelImpl(); + model.setId(putString(rs.getString(PALRepositoryModelImpl.FIELD_UUID))); + model.setWsId(putString(rs.getString(PALRepositoryModelImpl.FIELD_WS_ID))); + model.setNo(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_NO))); + model.setName(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_NAME))); + model.setAWSProcessId(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_AWS_PID))); + model.setColor(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_COLOR))); + model.setDesc(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_DESC))); + model.setDiagramUrl(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL))); + model.setExecType(rs.getInt(PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE)); + model.setBottomLevel(rs.getInt(PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL)); + model.setLevel(rs.getInt(PALRepositoryModelImpl.FIELD_PL_LEVEL)); + model.setMilestone(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_M))); + model.setOrderIndex(rs.getInt(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX)); + model.setParentId(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_PARENT_ID))); + model.setOwnerDept(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_RD))); + model.setOwnerUser(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_RP))); + model.setSystemName(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME))); + model.setMethodCategory(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_CATEGORY))); + model.setMethodId(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_METHODID))); + model.setVersion(rs.getDouble(PALRepositoryModelImpl.FIELD_PL_VER)); + model.setVersionId(putString(rs.getString(PALRepositoryModelImpl.FIELD_PL_VERSION_UUID))); + model.setUse(rs.getInt(PALRepositoryModelImpl.FIELD_IS_USE) == 1); + model.setSystemFile(rs.getInt(PALRepositoryModelImpl.FIELD_IS_SYSTEM_FILE) == 1); + model.setFilePath(rs.getString(PALRepositoryModelImpl.FIELD_FILE_PATH)); + model.setHistoryMaxVersion(rs.getInt(PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION) + ""); + model.setInput(rs.getString(PALRepositoryModelImpl.FIELD_PL_INPUT)); + model.setOutput(rs.getString(PALRepositoryModelImpl.FIELD_PL_OUTPUT)); + model.setPlRid(rs.getString(PALRepositoryModelImpl.FIELD_PL_RID)); + model.setPublish(rs.getInt(PALRepositoryModelImpl.FIELD_PL_ISPUBLISH) == 1); + model.setStop(rs.getInt(PALRepositoryModelImpl.FIELD_PL_ISSTOP) == 1); + model.setApproval(rs.getInt(PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL) == 1); + model.setCreateUser(rs.getString(PALRepositoryModelImpl.FIELD_PL_CREATEUSER)); + model.setCreateDate(rs.getTimestamp(PALRepositoryModelImpl.FIELD_PL_CREATEDATE)); + model.setModifyUser(rs.getString(PALRepositoryModelImpl.FIELD_PL_MODIFYUSER)); + model.setModifyDate(rs.getTimestamp(PALRepositoryModelImpl.FIELD_PL_MODIFYDATE)); + model.setViewCount(rs.getLong(PALRepositoryModelImpl.FIELD_VIEWCOUNT)); + model.setNewParentId(rs.getString(PALRepositoryModelImpl.FIELD_PL_PARENT_ID)); + model.setDutyDept(rs.getString(PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT) == null ? "" : rs.getString(PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT)); + model.setDutyUser(rs.getString(PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON) == null ? "" : rs.getString(PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON)); + model.setLockUser(rs.getString(PALRepositoryModelImpl.FIELD_PL_LOCKUSER)); + model.setPublishDate(rs.getTimestamp(PALRepositoryModelImpl.FIELD_PL_PUBLISHDATE)); + model.setChangeDate(rs.getTimestamp(PALRepositoryModelImpl.FIELD_PL_CHANGEDATE)); + model.setStopDate(rs.getTimestamp(PALRepositoryModelImpl.FIELD_PL_STOPDATE)); + model.setExt1(rs.getString(PALRepositoryModelImpl.FIELD_PL_EXT1)); + model.setExt2(rs.getString(PALRepositoryModelImpl.FIELD_PL_EXT2)); + model.setExt3(rs.getString(PALRepositoryModelImpl.FIELD_PL_EXT3)); + model.setExt4(rs.getString(PALRepositoryModelImpl.FIELD_PL_EXT4)); + //三员管理-密级 + model.setSecurityLevel(rs.getInt(PALRepositoryModelImpl.FIELD_SECURITY_LEVEL)); + model.setConvertCount(rs.getInt(PALRepositoryModelImpl.FIELD_CONVERT_COUNT)); + return model; + } + + public String putString(String obj) { + if (obj == null) { + return ""; + } else { + return obj; + } + } + + @Override + public int update(PALRepositoryModel obj) { + PALRepositoryModel model = obj; + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + + " set " + + PALRepositoryModelImpl.FIELD_WS_ID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_NO + "=?, " + + PALRepositoryModelImpl.FIELD_PL_NAME + "=?, " + + PALRepositoryModelImpl.FIELD_PL_LEVEL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DESC + "=?, " + + PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_RD + "=?, " + + PALRepositoryModelImpl.FIELD_PL_RP + "=?, " + + PALRepositoryModelImpl.FIELD_PL_M + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE + "=?, " + + PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME + "=?, " + + PALRepositoryModelImpl.FIELD_PL_AWS_PID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_COLOR + "=?, " + + PALRepositoryModelImpl.FIELD_PL_CATEGORY + "=?, " + + PALRepositoryModelImpl.FIELD_PL_METHODID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_VER + "=?, " + + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + "=?, " + + PALRepositoryModelImpl.FIELD_FILE_PATH + "=?, " + + PALRepositoryModelImpl.FIELD_IS_USE + "=?, " + + PALRepositoryModelImpl.FIELD_PL_INPUT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_OUTPUT + "=? ," + + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=? ," + + PALRepositoryModelImpl.FIELD_PL_CREATEUSER + "=? ," + + PALRepositoryModelImpl.FIELD_PL_CREATEDATE + "=? ," + + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=? ," + + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=?, " + + PALRepositoryModelImpl.FIELD_VIEWCOUNT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON + "=?, " + + PALRepositoryModelImpl.FIELD_PL_LOCKUSER + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT1 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT2 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT3 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT4 + "=?," + + PALRepositoryModelImpl.FIELD_SECURITY_LEVEL +"=?" + + " where " + + PALRepositoryModelImpl.FIELD_UUID + "=?"; + String filePath = ""; + if (model.getFilePath() != null) { + filePath = model.getFilePath(); + } + String input = ""; + String out = ""; + if (model.getInput() != null) { + input = model.getInput(); + + } + if (model.getOutput() != null) { + out = model.getOutput(); + } + String plNo = ""; + if (model.getNo() != null) { + plNo = model.getNo(); + } + String name = ""; + if (model.getName() != null) { + name = model.getName(); + } + String parentId = ""; + if (model.getParentId() != null) { + parentId = model.getParentId(); + } + String desc = ""; + if (model.getDesc() != null) { + desc = model.getDesc(); + } + String plrd = ""; + if (model.getOwnerDept() != null) { + plrd = model.getOwnerDept(); + } + String plrp = ""; + if (model.getOwnerUser() != null) { + plrp = model.getOwnerUser(); + } + String createUser = ""; + if (model.getCreateUser() != null) { + createUser = model.getCreateUser(); + } + + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + Timestamp createDate = null; + if (model.getCreateDate() != null) { + createDate = model.getCreateDate(); + } else { + createDate = nowTime; + } + String modifyUser = ""; + if (model.getModifyUser() != null) { + modifyUser = model.getModifyUser(); + } + Timestamp modifyDate = null; + if (model.getModifyDate() != null) { + modifyDate = model.getModifyDate(); + } else { + modifyDate = nowTime; + } + String dutyDept = ""; + if (model.getDutyDept() != null) { + dutyDept = model.getDutyDept(); + } + String dutyUser = ""; + if (model.getDutyUser() != null) { + dutyUser = model.getDutyUser(); + } + String lockUser = ""; + if (model.getLockUser() != null) { + lockUser = model.getLockUser(); + } + Integer securityLevel = -1; + if (null != model.getSecurityLevel()){ + securityLevel = model.getSecurityLevel(); + } + Object[] args = { model.getWsId(), plNo, name, model.getLevel(), parentId, model.getOrderIndex(), desc, + model.isBottomLevel(), plrd, plrp, model.getMilestone(), model.getExecType(), + model.getSystemName().trim(), model.getAWSProcessId(), model.getDiagramUrl(), model.getColor(), + model.getMethodCategory(), model.getMethodId(), model.getVersion(), model.getVersionId(), filePath, + model.isUse() ? 1 : 0, input, out, model.isPublish() ? 1 : 0, createUser, createDate, modifyUser, + modifyDate, model.getViewCount(), dutyDept, dutyUser, lockUser, model.isStop() ? 1 : 0, + model.isApproval() ? 1 : 0, model.getExt1(), model.getExt2(), model.getExt3(), model.getExt4(), securityLevel, + model.getId() }; + int r = DBSql.update(sql, args); + if (r > 0) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + // 修改流程状态值 + public int updatePALRepositoryStatus(PALRepositoryModel model) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(model.getId()); + if (UtilString.isEmpty(model.getId()) || plModel == null) { + return -1; + } + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_IS_USE + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + PALRepositoryModelImpl.FIELD_PL_EXT1 + "=?, " + PALRepositoryModelImpl.FIELD_PL_EXT2 + "=?, " + PALRepositoryModelImpl.FIELD_PL_EXT3 + "=?, " + PALRepositoryModelImpl.FIELD_PL_EXT4 + "=?, " + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=?, " + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object[] args = { model.isUse() ? 1 : 0, model.isPublish() ? 1 : 0, model.isStop() ? 1 : 0, model.isApproval() ? 1 : 0, model.getExt1(), model.getExt2(), model.getExt3(), model.getExt4(), model.getModifyUser(), model.getModifyDate(), model.getId()}; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setUse(model.isUse()); + plModel.setPublish(model.isPublish()); + plModel.setStop(model.isStop()); + plModel.setApproval(model.isApproval()); + plModel.setExt1(model.getExt1()); + plModel.setExt2(model.getExt2()); + plModel.setExt3(model.getExt3()); + plModel.setExt4(model.getExt4()); + plModel.setModifyDate(model.getModifyDate()); + plModel.setModifyUser(model.getModifyUser()); + PALRepositoryCache.getCache().put(model.getId(), plModel); + } + return r; + } + + /** + * 变更流程 + * @param model + * @return + */ + public int updatePALRepository(String uuid, String sql) { + int r = DBSql.update(sql); + if (r > 0) { + PALRepositoryModel model = getInstance(uuid); + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + /** + * 更新 + * 增加事务控制 + * @param obj + * @param conn + * @return + */ + public int updatePALRepositoryModel(PALRepositoryModel obj, Connection conn) { + PALRepositoryModel model = obj; + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + + " set " + + PALRepositoryModelImpl.FIELD_WS_ID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_NO + "=?, " + + PALRepositoryModelImpl.FIELD_PL_NAME + "=?, " + + PALRepositoryModelImpl.FIELD_PL_LEVEL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DESC + "=?, " + + PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_RD + "=?, " + + PALRepositoryModelImpl.FIELD_PL_RP + "=?, " + + PALRepositoryModelImpl.FIELD_PL_M + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE + "=?, " + + PALRepositoryModelImpl.FIELD_PL_SYSTEM_NAME + "=?, " + + PALRepositoryModelImpl.FIELD_PL_AWS_PID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DIAGRAM_URL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_COLOR + "=?, " + + PALRepositoryModelImpl.FIELD_PL_CATEGORY + "=?, " + + PALRepositoryModelImpl.FIELD_PL_METHODID + "=?, " + + PALRepositoryModelImpl.FIELD_PL_VER + "=?, " + + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + "=?, " + + PALRepositoryModelImpl.FIELD_FILE_PATH + "=?, " + + PALRepositoryModelImpl.FIELD_IS_USE + "=?, " + + PALRepositoryModelImpl.FIELD_PL_INPUT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_OUTPUT + "=? ," + + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=? ," + + PALRepositoryModelImpl.FIELD_PL_CREATEUSER + "=? ," + + PALRepositoryModelImpl.FIELD_PL_CREATEDATE + "=? ," + + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=? ," + + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=?, " + + PALRepositoryModelImpl.FIELD_VIEWCOUNT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT + "=?, " + + PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON + "=?, " + + PALRepositoryModelImpl.FIELD_PL_LOCKUSER + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT1 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT2 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT3 + "=?, " + + PALRepositoryModelImpl.FIELD_PL_EXT4 + "=? " + + " where " + + PALRepositoryModelImpl.FIELD_UUID + "=?"; + String filePath = ""; + if (model.getFilePath() != null) { + filePath = model.getFilePath(); + } + String input = ""; + String out = ""; + if (model.getInput() != null) { + input = model.getInput(); + + } + if (model.getOutput() != null) { + out = model.getOutput(); + } + String plNo = ""; + if (model.getNo() != null) { + plNo = model.getNo(); + } + String name = ""; + if (model.getName() != null) { + name = model.getName(); + } + String parentId = ""; + if (model.getParentId() != null) { + parentId = model.getParentId(); + } + String desc = ""; + if (model.getDesc() != null) { + desc = model.getDesc(); + } + String plrd = ""; + if (model.getOwnerDept() != null) { + plrd = model.getOwnerDept(); + } + String plrp = ""; + if (model.getOwnerUser() != null) { + plrp = model.getOwnerUser(); + } + String createUser = ""; + if (model.getCreateUser() != null) { + createUser = model.getCreateUser(); + } + + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + Timestamp createDate = null; + if (model.getCreateDate() != null) { + createDate = model.getCreateDate(); + } else { + createDate = nowTime; + } + String modifyUser = ""; + if (model.getModifyUser() != null) { + modifyUser = model.getModifyUser(); + } + Timestamp modifyDate = null; + if (model.getModifyDate() != null) { + modifyDate = model.getModifyDate(); + } else { + modifyDate = nowTime; + } + String dutyDept = ""; + if (model.getDutyDept() != null) { + dutyDept = model.getDutyDept(); + } + String dutyUser = ""; + if (model.getDutyUser() != null) { + dutyUser = model.getDutyUser(); + } + String lockUser = ""; + if (model.getLockUser() != null) { + lockUser = model.getLockUser(); + } + Object[] args = { model.getWsId(), plNo, name, model.getLevel(), parentId, model.getOrderIndex(), desc, + model.isBottomLevel(), plrd, plrp, model.getMilestone(), model.getExecType(), + model.getSystemName().trim(), model.getAWSProcessId(), model.getDiagramUrl(), model.getColor(), + model.getMethodCategory(), model.getMethodId(), model.getVersion(), model.getVersionId(), filePath, + model.isUse() ? 1 : 0, input, out, model.isPublish() ? 1 : 0, createUser, createDate, modifyUser, + modifyDate, model.getViewCount(), dutyDept, dutyUser, lockUser, model.isStop() ? 1 : 0, + model.isApproval() ? 1 : 0, model.getExt1(), model.getExt2(), model.getExt3(), model.getExt4(), + model.getId() }; + int r = DBSql.update(conn, sql, args); + if (r > 0) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + /** + * 批量更新 + * @param models + * @return + */ + public boolean updates(List models) { + boolean flag = true; + Connection conn = DBSql.open(); + try { + conn.setAutoCommit(false); + for(PALRepositoryModel model : models) { + updatePALRepositoryModel(model, conn); + } + conn.commit(); + } catch (AWSDataAccessException e1) { + flag = false; + PALRepositoryCache.getCache().reload(); + try { + conn.rollback(); + } catch (SQLException e) { + e.printStackTrace(); + } + return flag; + } catch (SQLException e) { + e.printStackTrace(); + PALRepositoryCache.getCache().reload(); + flag = false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + } + DBSql.close(conn); + } + return flag; + } + + /** + * 修改变更日期和变更人 + * @param uuid + * @param userId + * @return + */ + public int updateModifyUser(String uuid, String userId) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=? WHERE " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object[] args = {nowTime, userId, uuid }; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setModifyDate(nowTime); + plModel.setModifyUser(userId); + PALRepositoryCache.getCache().put(uuid, plModel); + } + return r; + } + + /** + * 修改 lockUser字段值 锁定 解锁流程模型 + *@param lockUser 加锁人员 默认为空 + * */ + + public int updateLockUser(String uuid, String lockUser, String userId) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_LOCKUSER + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=? WHERE " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object[] args = { lockUser, nowTime, userId, uuid }; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setLockUser(lockUser); + plModel.setModifyDate(nowTime); + plModel.setModifyUser(userId); + PALRepositoryCache.getCache().put(uuid, plModel); + } + return r; + } + + /** + * 根据lockuser更新 + *@param lockUser 加锁人员 默认为空 + * */ + + public int updateLockUserByLockUser(String lockUser) { + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set LOCKUSER=''," + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=? WHERE " + PALRepositoryModelImpl.FIELD_PL_LOCKUSER + "=?"; + Object[] args = { nowTime, lockUser, lockUser }; + int r = DBSql.update(sql, args); + if (r > 0) { + PALRepositoryCache.getCache().reload(); + } + return r; + } + + /** + * 流程发布时变更流程的状态和发布时间等 + * @param type 发布类型 N新发布 C变更 S停用 + * @param targetId 发布/变更后/停用的文件ID + * @param sourceId 变更时被变更的文件ID + * @param date 时间 + */ + public void updatePublishStatusAndDate(String type, String targetId, String sourceId, Timestamp date) { + String sql = null; + PALRepositoryModelImpl repositoryModel = null; + switch (type) { + case "N":// 新发布,变为发布状态 + repositoryModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(targetId); + if (repositoryModel == null) break; + sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + PALRepositoryModelImpl.FIELD_PL_PUBLISHDATE + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object [] args1 = {1,0, 0, date, targetId}; + int r1 = DBSql.update(sql, args1); + if (r1 > 0) { + repositoryModel.setPublish(true); + repositoryModel.setStop(false); + repositoryModel.setApproval(false); + repositoryModel.setPublishDate(date); + PALRepositoryCache.getCache().put(targetId, repositoryModel); + } + break; + case "C":// 变更 + repositoryModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(targetId); + if (repositoryModel == null) break; + sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + PALRepositoryModelImpl.FIELD_PL_PUBLISHDATE + "=?, " + PALRepositoryModelImpl.FIELD_PL_CHANGEDATE + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object [] args2 = {1,0, 0, date, date, targetId};// target变为发布状态,停用状态初始为0 + int r2 = DBSql.update(sql, args2); + if (r2 > 0) { + repositoryModel.setPublish(true); + repositoryModel.setStop(false); + repositoryModel.setApproval(false); + repositoryModel.setPublishDate(date); + repositoryModel.setChangeDate(date); + PALRepositoryCache.getCache().put(targetId, repositoryModel); + } + repositoryModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(sourceId); + if (repositoryModel == null) break; + sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + PALRepositoryModelImpl.FIELD_PL_STOPDATE + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object [] args3 = {0,0, 1, date, sourceId};// source变为停用状态 + int r3 = DBSql.update(sql, args3); + if (r3 > 0) { + repositoryModel.setPublish(false); + repositoryModel.setStop(true); + repositoryModel.setApproval(false); + repositoryModel.setStopDate(date); + PALRepositoryCache.getCache().put(sourceId, repositoryModel); + } + break; + default:// 停用 + repositoryModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(targetId); + if (repositoryModel == null) break; + sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_ISPUBLISH + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=?, " + PALRepositoryModelImpl.FIELD_PL_ISSTOP + "=?, " + PALRepositoryModelImpl.FIELD_PL_STOPDATE + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object [] args4 = {0,0, 1, date, targetId}; + int r4 = DBSql.update(sql, args4); + if (r4 > 0) { + repositoryModel.setPublish(false); + repositoryModel.setStop(true); + repositoryModel.setApproval(false); + repositoryModel.setStopDate(date); + PALRepositoryCache.getCache().put(targetId, repositoryModel); + } + break; + } + } + + public void updateIsApproval(int isApproval,String targetId){ + PALRepositoryModelImpl repositoryModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(targetId); + if (repositoryModel == null) return; + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_ISAPPROVAL + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object [] args1 = {isApproval, targetId}; + int r1 = DBSql.update(sql, args1); + if (r1 > 0) { + repositoryModel.setApproval(true); + if (isApproval == 0) { + repositoryModel.setApproval(false); + } + PALRepositoryCache.getCache().put(targetId, repositoryModel); + } + } + + /** + * 根据pid获取 下级数据 获得使用中版本 + * + * @param pid + * @return + */ + public List getCoeProcessLevelByPid(String pid, String wsId) { + String sql = ""; + if (pid.length() < 36) { + sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "=? AND " + PALRepositoryModelImpl.FIELD_WS_ID + "=? AND " + PALRepositoryModelImpl.FIELD_IS_USE + "=1 ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + } else { + sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + " in (" + "select r1.ID from " + PALRepositoryModelImpl.DATABASE_ENTITY + " r1, " + PALRepositoryModelImpl.DATABASE_ENTITY + " r2 where r2.ID=? and r1." + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + " = r2." + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + ")" + " AND " + PALRepositoryModelImpl.FIELD_WS_ID + "=? AND " + PALRepositoryModelImpl.FIELD_IS_USE + "=1 ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + } + return DBSql.query(sql, new PALRespositoryModelMapper(), pid, wsId); + } + + /** + * 根据pid获取 下级数据 获得所有版本 + * + * @param pid + * @return + */ + public List getCoeProcessLevelAllByPid(String pid, String wsId) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "=? AND " + PALRepositoryModelImpl.FIELD_WS_ID + "=? ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper(), pid, wsId); + } + + /** + * 根据name获取流程文件 + * + * @param name + * @return + */ + public List getCoeProcessLevelByName(String name, String wsId, String methodId) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + StringBuilder sql = new StringBuilder("select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' and " + PALRepositoryModelImpl.FIELD_PL_NAME + " like " + namelike + " and " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' "); + + if (methodId != null && !"".equals(methodId)) { + sql.append(" and PLMETHODID = '" + methodId + "' "); + } + sql.append(" ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"); + return DBSql.query(sql.toString(), new PALRespositoryModelMapper()); + } + + /** + * 根据name获取流程文件 + * @param name + * @param wsId + * @param category + * @return + */ + public List getCoeProcessLevelByNameAndCategory(String name, String wsId, String category) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + StringBuilder sql = new StringBuilder("select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' and " + PALRepositoryModelImpl.FIELD_PL_NAME + " like " + namelike + " and " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' "); + + if (category != null && !"".equals(category)) { + sql.append(" and PLCATEGORY = '" + category + "' "); + } + sql.append(" ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"); + return DBSql.query(sql.toString(), new PALRespositoryModelMapper()); + } + + /** + * 根据编号查询流程文件(当前使用版本) + * @param plno 流程编号 + * @param wsId + * @param methodId + * @return + */ + public List getCoEProcessModelByNum(String plno, String wsId, String methodId, String plCategory) { + Map param = new HashMap(); + StringBuilder sql = new StringBuilder("select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_NO + "=:PLNO and " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' "); + param.put("PLNO", plno); + if (!UtilString.isEmpty(wsId)) { + sql.append(" and WSID=:WSID"); + param.put("WSID", wsId); + } else { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + param.put("WSID", defaultWsId); + } + } + if (!UtilString.isEmpty(methodId)) { + sql.append(" and PLMETHODID = :METHODID "); + param.put("METHODID", methodId); + } + if (!UtilString.isEmpty(plCategory)) { + sql.append(" and PLCATEGORY = :PLCATEGORY "); + param.put("PLCATEGORY", plCategory); + } + sql.append(" ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"); + return DBSql.query(sql.toString(), param, new PALRespositoryModelMapper()); + } + + /** + * 根据编号查询流程文件(当前使用版本) + * @param plno 流程编号 + * @param wsId + * @param methodId + * @return + */ + public List getCoEProcessModelByDutyDept(String deptId, String wsId, String methodId, String plCategory) { + Map param = new HashMap(); + StringBuilder sql = new StringBuilder("select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT + "=:DEPTID and " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' "); + param.put("DEPTID", deptId); + if (!UtilString.isEmpty(wsId)) { + sql.append(" and WSID=:WSID"); + param.put("WSID", wsId); + } else { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, "defaultWsId"); + if (!UtilString.isEmpty(defaultWsId)) { + param.put("WSID", defaultWsId); + } + } + if (!UtilString.isEmpty(methodId)) { + sql.append(" and PLMETHODID = :METHODID "); + param.put("METHODID", methodId); + } + if (!UtilString.isEmpty(plCategory)) { + sql.append(" and PLCATEGORY = :PLCATEGORY "); + param.put("PLCATEGORY", plCategory); + } + sql.append(" ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"); + return DBSql.query(sql.toString(), param, new PALRespositoryModelMapper()); + } + + /** + * 根据关系字段查找 + * + * @param rid + * @return + */ + public List getCoeProcessLevelByRid(String rid) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_RID + "=?"; + return DBSql.query(sql, new PALRespositoryModelMapper(), rid); + } + + /** + * 根据关系字段查找正在使用的版本 + * + * @param rid + * @return + */ + public List getCoeUseProcessLevelByRid(String rid) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_RID + "=? AND " + PALRepositoryModelImpl.FIELD_IS_USE + "='1'"; + return DBSql.query(sql, new PALRespositoryModelMapper(), rid); + } + + /** + * 根据aws流程定义ID获取流程模型 + * @param awsProcessId + * @return + */ + public List getCoeProcessLevelByAWSProcessId(String awsProcessId) { + String sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_PL_AWS_PID + "=? "; + return DBSql.query(sql, new PALRespositoryModelMapper(), awsProcessId); + } + + /** + * 删除资产库时,删除资产库中相关表数据 + * @param wsId + * @return + * @author tanj + */ + public boolean deleteReleationDataByWsId(String wsId) { + boolean flag = true; + Connection conn = DBSql.open(); + try { + conn.setAutoCommit(false); + Object[] params = new Object[] { wsId }; + String deleteShapeCopySql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_COPY WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapeCopySql, params); + String deleteShapePasteSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_PASTE WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapePasteSql, params); + String deleteShapeRelationSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_RLAT WHERE FILEID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapeRelationSql, params); + String deleteUpfileSql = "DELETE FROM APP_ACT_COE_PAL_UPFILE WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteUpfileSql, params); + String deleteRepositoryPropertySql = "DELETE FROM APP_ACT_COE_PAL_PROP WHERE PLID IN (SELECT ID FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteRepositoryPropertySql, params); + String deleteFileAttrSql = "DELETE FROM APP_ACT_COE_PAL_ATTR WHERE WSID=?"; + DBSql.update(conn, deleteFileAttrSql, params); + String deleteShapeAttrSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_ATTR WHERE WSID=?"; + DBSql.update(conn, deleteShapeAttrSql, params); + // 判断数据库类型 sqlServer用“+”连接字符串 + String deletePropertySql = "DELETE FROM APP_ACT_COE_PROP WHERE PROPERTYKEY IN (SELECT CONCAT(id, '_attr') AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)" + + " OR PROPERTYKEY IN (SELECT CONCAT('mark_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('link_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('link_app_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('use_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) "; + if (AWSServerConf.getDatabaseProvider().equals("sqlserver")) { + deletePropertySql = "DELETE FROM APP_ACT_COE_PROP WHERE PROPERTYKEY IN (SELECT id+'_attr' AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'mark_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'link_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'link_app_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'use_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) "; + } + DBSql.update(conn, deletePropertySql, new Object[] { wsId, wsId, wsId, wsId, wsId }); + String deleteRepositoryRemoveSql = "DELETE FROM APP_ACT_COE_PAL_REPO_R WHERE WSID=?"; + DBSql.update(conn, deleteRepositoryRemoveSql, params); + String deleteRepositoryRemoveInfoSql = "DELETE FROM APP_ACT_COE_PAL_REPO_R_INFO WHERE WSID=?"; + DBSql.update(conn, deleteRepositoryRemoveInfoSql, params); + String deleteCorrelateSql = "DELETE FROM APP_ACT_COE_PAL_CORRELATE WHERE WSID=?"; + DBSql.update(conn, deleteCorrelateSql, params); + String deleteSpecialAttrSql = "DELETE FROM APP_ACT_COE_PAL_SPCL_PROP WHERE WSID=?"; + DBSql.update(conn, deleteSpecialAttrSql, params); + String deleteBackupSql = "DELETE FROM APP_ACT_COE_PAL_BACKUP WHERE WSID=?"; + DBSql.update(conn, deleteBackupSql, params); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + flag = false; + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + } + DBSql.close(conn); + } + return flag; + } + + // 递归删除该节点下的子节点 + public Map removeTreeNodes(String uuid, String wsId) { + StringBuffer ids = new StringBuffer(); + ids.append(getChildNodes(uuid, wsId, ids.toString())); + ids.append(uuid); + List list = findFilePath(ids.toString()); + boolean f = removeProcessLevel(ids.toString()); + Map map = new HashMap(); + if (f) { + if (ids.indexOf(",") > 0) { + String[] strs = ids.toString().split(","); + for (String str : strs) { + PALRepositoryCache.getCache().remove(str); + CoeDesignerShapeCache.getCache().remove(str);// 移除缓存中文件对应的图形 + // 删除文件对象流程团队中的权限 + boolean isInstalled = AppsAPIManager.getInstance().isInstalled("com.actionsoft.apps.coe.teamwork"); + if (isInstalled) { + TeamPerm teamPerm = new TeamPerm(); + teamPerm.deleteByResourceId(str); + } + } + } else { + PALRepositoryCache.getCache().remove(ids.toString()); + CoeDesignerShapeCache.getCache().remove(ids.toString());// 移除缓存中文件对应的图形 + boolean isInstalled = AppsAPIManager.getInstance().isInstalled("com.actionsoft.apps.coe.teamwork"); + if (isInstalled) { + TeamPerm teamPerm = new TeamPerm(); + teamPerm.deleteByResourceId(ids.toString()); + } + } + map.put("list", list); + map.put("result", "1"); + } else { + map.put("result", "-1"); + } + return map; + } + + // 递归删除该节点下的子节点 + public Map removeTreeNodes(String ids, String uuid, String wsId) { + List filePathList = findFilePath(ids); + boolean f = removeProcessLevel(ids); + Map map = new HashMap(); + if (f) { + map.put("list", filePathList); + map.put("result", "1"); + } else { + map.put("result", "-1"); + } + return map; + } + + private List findFilePath(String ids) { + List list = null; + if (ids.indexOf(",") > 0) { + String[] strs = ids.split(","); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < strs.length; i++) { + sb.append("'").append(strs[i]).append("',"); + } + String s = sb.toString(); + s = s.substring(0, s.lastIndexOf(",")); + String sql = "select " + PALRepositoryModelImpl.FIELD_FILE_PATH + " from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_UUID + " in (" + s + ")"; + list = DBSql.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString(1); + } + }); + } else { + String sql = "select " + PALRepositoryModelImpl.FIELD_FILE_PATH + " from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_UUID + " in ('" + ids + "')"; + list = DBSql.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString(1); + } + }); + } + return list; + } + + // 递归找得到所有子节点 + /** + * @param pid + * @param wsId + * @param str + * @return + */ + public String getChildNodes(String pid, String wsId, String str) { + StringBuffer result = new StringBuffer(); + PALRepositoryModel model = getInstance(pid); + if (model != null) { + if (model.isBottomLevel() == 0) { + List childrenNodes = getCoeProcessLevelAllByPid(pid, wsId); + for (PALRepositoryModel coeProcessLevelModel : childrenNodes) { + result.append(coeProcessLevelModel.getId()).append(","); + result.append(getChildNodes(coeProcessLevelModel.getId(), wsId, result.toString())); + } + } + } + return result.toString(); + } + + // 批量删除子节点 + public boolean removeProcessLevel(String ids) { + boolean completeSuccess = false; + StringBuffer delFiles = new StringBuffer(); + if (!ids.equals("")) { + UtilString ustr = new UtilString(ids); + List v = ustr.split(","); + Connection conn = DBSql.open(); + PreparedStatement ps = null; + ResultSet rset = null; + try { + conn.setAutoCommit(false); + String sql = "DELETE FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + ps = conn.prepareStatement(sql); + for (int i = 0; i < v.size(); i++) { + String id = v.get(i); + ps.setString(1, id); + ps.addBatch(); + PALRepositoryCache.getCache().remove(id); + } + int[] results = ps.executeBatch(); + for (int i = 0; i < results.length; i++) { + if ((results[i] >= 0) || (results[i] == PreparedStatement.SUCCESS_NO_INFO)) { + completeSuccess = true; + } + } + if (completeSuccess) { + conn.commit(); + } else { + conn.rollback(); + PALRepositoryCache.getCache().reload(); + } + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn, ps, rset); + } + if (completeSuccess) {// 删除文件 + UtilString utilS = new UtilString(delFiles.toString()); + List split = utilS.split(","); + for (String pathname : split) { + CoeFile coeFile = new CoeFile(); + coeFile.removeFileOfPath(pathname); + } + } + } + return completeSuccess; + } + + /** + * 删除流程版本 + * + * @param id 要删除的版本ID + * @return + */ + public String deletePalRepositoryVersion(String id) { + PALRepositoryModel model = PALRepositoryCache.getCache().get(id); + String selectSql = "SELECT id FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE PLVERSIONID=? AND ISUSE=1"; + String usedId = null; // 该流程正在使用的版本ID + List usedIds = DBSql.query(selectSql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString(1); + } + }, model.getVersionId()); + if (usedIds != null && usedIds.size() > 0) { + usedId = usedIds.get(0); + } + if (usedId != null && !usedId.equals(id)) { + String updateSql = "UPDATE APP_ACT_COE_PAL_REPOSITORY SET PLPARENTID=? WHERE PLPARENTID=?"; + int r = DBSql.update(updateSql, new Object[] { usedId, id }); + if (r > 0) { + // 获取该版本的所有子流程 + Iterator list = PALRepositoryCache.getByPid(model.getWsId(), id); + // 将子流程的pid改为改流程正在使用的版本ID + while (list.hasNext()) { + PALRepositoryModelImpl childModel = (PALRepositoryModelImpl) list.next(); + childModel.setParentId(usedId); + PALRepositoryCache.getCache().put(childModel.getId(), childModel); + } + } + } + // 删除该流程版本 + String delSql = "delete from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where id=?"; + int result = DBSql.update(delSql, new Object[] { id }); + if (result > 0) { + PALRepositoryCache.getCache().remove(id); + } + return result + ""; + } + + // 递归更新该节点下的所有层级 + public String getChildNodesAndUpdateLevel(PALRepositoryModel model) { + StringBuffer error = new StringBuffer(); + if (model.isBottomLevel() == 0) {// 高层流程 + List childrenNodes = getCoeProcessLevelByPid(model.getId(), model.getWsId()); + for (PALRepositoryModel coeProcessLevelModel : childrenNodes) { + ((PALRepositoryModelImpl) coeProcessLevelModel).setLevel(model.getLevel() + 1); + try { + // 更新相应层级 + this.update(coeProcessLevelModel); + error.append("1"); + } catch (Exception e) { + error.append("-1"); + e.printStackTrace(); + } + getChildNodesAndUpdateLevel(coeProcessLevelModel); + } + } + if (error.toString().indexOf("-1") > -1) { + return "-1"; + } else { + return "1"; + } + } + + /** + * 获取流程清单分页数据 + * + * @param start + * @param limit + * @return + */ + public List getCoeProcessLevelModelRecodes(int start, int limit, String wsId, String conditions) { + return getCoeProcessLevelModelRecodes(start, limit, PALRepositoryModelImpl.FIELD_PL_LEVEL, true, false, wsId, conditions); + } + + /** + * 获取总记录数 + * + * @param start + * @param limit + * @return + */ + public int getSumRecodes(String wsId, String cond) { + List args = new ArrayList(); + String sql = "select count(*) as c from " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' " + getSqlByConditions(cond, args); + int countData = DBSql.getInt(sql, args.toArray()); + return countData; + } + + /** + * 获取流程清单数据 + * + * @param start + * @param limit + * @param sortFiled + * @param upOrDown 是否升序(默认升序) + * @param isPaging 是否分页 + * @return + */ + public List getCoeProcessLevelModelRecodes(int start, int limit, String sortFiled, boolean isUp, boolean isPaging, String wsId, String conditions) { + List list = new ArrayList(); + String upOrDown = "ASC"; + try { + if (!isUp) { + upOrDown = "DESC"; + } + List args = new ArrayList(); + String sql = getSql(sortFiled, wsId, conditions, upOrDown, args); + if (isPaging) { + sql = SQLPagination.getPaginitionSQL(sql, start, limit); + } + list = DBSql.query(sql, new PALRespositoryModelMapper(), args.toArray()); + } catch (Exception sqle) { + sqle.printStackTrace(); + } + List newList = CoeProcessLevelUtil.getListByProcessLevelPlNo(list); + return newList; + } + + public String getSql(String sortFiled, String wsId, String conditions, String upOrDown, List args) { + String sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' " + getSqlByConditions(conditions, args) + " and " + PALRepositoryModelImpl.FIELD_IS_USE + "=1 and " + PALRepositoryModelImpl.FIELD_PL_CATEGORY + "='process' ORDER BY " + sortFiled + " " + upOrDown + " , " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return sql; + } + + private String validateJson(String name) { + return name == null ? "" : name; + } + + public String getSqlByConditions(String conditions, List args) { + StringBuffer sql = new StringBuffer(); + if (!conditions.equals("")) { + JSONObject json = JSONObject.parseObject(conditions); + String name = validateJson(json.getString("name")).toLowerCase(); + String plRd = validateJson(json.getString("plRd")); + String plRp = validateJson(json.getString("plRp")); + String plColor = validateJson(json.getString("plColor")); + int plM = json.getInteger("plM"); + int execType = json.getInteger("execType"); + String plevel = validateJson(json.getString("plLevel")); + String plNodeId = validateJson(json.getString("plNodeId")); + String wsId =validateJson( json.getString("wsId")); + String dutyDept = validateJson(json.getString("dutyDept")); + String dutyPerson =validateJson( json.getString("dutyPerson")); + String namelike = ""; + + if (!name.equals("")) { + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql.append(" AND LOWER(" + PALRepositoryModelImpl.FIELD_PL_NAME).append(") like " + namelike); + } + if (!plRd.equals("")) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_RD + " IN (SELECT DISTINCT(RELATIONSHAPEID) FROM APP_ACT_COE_PAL_SHAPE_RLAT WHERE RELATIONSHAPETEXT LIKE '%" + plRd + "%' AND ATTRID = 'plRD')"); + } + if (!plRp.equals("")) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_RP + " IN (SELECT DISTINCT(RELATIONSHAPEID) FROM APP_ACT_COE_PAL_SHAPE_RLAT WHERE RELATIONSHAPETEXT LIKE '%" + plRp + "%' AND ATTRID = 'plRP')"); + } + if (!plColor.equals("") && !plColor.equals("-1")) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_COLOR).append(" = '").append(plColor).append("'"); + } + if (plM != -1) { + if (AWSServerConf.isPostgreSQL()) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_M).append(" = '").append(plM).append("'"); + } else { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_M).append(" = ").append(plM); + } + } + if (execType != -1) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_EXEC_TYPE).append(" = ").append(execType); + } + if (!plevel.equals("-1") && !plevel.equals("")) { + int level = Integer.parseInt(plevel); + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_IS_BOTTOM_LEVEL).append(" = ").append(level); + } + if (!plNodeId.equals("") && !wsId.equals("")) { + List list = new ArrayList(); + PALRepositoryQueryAPIManager.getInstance().getAllUsedPalRepositoryModelsByPid(wsId, plNodeId, list); + StringBuffer oldIds = new StringBuffer(); + oldIds.append(",'").append(plNodeId).append("'"); + for (PALRepositoryModel model : list) { + oldIds.append(",'").append(model.getId()).append("'"); + } + String ids = oldIds.toString(); + ids = ids.substring(ids.indexOf(",") + 1); + sql.append(" AND " + PALRepositoryModelImpl.FIELD_UUID).append(" in (").append(ids).append(")"); + } + if (!UtilString.isEmpty(dutyDept)) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_DUTY_DEPT).append(" = '").append(dutyDept).append("' "); + } + if (!UtilString.isEmpty(dutyPerson)) { + sql.append(" AND " + PALRepositoryModelImpl.FIELD_PL_DUTY_PERSON).append(" = '").append(dutyPerson).append("' "); + } + } + return sql.toString(); + } + + public int getMaxLevel() { + String sql = "select max(" + PALRepositoryModelImpl.FIELD_PL_LEVEL + ") as c from " + PALRepositoryModelImpl.DATABASE_ENTITY; + int maxLevel = DBSql.getInt(sql, "c"); + return maxLevel; + + } + + // 获取该空间下的最大分级 + public int getMaxLevel(String wsId) { + String sql = "select max(" + PALRepositoryModelImpl.FIELD_PL_LEVEL + ") as c from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + " = '" + wsId + "'"; + int maxLevel = DBSql.getInt(sql, "c"); + return maxLevel; + } + + public int getManLevelByWsId(String wsId) { + String sql = "SELECT MAX(" + PALRepositoryModelImpl.FIELD_PL_LEVEL + ") AS c FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + " = :wsId "; + Map paraMap = new HashMap(); + paraMap.put("wsId", wsId); + return DBSql.getInt(sql, "c", paraMap); + } + + public int getChildrenIndex(String id) { + PALRepositoryModel model = getInstance(id); + List list = getCoeProcessLevelByPid(model.getParentId(), model.getWsId()); + for (int i = 0; i < list.size(); i++) { + PALRepositoryModel m = list.get(i); + if (m.getId() == model.getId()) { + return i; + } + } + return 0; + } + + public PALRepositoryModel getChildrenModelByIndex(String id, int idx) { + PALRepositoryModel model = getInstance(id); + List list = getCoeProcessLevelByPid(model.getParentId(), model.getWsId()); + for (int i = 0; i < list.size(); i++) { + if (i == idx) { + PALRepositoryModel m = list.get(i); + return m; + } + } + return null; + } + + /** + * 获取文件的下级文件的最大orderIndex + * + * @param palId + * @return + * @author zhangming + */ + public int getChildrenMaxOrderIndex(String palId) { + String sql = "SELECT MAX(PLORDERINDEX) AS orderIndex FROM APP_ACT_COE_PAL_REPOSITORY WHERE PLPARENTID IN " + "(SELECT r1.id FROM APP_ACT_COE_PAL_REPOSITORY r1, APP_ACT_COE_PAL_REPOSITORY r2 WHERE r1.PLVERSIONID = r2.PLVERSIONID AND r2.id='" + palId + "')" + " OR PLPARENTID = '" + palId + "'"; + int maxOrderIndex = DBSql.getInt(sql, "orderIndex"); + return maxOrderIndex; + } + + /** + * 获取文件的下级文件的最大orderIndex + * 在不同的资产库根节点(palId)都相同,增加资产库避免统计时错误 + * @param palId + * @param wsId + * @return + * @author sunlh + */ + public int getChildrenMaxOrderIndexByPidAndWsId(String palId, String wsId) { + String sql = "SELECT MAX(PLORDERINDEX) AS orderIndex FROM APP_ACT_COE_PAL_REPOSITORY WHERE 1=1 AND PLPARENTID = '"+palId+"' AND WSID='"+wsId+"'"; + //String sql = "SELECT MAX(PLORDERINDEX) AS orderIndex FROM APP_ACT_COE_PAL_REPOSITORY WHERE (PLPARENTID IN " + "(SELECT r1.id FROM APP_ACT_COE_PAL_REPOSITORY r1, APP_ACT_COE_PAL_REPOSITORY r2 WHERE r1.PLVERSIONID = r2.PLVERSIONID AND r2.id='" + palId + "')" + " OR PLPARENTID = '" + palId + "') AND wsid='" + wsId +"'"; + int maxOrderIndex = DBSql.getInt(sql, "orderIndex"); + return maxOrderIndex; + } + + /** + * 获取该空间下的所有流程分级 + * + * @param wsId + * @return + */ + public List getModels(String wsId) { + List list = PALMethodCache.getPALMethodList(); + String[] cates = new String[list.size()]; + list.toArray(cates); + return getModels(wsId, cates, false); + } + + /** + * 获取流程分类下的所有流程分级 + * + * @param wsId + * @return + */ + public List getModelsOfPorcess(String wsId) { + String[] array = { "process" }; + return getModels(wsId, array, false); + } + + /** + * 获取该空间下所有流程分级-显示状态 + * + * @param wsId + * @return + */ + public List getModels(String wsId, String[] categories, boolean isUse) { + StringBuffer sql = new StringBuffer(); + StringBuffer tempCate = new StringBuffer(); + sql.append("SELECT * FROM ").append(PALRepositoryModelImpl.DATABASE_ENTITY).append(" WHERE ").append(PALRepositoryModelImpl.FIELD_WS_ID).append("= '").append(wsId).append("'"); + /* for (int i = 0, size = categories.length; i < size; i++) { if (i == size - 1) { tempCate.append(" and ").append(PALRepositoryModel .FIELD_PL_CATEGORY ).append("='").append(categories[i]).append("'"); break; } tempCate .append(" ").append(PALRepositoryModelImpl.FIELD_PL_CATEGORY ).append("='").append(categories[i]).append("' or "); } */ + sql.append(tempCate.toString()); + if (isUse) { + sql.append(" and ").append(PALRepositoryModelImpl.FIELD_IS_USE).append("=1 "); + } + sql.append(" ORDER BY ").append(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX).append(" ASC"); + + // sql.append(" and PLMETHODID<>'default' ORDER BY ").append(PALRepositoryModelImpl.FIELD_PL_ORDERINDEX).append(" ASC"); + return DBSql.query(sql.toString(), new PALRespositoryModelMapper()); + } + + public List getModels(String wsId, String pid) { + String sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "= '" + wsId + "' AND " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "='" + pid + "' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + public List getModels(String wsId, String sort, int level, String pid) { + String sql; + if (pid.length() < 36) { + sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "= '" + wsId + "' AND " + PALRepositoryModelImpl.FIELD_PL_LEVEL + "= " + level + " AND " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + "='" + pid + "' ORDER BY " + sort + ", " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + } else { + sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "= '" + wsId + "'" + " AND " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + " IN (" + " SELECT r1.ID FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " r1, " + PALRepositoryModelImpl.DATABASE_ENTITY + " r2 WHERE r2.ID = '" + pid + "' AND r1.PLVERSIONID = r2.PLVERSIONID)" + " ORDER BY " + sort + ", " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + } + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取模型中的数据 + * @param wsId + * @param conditions + * @return + * @author tanj + */ + public List getArrayModels(String wsId, String conditions) { + List args = new ArrayList(); + String sql = com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory.createCoeProcessLevel().getSql(PALRepositoryModelImpl.FIELD_PL_LEVEL, wsId, conditions, "ASC", args); + return DBSql.query(sql, new PALRespositoryModelMapper(), args.toArray()); + } + + // 获取所有模型 + public Map getALLModels(String wsId, String conditions) { + Map map = new HashMap(); + String sql = ""; + List args = new ArrayList(); + sql = com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory.createCoeProcessLevel().getSql(PALRepositoryModelImpl.FIELD_PL_LEVEL, wsId, conditions, "ASC", args); + int i = 0; + List models = DBSql.query(sql, new PALRespositoryModelMapper(), args.toArray()); + List newList = CoeProcessLevelUtil.getListByProcessLevelPlNo(models); // 转化排序list + for (PALRepositoryModel model : newList) { + List cells = getModelsToList(model, i, wsId); + map.put(i, cells); + i++; + } + return map; + } + + public List getModelsToList(PALRepositoryModel model, int ii, String wsId) { + List filedList = new ArrayList(); + String relationType = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_RELATION_TYPE); + + String plNo = CoeProcessLevelUtil.getProcessLevelNoByUUId(model.getId(), wsId); + // filedList.add(plNo); + // filedList.add(model.getPlName()); + int maxLevel = com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory.createCoeProcessLevel().getMaxLevel(wsId); + filedList.add(I18nRes.findValue(CoEConstant.APP_ID, model.getMethodId())); + for (int i = 1; i <= maxLevel; i++) { + if (i == model.getLevel()) { + filedList.add((plNo.length() == 1 ? "" : plNo) + " " + I18nRes.findValue(CoEConstant.APP_ID, model.getName()) + "|"); + } else { + filedList.add(""); + } + } + filedList.add(""); + // String deptId = model.getPlRd(); + // String name = ""; + // if (!deptId.equals("")) { + // String[] deptIds = deptId.split(" "); + // for (int i = 0; i < deptIds.length; i++) { + // DepartmentModel deptModel = (DepartmentModel) + // DepartmentCache.getModel(deptIds[i]); + // if (deptModel != null) { + // name += deptModel.getDepartmentName() + " "; + // } + // } + // } + String dutyDept = model.getDutyDept(); + String dutyDeptName = ""; + if (!UtilString.isEmpty(dutyDept)) { + if (SDK.getORGAPI().getDepartmentById(dutyDept) != null) { + dutyDeptName = SDK.getORGAPI().getDepartmentById(dutyDept).getName(); + } + } + String dutyPerson = model.getDutyUser(); + String dutyPersonName = UtilString.isEmpty(dutyPerson) ? "" : SDK.getORGAPI().getUserAliasNames(dutyPerson); + if ("org".equals(relationType)) { + filedList.add(model.getOwnerDept()); + filedList.add(model.getOwnerUser()); + } else if ("address".equals(relationType)) { + filedList.add(dutyDeptName); + filedList.add(dutyPersonName); + } else { + filedList.add(model.getOwnerDept()); + filedList.add(model.getOwnerUser()); + } + filedList.add(CoeProcessLevelUtil.getPlM(model.getMilestone())); + filedList.add(CoeProcessLevelUtil.getPlExecType(model.getExecType())); + // filedList.add(CoeProcessLevelUtil.getSystemName(model.getSystemName())); + filedList.add(model.getColor()); + filedList.add(model.getId()); + + return filedList; + } + + public List getALLModelsShowFields(String wsId) { + List filedList = new ArrayList(); + int maxLevel = CoeProcessLevelDaoFacotory.createCoeProcessLevel().getMaxLevel(wsId); + // filedList.add("编\n号"); + // filedList.add("标题"); + for (int i = 0; i <= maxLevel; i++) { + String level = Number2ChineseNumUtil.convertChineseStr(String.valueOf(i)); + if (i == 0) { + filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "流程分类"))); + } else { + + filedList.add("\n" + I18nRes.findValue(CoEConstant.APP_ID, level) + getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "级流程"))); + } + } + + filedList.add(""); + filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "责任部门"))); + filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "责任人"))); + filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "里程碑"))); + filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "执行方式"))); + // filedList.add(getTitleName(I18nRes.findValue(CoEConstant.APP_ID, "系统名称"))); + return filedList; + } + + private static String getTitleName(String title) { + if (I18nRes.getUserLanguage().equals("en")) { + return title; + } else { + StringBuffer sb = new StringBuffer(); + String[] split = title.split(""); + for (int i = 0; i < split.length; i++) { + sb.append(split[i] + "\n"); + } + return sb.toString(); + } + } + + // 获得分组信息 + public List getGroupModel(String wsId) { + String sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE " + PALRepositoryModelImpl.FIELD_WS_ID + "= '" + wsId + "' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_PARENT_ID + ", " + PALRepositoryModelImpl.FIELD_PL_LEVEL + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 通过type 类型返回相应的统计数据 + * + * @param projectUUID + * @return + */ + public String getPlPieData(final String type, String wsId, String condition) { + Connection conn = null; + java.sql.Statement stmt = null; + ResultSet rset = null; + List args = new ArrayList(); + String sql = getSqlByType(type, wsId, condition, args); + final String fieldName = getField(type); + Map flotDataMap = new HashMap(); + List flotData = new ArrayList(); + flotDataMap.put("flotDataMap", flotData); + if (!sql.equals("")) { + flotData = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + String name = getShowName(type, rs, fieldName); + result.put("label", name + "," + rs.getInt("coun") + ""); + result.put("data", rs.getInt("coun")); + return result; + } + }, args.toArray()); + } + if (flotData.size() == 0) { + Map flotItem = new HashMap(); + flotItem.put("label", ""); + flotItem.put("data", 1); + flotData.add(flotItem); + } + return JSONObject.parseObject(JSON.toJSONString(flotDataMap)).get("flotDataMap").toString(); + } + + /** + * 通过type类型返回相应的统计数据 + * + * @param projectUUID + * @return + */ + public Map>> getProcessReportCount(final String type, String wsId, String condition) { + Connection conn = null; + java.sql.Statement stmt = null; + ResultSet rset = null; + List args = new ArrayList(); + String sql = getSqlByType(type, wsId, condition, args); + final String fieldName = getField(type); + Map>> flotDataMap = new HashMap(); + List> flotData = new ArrayList(); + if (!sql.equals("")) { + flotData = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + String name = getShowName(type, rs, fieldName); + result.put("value", rs.getInt("coun")); + result.put("name", name); + return result; + } + }, args.toArray()); + } + if (flotData.size() == 0) { + Map flotItem = new HashMap(); + flotItem.put("name", I18nRes.findValue(CoEConstant.APP_ID, "无数据")); + flotItem.put("data", 1); + flotData.add(flotItem); + } + flotDataMap.put("flotDataMap", flotData); + return flotDataMap; + } + + private String getField(String type) { + String fieldName = ""; + if (type.equals(CoeProcessLevelConstant.PLM)) { // 按里程碑 + fieldName = "PM"; + } else if (type.equals(CoeProcessLevelConstant.PLISBOTTOM)) { // 层级 + fieldName = "PLISBOTTOMLEVEL"; + } else if (type.equals(CoeProcessLevelConstant.PLCOLOR)) { // 颜色标记 + fieldName = "PLCOLOR"; + } else { + fieldName = "PLEXECTYPE"; // 按执行方式 + } + return fieldName; + } + + public String getSqlByType(String type, String wsId, String condition, List args) { + StringBuffer sql = new StringBuffer(); + String fieldName = getField(type); + if (!fieldName.equals("")) { + sql.append("SELECT "); + sql.append("p." + fieldName + ",COUNT(p." + fieldName + ") AS coun "); + sql.append(" FROM "); + sql.append(PALRepositoryModelImpl.DATABASE_ENTITY + " p"); + sql.append(" where p." + PALRepositoryModelImpl.FIELD_WS_ID + " = '" + wsId + "' AND p." + PALRepositoryModelImpl.FIELD_IS_USE + "='1' AND p." + PALRepositoryModelImpl.FIELD_PL_CATEGORY + "='process' and " + PALRepositoryModelImpl.FIELD_PL_METHODID + "<> 'default' "); + sql.append(getSqlByConditions(condition, args)); + sql.append(" GROUP BY p." + fieldName + ""); + } + return sql.toString(); + } + + private String getShowName(String type, ResultSet rset, String fieldName) throws SQLException { + String name = ""; + if (type.equals(CoeProcessLevelConstant.PLM)) { // 按里程碑 + name = CoeProcessLevelUtil.getPlM(String.valueOf(rset.getInt(fieldName))); + } else if (type.equals(CoeProcessLevelConstant.PLISBOTTOM)) { // 层级 + name = CoeProcessLevelUtil.getPlIsBottom(rset.getInt(fieldName)); + } else if (type.equals(CoeProcessLevelConstant.PLCOLOR)) { // 颜色标记 + name = CoeProcessLevelUtil.getPlColor(rset.getString(fieldName) == null ? "" : rset.getString(fieldName)); + } else { + name = CoeProcessLevelUtil.getPlExecType(rset.getInt(fieldName)); + } + if (name.trim().equals("")) { + name = ""; + } + return name; + } + + /** + * 获取所有使用中的资产库文件 + * + * @param wsId + * @return + */ + public List getCoeProcessLevelByWsId(String wsId) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' AND " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取所有资产库文件(所有版本) + * + * @param wsId + * @return + */ + public List getAllCoeProcessLevelByWsId(String wsId) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 查询process类型的文件 + * + * @param wsId + * @return + */ + public List getCoePPLevelByWsId(String wsId) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' AND " + PALRepositoryModelImpl.FIELD_IS_USE + "='1' AND " + PALRepositoryModelImpl.FIELD_PL_CATEGORY + "='process' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + // 执行方式数量 + public int getCoeProcessLevelExecTypeCount(String wsId) { + String sql = "select count(*) coun from APP_ACT_COE_PAL_REPOSITORY where PLEXECTYPE='1' and WSID='" + wsId + "'"; + return DBSql.getInt(sql, "coun"); + } + + public List> getCoeProcessLevelSystemNameCount(String wsId) { + String sql = "select pn.SYSTEMNAME n,count(*) c from APP_ACT_COE_PAL_REPOSITORY p,APP_ACT_COE_PAL_SYSTEMNAME pn where p.PLSYSTEMNAME=pn.id and p.wsid='" + wsId + "' GROUP BY pn.SYSTEMNAME order by c desc"; + return DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map mapValue = new HashMap(); + mapValue.put("count", rs.getInt("c")); + mapValue.put("name", rs.getString("n")); + return mapValue; + } + }); + } + + public List getCoeProcessLevelBySql(String sql) { + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 根据uuid获取保存次数 + * + * @param uuid + * @return + * @author renmm + */ + public int getHistoryMaxVersion(final String uuid) { + + HashMap paraMap = new HashMap(); + paraMap.put(PALRepositoryModelImpl.FIELD_UUID, uuid); + + int historyMaxVersion = DBSql.getInt("SELECT " + PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION + " FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE ID =:ID", PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION, paraMap); + return historyMaxVersion; + } + + public int saveHistoryMaxVersion(final String uuid, int ver) { + + HashMap paraMap = new HashMap(); + paraMap.put(PALRepositoryModelImpl.FIELD_UUID, uuid); + paraMap.put(PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION, ver); + return DBSql.update("update " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION + " =:" + PALRepositoryModelImpl.FIELD_HISTORYMAXVERSION + " where ID =:ID", paraMap); + } + + public List getListProcessLevelByVersionUuid(String verUuid) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + " ='" + verUuid + "'" + " order by plver asc"; + return getCoeProcessLevelBySql(sql); + } + + /** + * 返回指定版本的最大版本号 + * + * @param versionUuid + * @return + */ + public int getMaxVersionNum(String versionUuid) { + String sql = "select max(" + PALRepositoryModelImpl.FIELD_PL_VER + ") as c from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + "='" + versionUuid + "'"; + return DBSql.getInt(sql, "c"); + } + + public double getMaxVersionNum(String versionUuid,double versionNo) { + String sql = "select max(" + PALRepositoryModelImpl.FIELD_PL_VER + ") as c from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + "='" + versionUuid + "' and "+ PALRepositoryModelImpl.FIELD_PL_VER+" >="+versionNo+" and "+PALRepositoryModelImpl.FIELD_PL_VER+" < "+ (VersionUtil.getIntNum(versionNo) + 1); + return DBSql.getDouble(sql, "c"); + } + + /** + * 更新状态为0 + * + * @param versionUuid + * @return + */ + public int updateStateOfVersionUuid(String versionUuid) { + int answer = 0; + String sql = "update " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_IS_USE + "= 0 where " + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + "='" + versionUuid + "'"; + answer = DBSql.update(sql); + String searchSql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + " = '" + versionUuid + "'"; + List list = DBSql.query(searchSql, new PALRespositoryModelMapper()); + if (list != null && list.size() > 0) { + for (PALRepositoryModel model : list) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + } + return answer; + } + + /** + * 更新指定版本状态为1 + * + * @param uuid + * @return + */ + public int updateUseStateOfVersionUuid(String uuid) { + int answer = 0; + String sql = "update " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_IS_USE + "= 1 where " + PALRepositoryModelImpl.FIELD_UUID + "='" + uuid + "'"; + answer = DBSql.update(sql); + if (answer > 0) { + PALRepositoryModelImpl model = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + model.setUse(true); + PALRepositoryCache.getCache().put(model.getId(), model); + } + return answer; + } + + /** + * 根据文件uuid获得正在使用的workspace中对应文件的信息 + * + * @param uuid + * @return + */ + public PALRepositoryModel getUsingPlUuid(String uuid) { + String sql = "SELECT r1.* FROM APP_ACT_COE_PAL_REPOSITORY r1, APP_ACT_COE_PAL_REPOSITORY r2, APP_ACT_COE_PAL_WORKSPACE w" + " WHERE r2." + PALRepositoryModelImpl.FIELD_UUID + " = '" + uuid + "'" + " AND r1." + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + " = r2." + PALRepositoryModelImpl.FIELD_PL_VERSION_UUID + " AND r1." + PALRepositoryModelImpl.FIELD_WS_ID + " = w." + CoeWorkSpaceModel.FIELD_UUID + " AND w." + CoeWorkSpaceModel.FIELD_IS_USE + " = 1" + " AND r1." + PALRepositoryModelImpl.FIELD_IS_USE + " = 1"; + return DBSql.getObject(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取文件的使用版本或发布版本 + * + * @param plVersionId + * @param type used/published + * @return + * @author zhangming + */ + public PALRepositoryModel getUserOrPublishedVersionId(String plVersionId, String type) { + StringBuilder sql = new StringBuilder("SELECT * FROM APP_ACT_COE_PAL_REPOSITORY WHERE PLVERSIONID=?"); + if ("used".equals(type)) { + sql.append(" AND ISUSE=1"); + } else if ("published".equals(type)) { + sql.append(" AND ISPUBLISH=1"); + } + return DBSql.getObject(sql.toString(), new PALRespositoryModelMapper(), plVersionId); + } + + /** + * copy图形到数据库 + * + * @param model + */ + public boolean createShape(List list) { + Connection conn = DBSql.open(); + PreparedStatement prest = null; + try { + conn.setAutoCommit(false); + String sql = "insert into " + DesignerShapeCopyModel.DATABASE_ENTITY + "(" + DesignerShapeCopyModel.FIELD_SHAPE_ID + "," + DesignerShapeCopyModel.FIELD_SHAPE_GROUPT_ID + "," + DesignerShapeCopyModel.FIELD_SHAPE_NAME + "," + DesignerShapeCopyModel.FIELD_SHAPE_CATEGORY_NAME + "," + DesignerShapeCopyModel.FIELD_PAL_REPOSITORY_ID + "," + DesignerShapeCopyModel.FIELD_SHAPE_TYPE + "," + DesignerShapeCopyModel.FIELD_IS_DELETE + ") VALUES(?,?,?,?,?,?,?)"; + prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); + for (int i = 0; i < list.size(); i++) { + DesignerShapeCopyModel model = list.get(i); + if (isExistShapeGroup(model.getShapeGroupId())) {// 如果存在此图形则更新 + String sql1 = "update " + DesignerShapeCopyModel.DATABASE_ENTITY + " set " + DesignerShapeCopyModel.FIELD_SHAPE_GROUPT_ID + " =:d where " + DesignerShapeCopyModel.FIELD_SHAPE_ID + " =:s "; + int r = DBSql.update(sql1, new Object[] { model.getShapeGroupId(), model.getShapeId() }); + continue; + } + if (isExistShape(model.getShapeId())) { + continue; + } + prest.setString(1, model.getShapeId()); + prest.setString(2, model.getShapeGroupId()); + // prest.setString(3, model.getShapeMessage()); + prest.setString(3, model.getShapeName()); + prest.setString(4, model.getShapecategoryName()); + prest.setString(5, model.getPalRepositoryId()); + prest.setString(6, model.getShapeType()); + prest.setString(7, model.getIsDelete()); + prest.addBatch(); + } + prest.executeBatch(); + conn.commit(); + return true; + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn, prest, null); + } + return false; + } + + /** + * 查询是不是第一次复制该组的图形 + * + * @param shapeGroupId + * @return + */ + public boolean isExistShapeGroup(String shapeId) { + String sql = "select count(" + DesignerShapeCopyModel.FIELD_SHAPE_ID + ") from " + DesignerShapeCopyModel.DATABASE_ENTITY + " where " + DesignerShapeCopyModel.FIELD_SHAPE_GROUPT_ID + "='" + shapeId + "'"; + return DBSql.getInt(sql, new Object[]{}) != 0; + } + + /** + * 查询是不是第一次复制该的图形 + * + * @param shapeGroupId + * @return + */ + public boolean isExistShape(String shapeId) { + String sql = "select count(" + DesignerShapeCopyModel.FIELD_SHAPE_ID + ") from " + DesignerShapeCopyModel.DATABASE_ENTITY + " where " + DesignerShapeCopyModel.FIELD_SHAPE_ID + "='" + shapeId + "'"; + return DBSql.getInt(sql, new Object[]{}) != 0; + } + + /** + * 如果是复制的的别的组的图形则删除 + * + * @param shapeId + * @return + */ + public boolean isDelete(String shapeId, DesignerShapePasteModel model) { + String sql = "select count(" + DesignerShapePasteModel.FIELD_SHAPE_ID + ") as number from " + DesignerShapePasteModel.DATABASE_ENTITY + " where " + DesignerShapePasteModel.FIELD_SHAPE_ID + "='" + shapeId + "' and " + DesignerShapePasteModel.FIELD_IS_PASTE + "='Y'"; + try { + if (DBSql.getInt(sql, "number") != 0) { + model.setIsPaste("N"); + return true; + } + } catch (AWSDataAccessException e) { + e.printStackTrace(); + } + return false; + } + + public boolean pasteToDatabse(List list) { + Connection conn = DBSql.open(); + PreparedStatement prest = null; + try { + conn.setAutoCommit(false); + String sql = "insert into " + DesignerShapePasteModel.DATABASE_ENTITY + "(" + DesignerShapePasteModel.FIELD_SHAPE_ID + "," + DesignerShapePasteModel.FIELD_SHAPE_GROUPT_ID + "," + DesignerShapePasteModel.FIELD_SHAPE_NAME + "," + DesignerShapePasteModel.FIELD_SHAPE_CATEGORY_NAME + "," + DesignerShapePasteModel.FIELD_PAL_REPOSITORY_ID + "," + DesignerShapePasteModel.FIELD_SHAPE_TYPE + "," + DesignerShapePasteModel.FIELD_IS_DELETE + ") VALUES(?,?,?,?,?,?,?)"; + prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); + for (int i = 0; i < list.size(); i++) { + DesignerShapePasteModel model = list.get(i); + prest.setString(1, model.getId()); + prest.setString(2, model.getShapeGroupId()); + // prest.setString(3, model.getShapeMessage()); + prest.setString(3, model.getShapeName()); + prest.setString(4, model.getShapecategoryName()); + // prest.setString(6, model.getIsPaste()); + prest.setString(5, model.getPalRepositoryId()); + prest.setString(6, model.getShapeType()); + prest.setString(7, model.getIsDelete()); + prest.addBatch(); + } + prest.executeBatch(); + conn.commit(); + return true; + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn, prest, null); + } + return false; + } + + /** + * 根据shapeGroupId找到图形 出现在哪些文件中 + * + * @param shapeGroupId + * @param b + * @return + */ + public Set> getFileIdsList(String shapeGroupId, String uuid) { + String sql1 = "select " + DesignerShapeCopyModel.FIELD_PAL_REPOSITORY_ID + ", " + DesignerShapeCopyModel.FIELD_SHAPE_ID + " from " + DesignerShapeCopyModel.DATABASE_ENTITY + " where " + DesignerShapeCopyModel.FIELD_SHAPE_GROUPT_ID + "=?"; + List> list1 = new ArrayList>(); + + try { + list1 = DBSql.query(sql1, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("palRepositoryId", rs.getString(1)); + map.put("shapeId", rs.getString(2)); + return map; + } + }, shapeGroupId); + + } catch (Exception e) { + e.printStackTrace(); + } + + String sql2 = "select " + DesignerShapePasteModel.FIELD_PAL_REPOSITORY_ID + ", " + DesignerShapePasteModel.FIELD_SHAPE_ID + " from " + DesignerShapePasteModel.DATABASE_ENTITY + " where " + DesignerShapePasteModel.FIELD_SHAPE_GROUPT_ID + "=?"; + List> list2 = new ArrayList>(); + try { + list2 = DBSql.query(sql2, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("palRepositoryId", rs.getString(1)); + map.put("shapeId", rs.getString(2)); + return map; + } + }, shapeGroupId); + + } catch (Exception e) { + e.printStackTrace(); + } + Set> set = new HashSet>(); + if (list1 != null && list1.size() > 0) { + set.addAll(list1); + } + if (list2 != null && list2.size() > 0) { + set.addAll(list2); + } + return set; + } + + /** + * 获取模型文件中的所有复制信息 + * + * @param repositoryId 模型Id + * @return + * @author zhangming + */ + public List getShapeCopyModelsByRepositoryId(String repositoryId) { + String sql = "SELECT * FROM " + DesignerShapeCopyModel.DATABASE_ENTITY + " WHERE PALREPOSITORYID=?"; + return DBSql.query(sql, new RowMapper() { + @Override + public DesignerShapeCopyModel mapRow(ResultSet rs, int arg1) throws SQLException { + DesignerShapeCopyModel model = new DesignerShapeCopyModel(); + model.setId(rs.getString("ID")); + model.setShapeGroupId(rs.getString("SHAPEGROUPTID")); + model.setShapeName(rs.getString("SHAPENAME")); + model.setShapecategoryName(rs.getString("SHAPECATEGORYNAME")); + model.setPalRepositoryId(rs.getString("PALREPOSITORYID")); + model.setIsDelete(rs.getString("ISDELETE")); + model.setShapeType(rs.getString("SHAPETYPE")); + return model; + } + }, repositoryId); + } + + /** + * 获取模型文件中的所有粘贴信息 + * + * @param repositoryId 模型Id + * @return + * @author zhangming + */ + public List getShapePasteModelsByRepositoryId(String repositoryId) { + String sql = "SELECT * FROM " + DesignerShapePasteModel.DATABASE_ENTITY + " WHERE PALREPOSITORYID=?"; + return DBSql.query(sql, new RowMapper() { + @Override + public DesignerShapePasteModel mapRow(ResultSet rs, int arg1) throws SQLException { + DesignerShapePasteModel model = new DesignerShapePasteModel(); + model.setId(rs.getString("ID")); + model.setShapeGroupId(rs.getString("SHAPEGROUPTID")); + model.setShapeName(rs.getString("SHAPENAME")); + model.setShapecategoryName(rs.getString("SHAPECATEGORYNAME")); + model.setPalRepositoryId(rs.getString("PALREPOSITORYID")); + model.setIsDelete(rs.getString("ISDELETE")); + model.setShapeType(rs.getString("SHAPETYPE")); + return model; + } + }, repositoryId); + } + + /** + * 图形出现复制的统计 + */ + + public List> designerRelationShapeCount(String shapeGroupId, String shapeId, String isCopy) { + List> list1 = new ArrayList>(); + String sql1 = "SELECT t2.ID,t2.SHAPETYPE, t1.PLNAME,t1.PLVER,t2.PALREPOSITORYID from APP_ACT_COE_PAL_REPOSITORY t1 ,APP_ACT_COE_PAL_SHAPE_COPY t2 where t1.ID = t2.PALREPOSITORYID and t2.SHAPEGROUPTID='" + shapeGroupId + "' and ISDELETE='N'"; + try { + list1 = DBSql.query(sql1, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("shapeId", rs.getString(1)); + map.put("type", rs.getString(2)); + map.put("fileName", rs.getString(3)); + map.put("ver", VersionUtil.getVersionStrV(rs.getInt(4))); + map.put("palRepositoryId", rs.getString(5)); + return map; + } + }); + } catch (AWSDataAccessException e) { + e.printStackTrace(); + } + + List> list2 = new ArrayList>(); + String sql2 = "SELECT t2.ID,t2.SHAPETYPE, t1.PLNAME,t1.PLVER,t2.PALREPOSITORYID from APP_ACT_COE_PAL_REPOSITORY t1 ,APP_ACT_COE_PAL_SHAPE_PASTE t2 where t1.ID = t2.PALREPOSITORYID and t2.SHAPEGROUPTID='" + shapeGroupId + "' and ISDELETE='N'"; + try { + list2 = DBSql.query(sql2, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("shapeId", rs.getString(1)); + map.put("type", rs.getString(2)); + map.put("fileName", rs.getString(3)); + map.put("ver", VersionUtil.getVersionStrV(rs.getInt(4))); + map.put("palRepositoryId", rs.getString(5)); + return map; + } + }); + } catch (AWSDataAccessException e) { + e.printStackTrace(); + } + + List> resultList = new ArrayList>(); + if (list1 != null) { + resultList.addAll(list1); + } + if (list2 != null) { + resultList.addAll(list2); + } + return resultList; + } + + // 对复制出现过的图形进行删除 + public void removeShapes(JSONArray jsonArr) { + Connection conn = DBSql.open(); + List list1 = new ArrayList(); + List list2 = new ArrayList(); + getShapesMap(jsonArr, list1, list2); + try { + conn.setAutoCommit(false); + removeShapeFromPaste(conn, list2, "Y"); + removeShapeFromCopy(conn, list1, "Y"); + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn); + } + } + + /** + * 代码重用 + * + * @param jsonArr + * @param list1 + * @param list2 + */ + private void getShapesMap(JSONArray jsonArr, List list1, List list2) { + for (int j = 0; j < jsonArr.size(); j++) { + JSONObject jsonObj = jsonArr.getJSONObject(j); + String shapeId = jsonObj.getString("id"); + JSONArray jsonDataArr = jsonObj.getJSONArray("dataAttributes"); + for (int i = 0; i < jsonDataArr.size(); i++) { + JSONObject dataJsonObj = jsonDataArr.getJSONObject(i); + String shapeGroupId = ""; + try { + if (dataJsonObj.containsKey("shapeGroupId")) { + shapeGroupId = dataJsonObj.getString("shapeGroupId"); + } else { + return; + } + } catch (Exception e) { + e.printStackTrace(); + return; + } + String isCopy = dataJsonObj.getString("isCopy"); + if ((null != isCopy && !"".equals(isCopy)) && (null != shapeGroupId && !"".equals(shapeGroupId))) { + // 更新数据库该条记录为删除状态 + if ("Y".equals(isCopy)) { + list1.add(shapeId); + } else { + list2.add(shapeId); + } + break; + } + } + } + } + + /** + * 从粘贴表的中删除 + * + * @param conn + * @param list + * @param isDelete + * @throws SQLException + */ + private void removeShapeFromPaste(Connection conn, List list, String isDelete) throws SQLException { + if (list.size() == 0) { + return; + } + PreparedStatement prest = null; + String sql = "update " + DesignerShapePasteModel.DATABASE_ENTITY + " set " + DesignerShapePasteModel.FIELD_IS_DELETE + " =? where " + DesignerShapePasteModel.FIELD_SHAPE_ID + " =?"; + prest = conn.prepareStatement(sql); + for (int i = 0; i < list.size(); i++) { + prest.setString(1, isDelete); + prest.setString(2, list.get(i)); + prest.addBatch(); + } + prest.executeBatch(); + conn.commit(); + DBSql.close(prest, null); + } + + /** + * 从复制的表中删除 + * + * @param conn + * @param list + * @param isDelete + * @throws SQLException + */ + private void removeShapeFromCopy(Connection conn, List list, String isDelete) throws SQLException { + if (list.size() == 0) { + return; + } + PreparedStatement prest = null; + String sql = "update " + DesignerShapeCopyModel.DATABASE_ENTITY + " set " + DesignerShapeCopyModel.FIELD_IS_DELETE + " =? where " + DesignerShapeCopyModel.FIELD_SHAPE_ID + " =? "; + prest = conn.prepareStatement(sql); + for (int i = 0; i < list.size(); i++) { + prest.setString(1, isDelete); + prest.setString(2, list.get(i)); + prest.addBatch(); + } + prest.executeBatch(); + conn.commit(); + DBSql.close(prest, null); + } + + /** + * 针对CTRL+Z和CTRL+Y的动作 + * + * @param jsonArr + */ + public void recoverRemoveShapes(JSONArray jsonArr) { + Connection conn = DBSql.open(); + List list1 = new ArrayList(); + List list2 = new ArrayList(); + getShapesMap(jsonArr, list1, list2); + try { + conn.setAutoCommit(false); + removeShapeFromPaste(conn, list2, "N"); + removeShapeFromCopy(conn, list1, "N"); + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn); + } + + } + + /** + * find指定资产id下的所有流程 + * + * @param wsId资产的id + * @return + */ + public List getCoeProcessLevelAll(String wsId) { + String sql = "select * from " + PALRepositoryModelImpl.DATABASE_ENTITY + " where " + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + public void updateShapeToDB(List> list, String newShapeGroupId) { + for (Map map : list) { + String id = (String) map.get("id"); + JSONObject shape = (JSONObject) map.get("shape"); + if (!"linker".equals(shape.getString("name")) && shape.get("dataAttributes") != null) { + JSONArray dataAttributes = shape.getJSONArray("dataAttributes"); + for (int i = 0; i < dataAttributes.size(); i++) { + JSONObject attr = dataAttributes.getJSONObject(i); + if (attr.containsKey("relevanceShapes") && attr.getString("shapeGroupId") != null && !"".equals(attr.getString("shapeGroupId")) && attr.getString("isCopy") != null && !"".equals(attr.getString("isCopy"))) { + + break; + } + } + } + String fileUUID = (String) map.get("fileUUID"); + } + } + + public void createShapeRelationFileModel(List listF) { + for (DesignerShapeFileRelationModel fileModel : listF) { + String sql = "select count(*) as number from APP_ACT_COE_PAL_SHAPE_FILE where ID='" + fileModel.getUuid() + "'"; + int i = DBSql.getInt(sql, "number"); + if (i == 0) { + StringBuilder sql1 = new StringBuilder(); + sql1.append("insert into "); + sql1.append("APP_ACT_COE_PAL_SHAPE_FILE"); + sql1.append(" ("); + sql1.append("ID").append(","); + sql1.append("PALREPOSITORYID"); + sql1.append(") values('"); + sql1.append(fileModel.getUuid()).append("','"); + sql1.append(fileModel.getFileUUID()).append("')"); + DBSql.update(sql1.toString()); + } + } + } + + @Override + public String entityName() { + return PALRepositoryModelImpl.DATABASE_ENTITY; + } + + @Override + public RowMapper rowMapper() { + return new PALRespositoryModelMapper(); + } + + /** + * 关联的删除,删除双方的关联形状 + * + * @param uuid + */ + public void respositoryDesignerRelationShapeRelevanceRemove(String uuid) { + String sql = "select SHAPEGROUPID,SHAPERELATIONID,SHAPEID from APP_ACT_COE_PAL_SHAPE_RLAT where ID='" + uuid + "'"; + Map map = DBSql.getObject(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("groupId", rs.getString("SHAPEGROUPID")); + map.put("relationId", rs.getString("SHAPERELATIONID")); + map.put("shapeId", rs.getString("SHAPEID")); + return map; + } + }); + if (map != null && map.get("groupId") != null && !"".equals(map.get("groupId"))) { + sql = "delete from APP_ACT_COE_PAL_SHAPE_RLAT where SHAPEGROUPID='" + map.get("groupId") + "' and SHAPERELATIONID='" + map.get("relationId") + "'"; + } else { + sql = "delete from APP_ACT_COE_PAL_SHAPE_RLAT where ID='" + uuid + "'"; + } + DBSql.update(sql); + if (map != null) { + sql = "delete from APP_ACT_COE_PAL_SHAPE_RLAT where SHAPERELATIONID='" + map.get("shapeId") + "' and SHAPEID='" + map.get("relationId") + "'"; + DBSql.update(sql); + } + } + + public List getRelationShapesByFileId(String uuId) { + String sql = "select ID from APP_ACT_COE_PAL_SHAPE_FILE where PALREPOSITORYID='" + uuId + "'"; + return DBSql.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString("ID"); + } + }); + } + + public void updateRelationShapeGroupId(String shapeGroupId) { + String sql = "select * from APP_ACT_COE_PAL_SHAPE_COPY where SHAPEGROUPTID='" + shapeGroupId + "'"; + List list = DBSql.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString("ID"); + } + }); + if (list != null && list.size() > 0) { + String shapeId = list.get(0); + sql = "update APP_ACT_COE_PAL_SHAPE_RLAT set SHAPEGROUPID='" + shapeGroupId + "' where SHAPEID='" + shapeId + "'"; + DBSql.update(sql); + } + } + + /** + * 获取所有未删除的复制图形 + * + * @return + */ + public List> getRelationShapes() { + String sql = "select * from APP_ACT_COE_PAL_SHAPE_COPY where isDelete='N'"; + List> list = null; + list = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + result.put("id", rs.getString("ID")); + result.put("shapeGroupiId", rs.getString("SHAPEGROUPTID")); + result.put("shapeName", rs.getString("SHAPENAME")); + result.put("shapeCategoryName", rs.getString("SHAPECATEGORYNAME")); + result.put("palRepositoryId", rs.getString("PALREPOSITORYID")); + result.put("isDelete", rs.getString("ISDELETE")); + result.put("shapeType", rs.getString("SHAPETYPE")); + return result; + } + }); + return list; + } + + public boolean getAccessHome(String wsuuid, String uid) { + String sql = "select " + CoeWorkSpaceModel.FIELD_WS_ADMIN + ", " + CoeWorkSpaceModel.FIELD_WS_DM + " from " + CoeWorkSpaceModel.DATABASE_ENTITY + " where " + CoeWorkSpaceModel.FIELD_UUID + " ='" + wsuuid + "'"; + Map map = DBSql.getObject(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("WSADMIN", rs.getString("WSADMIN")); + map.put("WSDM", rs.getString("WSDM")); + return map; + } + }); + if (map.get("WSADMIN") != null && map.get("WSADMIN").contains(uid)) { + return true; + } + if (map.get("WSDM") != null && map.get("WSDM").contains(uid)) { + return true; + } + return "admin".equals(uid); + } + + public List getRelationValue(String id) { + List list = new ArrayList(); + String sql = "select distinct RELATIONSHAPETEXT ,RELATIONSHAPEID from APP_ACT_COE_PAL_SHAPE_RLAT where RELATIONSHAPEID in (" + id + ")"; + List> listMap = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put(rs.getString(2), rs.getString(1)); + return map; + } + }); + for (Map map : listMap) { + Set set = map.keySet(); + for (String key : set) { + list.add(map.get(key)); + } + } + + return list; + } + + public Map getRelationValueToMap(String id) { + Map resultMap = new HashMap(); + String sql = "select distinct RELATIONSHAPETEXT ,RELATIONSHAPEID, RELATIONFILEID from APP_ACT_COE_PAL_SHAPE_RLAT where RELATIONSHAPEID in (" + id + ")"; + List> listMap = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put(rs.getString(2), rs.getString(1)); + map.put(rs.getString(2) + "_fileId", rs.getString(3)); + return map; + } + }); + for (Map map : listMap) { + Set set = map.keySet(); + for (String key : set) { + resultMap.put(key, map.get(key)); + } + } + return resultMap; + } + + public Map getRelationFileIdsToMap(String id) { + Map resultMap = new HashMap(); + String sql = "select distinct RELATIONFILEID ,RELATIONSHAPEID from APP_ACT_COE_PAL_SHAPE_RLAT where RELATIONSHAPEID in (" + id + ")"; + List> listMap = DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put(rs.getString(2), rs.getString(1)); + return map; + } + }); + for (Map map : listMap) { + Set set = map.keySet(); + for (String key : set) { + resultMap.put(key, map.get(key)); + } + } + return resultMap; + } + + /** + * 根据流程团队小组Id,模糊查询流程资产文件 + * + * @param teamId 小组Id + * @param name 查询的流程资产文件名 + * @return + */ + public List getRepositoryListByTeamId(String wsId, String teamId, String name) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + + TeamPerm teamPeam = new TeamPerm(); + String sql = "select r.* from " + PALRepositoryModelImpl.DATABASE_ENTITY + " r, " + teamPeam.entityName() + " p " + " where r.PLVERSIONID = p.RESOURCEID and p.TEAMID = '" + teamId + "' and p.PERMTYPE = '1' " + " and r." + PALRepositoryModelImpl.FIELD_WS_ID + "='" + wsId + "' and r." + PALRepositoryModelImpl.FIELD_PL_NAME + " like " + namelike + " and r." + PALRepositoryModelImpl.FIELD_IS_USE + "='1' ORDER BY " + PALRepositoryModelImpl.FIELD_PL_ORDERINDEX + " ASC"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 根据流程发布中的角色,获取流程资产库列表 + * + * @param roleId 流程发布中的角色Id + * @param isPublish 是否限制为已发布流程 + * @return + */ + public List> getWorkSpaceListByPublishRole(String roleId, boolean isPublish) { + StringBuilder sql = new StringBuilder("select distinct(wc.ID), wc.WSNAME from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal, APP_ACT_COE_PAL_WORKSPACE wc" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and wc.ID = pal.WSID"); + if (isPublish) { + sql.append(" and pal.ISPUBLISH = 1"); + } + + return DBSql.query(sql.toString(), new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + result.put("wsId", rs.getString(1)); + result.put("wsName", rs.getString(2)); + return result; + } + }); + } + + /** + * 根据流程发布中的角色,获取流程资产库列表 + * + * @param roleId 流程发布中的角色Id + * @param isPublish 是否限制为已发布流程 + * @param sort 是否排序 + * @return + */ + public List> getWorkSpaceListByPublishRole(String roleId, boolean isPublish, boolean sort) { + StringBuilder sql = new StringBuilder("select distinct(wc.ID), wc.WSNAME,WSORDERINDEX from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal, APP_ACT_COE_PAL_WORKSPACE wc" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and wc.ID = pal.WSID"); + if (isPublish) { + sql.append(" and pal.ISPUBLISH = 1"); + } + if (sort) { + sql.append(" order by " + CoeWorkSpaceModel.FIELD_WS_ORDERINDEX + " ASC"); + } + return DBSql.query(sql.toString(), new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + result.put("wsId", rs.getString(1)); + result.put("wsName", rs.getString(2)); + return result; + } + }); + } + + /************************获取流程发布数据start***************************************/ + /** + * 按模块获取数据 + * @return + */ + public List getRepositoryListByPublishRolePagination(String wsIds, String roleId, String name, int start, int pageLimit, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) plId, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + try { + // 分页 + sql = SQLPagination.getPaginitionSQL(sql, start, pageLimit); + } catch (Exception e) { + e.printStackTrace(); + } + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 按模块获取数据 + * @return + */ + public List getRepositoryListByPublishRole(String wsIds, String roleId, String name, String category, boolean isPublish, boolean isUse) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) plId, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and "; + if (isPublish) { + sql += " pal.ISPUBLISH = 1"; + } + if (isUse) { + sql += " pal.ISUSE = 1"; + } + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 按模块获取数据 + * @return + */ + public List getRepositoryListByPublishRole(String wsIds, String roleId, String name, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) plId, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取常用流程数据 + * @return + */ + public List getRepositoryCommonListByPublishRolePagination(String wsIds, String roleId, String name, int start, int pageLimit, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) plId,comm.SORT, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select comm.SORT,pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal , APP_ACT_COE_PAL_PUBLISH_COM comm " + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1 and comm.WSID = pal.WSID and comm.PLVERSIONID = pal.PLVERSIONID "; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by comm.SORT, pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + try { + // 分页 + sql = SQLPagination.getPaginitionSQL(sql, start, pageLimit); + } catch (Exception e) { + e.printStackTrace(); + } + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取常用流程数据 + * @return + */ + public List getRepositoryCommonListByPublishRole(String wsIds, String roleId, String name, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) plId,comm.SORT, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select comm.SORT,pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal , APP_ACT_COE_PAL_PUBLISH_COM comm " + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1 and comm.WSID = pal.WSID and comm.PLVERSIONID = pal.PLVERSIONID "; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by comm.SORT, pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取高频流程数据 + * @return + */ + public List getRepositoryFrequencyListByPublishRolePagination(String wsIds, String roleId, String name, int start, int pageLimit, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) palId,fre.COUNT, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select fre.COUNT, pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal , APP_ACT_COE_PAL_PUBLISH_FREQ fre " + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1 and fre.WSID = pal.WSID and fre.PLVERSIONID = pal.PLVERSIONID "; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by fre.COUNT DESC, pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + try { + // 分页 + sql = SQLPagination.getPaginitionSQL(sql, start, pageLimit); + } catch (Exception e) { + e.printStackTrace(); + } + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取高频流程数据 + * @return + */ + public List getRepositoryFrequencyListByPublishRole(String wsIds, String roleId, String name, String category) { + String dbSupply = AWSServerConf.getDatabaseProvider(); + String sql = "select distinct(pal.ID) palId,fre.COUNT, pal.*"; + if (dbSupply.toLowerCase().equals("sqlserver")) { + sql = "select fre.COUNT, pal.*"; + } + sql += " from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal , APP_ACT_COE_PAL_PUBLISH_FREQ fre " + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1 and fre.WSID = pal.WSID and fre.PLVERSIONID = pal.PLVERSIONID "; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " and pal.PLMETHODID != 'default' "; + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by fre.COUNT DESC, pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /************************获取流程发布数据end*****************************************/ + + /** + * 根据流程发布中的角色,获取流程资产文件列表 + * + * @param roleId 流程发布中的角色Id + * @param wsId 流程资产库Id + * @return + */ + public List getRepositoryListByPublishRole(String roleId, String wsId) { + return getRepositoryListByPublishRole(roleId, wsId, null); + } + + + /** + * 根据流程发布中的角色,获取条件下的流程 + * @param roleId + * @param wsIds + * @param name + * @return + */ + public List getRepositoryListByPublishRole(String roleId, String wsIds, String category, String deptId, String methodFilter) { + String sql = "select distinct(pal.ID), pal.* from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (wsIds != null && !"".equals(wsIds)) { + sql += " and pal.WSID in (" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + if (!UtilString.isEmpty(deptId)) { + sql += " and pal.PLDUTYDEPT = '" + deptId + "'"; + } + + if (!UtilString.isEmpty(methodFilter)) { + sql += " and pal.PLMETHODID <> '" + methodFilter + "'"; + } + + sql += " order by pal.PLLEVEL, pal.PLORDERINDEX "; + List list = DBSql.query(sql, new PALRespositoryModelMapper()); + return list; + } + + public List getRepositoryListByPublishRole(String roleId, String wsId, String name) { + String sql = "select distinct(pal.ID), pal.* from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (wsId != null && !"".equals(wsId)) { + sql += " and pal.WSID = '" + wsId + "'"; + } + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql += " and pal.PLNAME like " + namelike; + } + sql += " order by pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 根据流程发布中的角色,获取流程资产文件版本id集合 + * @param roleId + * @param wsIds + * @param name + * @return 文件版本id集合 + */ + public Set getRepositoryVersionIdListByPublishRole(String roleId, String wsIds, String category) { + String sql = "select distinct(pal.ID), pal.* from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (wsIds != null && !"".equals(wsIds)) { + sql += " and pal.WSID in (" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " order by pal.PLLEVEL, pal.PLORDERINDEX "; + Set idSet =new HashSet<>(); + List list = DBSql.query(sql, new PALRespositoryModelMapper()); + if (list != null && list.size() > 0) { + for (PALRepositoryModel model : list) { + idSet.add(model.getVersionId()); + } + } + return idSet; + } + + /** + * 获取角色限定下发布流程列表 + * @param roleId + * @param wsIds + * @param category + * @return + */ + public List getRepositoryListByPublishRoleAndCategory(String roleId, String wsIds, String category) { + String sql = "select distinct(pal.ID), pal.* from APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE r, APP_ACT_COE_PAL_REPOSITORY pal" + " where r.ROLEID = '" + roleId + "' and r.GROUPID = p.GROUPID and p.RESOURCEID = pal.PLVERSIONID and pal.ISPUBLISH = 1"; + if (!UtilString.isEmpty(wsIds)) { + sql += " and pal.WSID in(" + wsIds + ")"; + } + if (!UtilString.isEmpty(category)) { + sql += " and pal.PLCATEGORY = '" + category + "'"; + } + sql += " order by pal.PUBLISHDATE DESC, pal.PLLEVEL, pal.PLORDERINDEX "; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取具有PAL特定角色下的所有权限文件 + * @param roleId + * @return + */ + public Set getPalVersionIdByroleId(String roleId) { + String sql = "SELECT DISTINCT up.RESOURCEID FROM APP_ACT_COE_PAL_USERGRP_PERM up, APP_ACT_COE_PAL_USERGRP_ROLE ur WHERE up.GROUPID=ur.GROUPID AND ur.ROLEID='" + roleId + "'"; + List list = DBSql.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet r, int arg1) throws SQLException { + return r.getString(1); + } + }); + if (list != null && list.size() > 0) { + return new HashSet<>(list); + } else { + return new HashSet<>(); + } + } + + /** + * 根据资产库文件versionId获取使用的资产库 + * + * @param versionId 流程版本Id + * @return + */ + public List getRepositoryByVersionId(String versionId) { + String sql = "select * from APP_ACT_COE_PAL_REPOSITORY where PLVERSIONID = '" + versionId + "' and ISUSE = 1"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 根据资产库文件versionId获取版本号相同的流程 + * + * @param versionId 流程版本Id + * @return + */ + public List getAllRepositoryByVersionId(String versionId) { + String sql = "select * from APP_ACT_COE_PAL_REPOSITORY where PLVERSIONID = '" + versionId + "' ORDER BY PLVER"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获得未发布的流程 + * + * @param wsId + * @return + */ + public List getNotPublishedRepositoryList(String wsId) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT"); + sb.append(" r1.* "); + sb.append(" FROM"); + sb.append(" APP_ACT_COE_PAL_REPOSITORY r1"); + sb.append(" WHERE"); + sb.append(" r1.PLVERSIONID NOT IN ("); + sb.append(" SELECT"); + sb.append(" r2.PLVERSIONID"); + sb.append(" FROM"); + sb.append(" APP_ACT_COE_PAL_REPOSITORY r2"); + sb.append(" WHERE"); + sb.append(" r2.WSID = '"); + sb.append(wsId); + sb.append("'"); + sb.append(" AND r2.ISPUBLISH = 1"); + sb.append(" )"); + sb.append(" AND r1.WSID = '"); + sb.append(wsId); + sb.append("'"); + sb.append(" AND r1.ISUSE = 1"); + sb.append(" ORDER BY"); + sb.append(" r1.PLLEVEL ASC,"); + sb.append(" r1.PLORDERINDEX ASC "); + return DBSql.query(sb.toString(), new PALRespositoryModelMapper()); + } + + /** + * 获得已发布的流程的未发布版本 + * + * @param wsId + * @return + */ + public List getPublishedRepositoryVersionList(String wsId) { + String sql = "select r1.* from APP_ACT_COE_PAL_REPOSITORY r1, APP_ACT_COE_PAL_REPOSITORY r2 where r1.PLVERSIONID = r2.PLVERSIONID and r1.ID <> r2.ID and r1.ISPUBLISH = 0 and r2.ISPUBLISH = 1 and r1.WSID = '" + wsId + "'"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获得某个文件的未发布版本 + * + * @param wsId + * @param repositoryId + * @return + */ + public List getPublishedRepositoryVersionListByRid(String repositoryId) { + String sql = "SELECT r1.* FROM APP_ACT_COE_PAL_REPOSITORY r1, APP_ACT_COE_PAL_REPOSITORY r2 WHERE r1.PLVERSIONID = r2.PLVERSIONID AND r2.ID=? AND r1.ID<>r2.ID AND r1.ISPUBLISH=0"; + return DBSql.query(sql, new PALRespositoryModelMapper(), repositoryId); + } + + /** + * 获得已发布的流程 + * + * @param wsId + * @return + */ + public List getPublishedRepositoryList(String wsId) { + String sql = "select * from APP_ACT_COE_PAL_REPOSITORY where ISPUBLISH = 1 and WSID = '" + wsId + "' order by PLLEVEL asc, PLORDERINDEX asc"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + + + + /** + * 获得已发布的流程(停用版本过滤架构图) + * + * @param wsId + * @return + */ + public List getPublishedRepositoryListByStop(String wsId) { + String sql = "select * from APP_ACT_COE_PAL_REPOSITORY where ISPUBLISH = 1 and WSID = '" + wsId + "' and PLMETHODID!='process.evc' order by PLLEVEL asc, PLORDERINDEX asc"; + return DBSql.query(sql, new PALRespositoryModelMapper()); + } + + /** + * 获取某个流程的所有子流程 + * + * @param pid + * @return + */ + public List getPalRepositoryModelsByPid(String pid, String wsId) { + String sql = ""; + if (pid.length() < 36) { + sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY WHERE PLPARENTID=? AND WSID=? ORDER BY PLORDERINDEX"; + return DBSql.query(sql, new PALRespositoryModelMapper(), pid, wsId); + } else { + sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE PLPARENTID IN " + "(SELECT r1.id FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " r1, " + PALRepositoryModelImpl.DATABASE_ENTITY + " r2 WHERE r1.PLVERSIONID = r2.PLVERSIONID AND r2.id=?)" + " ORDER BY PLORDERINDEX"; + return DBSql.query(sql, new PALRespositoryModelMapper(), pid); + } + } + + /** + * 获取某个流程的所有子流程 + * + * @param pid + * @return + */ + public List getUsedPalRepositoryModelsByPid(String pid) { + String sql = "SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE PLPARENTID IN " + "(SELECT r1.id FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " r1, " + PALRepositoryModelImpl.DATABASE_ENTITY + " r2 WHERE r1.PLVERSIONID = r2.PLVERSIONID AND r2.id=?)" + " AND ISUSE='1' ORDER BY PLORDERINDEX"; + return DBSql.query(sql, new PALRespositoryModelMapper(), pid); + } + + /** + * 修改已发布流程的浏览次数 + * + * @param palRepositoryId + * @author zhangming + */ + public int updateViewCount(String palRepositoryId) { + PALRepositoryModelImpl model = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(palRepositoryId); + long viewCount = model.getViewCount(); + viewCount++; + model.setViewCount(viewCount); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " SET VIEWCOUNT=? WHERE ID = ?"; + int r = DBSql.update(sql, new Object[] { viewCount, palRepositoryId }); + if (r > 0) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + /** + * 修改模型转换次数 + * + * @param palRepositoryId + * @author zhangming + */ + public int updateConvertCount(String palRepositoryId) { + PALRepositoryModelImpl model = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(palRepositoryId); + int convertCount = model.getConvertCount(); + ++convertCount; + model.setConvertCount(convertCount); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " SET "+PALRepositoryModelImpl.FIELD_CONVERT_COUNT+" =? WHERE ID = ?"; + int r = DBSql.update(sql, new Object[] { convertCount, palRepositoryId }); + if (r > 0) { + PALRepositoryCache.getCache().put(model.getId(), model); + } + return r; + } + + /** + * 搜索已发布流程,用于流程发布客户端 + * + * @param ids + * @param filter + * @param order + * @param name + * @return + * @author zhangming + */ + public List searchRepositoryByPublisherPortal(String ids, String filter, String order, String name) { + String[] idstrs = ids.split(","); + StringBuilder idsb = new StringBuilder(); + for (int i = 0; i < idstrs.length; i++) { + idsb.append("'").append(idstrs[i]).append("',"); + } + String idsString = idsb.toString(); + idsString = idsString.substring(0, idsString.lastIndexOf(",")); + + StringBuilder sql = new StringBuilder("SELECT r.id, p.PUBLISHDATE, r.PLRD, r.PLRP, r.plorderindex FROM APP_ACT_COE_PAL_REPOSITORY r, APP_ACT_COE_PAL_PUBLISH p, APP_ACT_COE_PAL_PUBLISH_LIST pl"); + sql.append(" WHERE r.id = pl.palrepositoryid AND pl.pid = p.id AND r.id IN (").append(idsString).append(")"); + + Object[] param = new Object[] { "", "" }; + if (filter != null && !"".equals(filter)) { + JSONObject filterJson = JSONObject.parseObject(filter); + Iterator it = filterJson.keySet().iterator(); + while (it.hasNext()) { + String key = (String) it.next(); + String value = filterJson.getString(key); + if (!key.equals("publishdate")) { + String[] valueStrs = value.split(","); + StringBuilder valuesb = new StringBuilder(); + for (int i = 0; i < valueStrs.length; i++) { + valuesb.append("'").append(valueStrs[i]).append("',"); + } + String valueString = valuesb.toString(); + valueString = valueString.substring(0, valueString.lastIndexOf(",")); + sql.append(" AND " + key + " in (").append(valueString).append(")"); + } else { + String beginTime = ""; + String endTime = ""; + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Timestamp currentTime = new Timestamp(System.currentTimeMillis()); + beginTime = formatter.format(currentTime); + int num = Integer.parseInt(value.substring(0, value.indexOf("-"))); + + Calendar cal = new GregorianCalendar(); + cal.setTime(currentTime); + if (value.contains("year")) { + int year = cal.get(Calendar.YEAR); + year = year - num; + cal.set(Calendar.YEAR, year); + } else if (value.contains("month")) { + int month = cal.get(Calendar.MONTH); + month = month - num; + cal.set(Calendar.MONTH, month); + } else if (value.contains("day")) { + int day = cal.get(Calendar.DAY_OF_MONTH); + day = day - num; + cal.set(Calendar.DAY_OF_MONTH, day); + } + java.util.Date myDate = cal.getTime(); + endTime = formatter.format(myDate); + sql.append(" AND " + key + " BETWEEN ? AND ?"); + param[0] = endTime; + param[1] = beginTime; + } + } + } + + if (name != null && !"".equals(name)) { + String namelike = ""; + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name.toLowerCase() + "%'"; + } + sql.append(" AND lower(r.plname) LIKE " + namelike.toLowerCase()); + } + if (order != null && !"".equals(order)) { + sql.append(" ORDER BY " + order); + } else { + sql.append(" ORDER BY plorderindex"); + } + + List list; + if (param[0].equals("")) { + list = DBSql.query(sql.toString(), new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString(1); + } + }); + } else { + list = DBSql.query(sql.toString(), new RowMapper() { + @Override + public String mapRow(ResultSet rs, int arg1) throws SQLException { + return rs.getString(1); + } + }, param); + } + Set set = new HashSet(); + List newList = new ArrayList(); + for (Iterator iter = list.iterator(); iter.hasNext();) { + Object element = iter.next(); + if (set.add(element)) + newList.add(element); + } + list.clear(); + list.addAll(newList); + return list; + } + + /** + * 搜索所有负责部门 + * + * @param wsId + * @return + * @author zhangming + */ + public List> searchRepositoryPlrdByPublisherPortal(String roleId) { + String sql = "SELECT DISTINCT(PLRD), sr.RELATIONSHAPETEXT FROM APP_ACT_COE_PAL_REPOSITORY r, APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE role, APP_ACT_COE_PAL_SHAPE_RLAT sr WHERE r.plrd <> '' AND r.plrd IS NOT NULL AND p.GROUPID = role.GROUPID AND p.RESOURCEID = r.id AND r.PLRD=sr.RELATIONSHAPEID AND role.roleid=?"; + + return DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("id", rs.getString(1)); + map.put("name", rs.getString(2)); + return map; + } + }, roleId); + } + + /** + * 搜索所有负责人 + * + * @param roleId + * @return + * @author zhangming + */ + public List> searchRepositoryPlrpByPublisherPortal(String roleId) { + String sql = "SELECT DISTINCT(PLRP), sr.RELATIONSHAPETEXT FROM APP_ACT_COE_PAL_REPOSITORY r, APP_ACT_COE_PAL_USERGRP_PERM p, APP_ACT_COE_PAL_USERGRP_ROLE role, APP_ACT_COE_PAL_SHAPE_RLAT sr WHERE r.plrp <> '' AND r.plrp IS NOT NULL AND p.GROUPID = role.GROUPID AND p.RESOURCEID = r.id AND r.PLRP=sr.RELATIONSHAPEID AND role.roleid = ?"; + + return DBSql.query(sql, new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map map = new HashMap(); + map.put("id", rs.getString(1)); + map.put("name", rs.getString(2)); + return map; + } + }, roleId); + } + + /** + * 恢复备份数据时,删除当前的数据 + * + * @param wsId + * @return + * @author zhangming + */ + public boolean deleteRepositorysByWsId(String wsId) { + boolean flag = true; + Connection conn = DBSql.open(); + try { + conn.setAutoCommit(false); + Object[] params = new Object[] { wsId }; + String deleteShapeCopySql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_COPY WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapeCopySql, params); + String deleteShapePasteSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_PASTE WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapePasteSql, params); + String deleteShapeRelationSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_RLAT WHERE FILEID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteShapeRelationSql, params); + String deleteUpfileSql = "DELETE FROM APP_ACT_COE_PAL_UPFILE WHERE PALREPOSITORYID IN (SELECT id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteUpfileSql, params); + String deleteRepositoryPropertySql = "DELETE FROM APP_ACT_COE_PAL_PROP WHERE PLID IN (SELECT ID FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)"; + DBSql.update(conn, deleteRepositoryPropertySql, params); + // 判断数据库类型 sqlServer用“+”连接字符串 + String deletePropertySql = "DELETE FROM APP_ACT_COE_PROP WHERE PROPERTYKEY IN (SELECT CONCAT(id, '_attr') AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?)" + + " OR PROPERTYKEY IN (SELECT CONCAT('mark_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('link_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('link_app_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT CONCAT('use_', PLRID) AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) "; + if (AWSServerConf.getDatabaseProvider().equals("sqlserver")) { + deletePropertySql = "DELETE FROM APP_ACT_COE_PROP WHERE PROPERTYKEY IN (SELECT id+'_attr' AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'mark_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'link_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'link_app_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) " + + " OR PROPERTYKEY IN (SELECT 'use_'+PLRID AS id FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?) "; + } + DBSql.update(conn, deletePropertySql, new Object[] { wsId, wsId, wsId, wsId, wsId }); + String deleteCorrelateSql = "DELETE FROM APP_ACT_COE_PAL_CORRELATE WHERE WSID=?"; + DBSql.update(conn, deleteCorrelateSql, params); + String specialPropertySql = "DELETE FROM APP_ACT_COE_PAL_SPCL_PROP WHERE WSID=?"; + DBSql.update(conn, specialPropertySql, params); + String deleteRepositorySql = "DELETE FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?"; + DBSql.update(conn, deleteRepositorySql, params); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + flag = false; + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + } + DBSql.close(conn); + } + + return flag; + } + + /** + * 删除文件,节点的属性和形状的配置信息 + * + * @param wsId + * @return + */ + public boolean deleteFileShapeAttrByWsId(String wsId) { + boolean flag = true; + Connection conn = DBSql.open(); + try { + conn.setAutoCommit(false); + Object[] params = new Object[] { wsId }; + String deleteFileAttrSql = "DELETE FROM APP_ACT_COE_PAL_ATTR WHERE WSID=?"; + DBSql.update(conn, deleteFileAttrSql, params); + String deleteShapeAttrSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_ATTR WHERE WSID=?"; + DBSql.update(conn, deleteShapeAttrSql, params); + String deleteShapeConfigSql = "DELETE FROM APP_ACT_COE_PAL_SHAPE_CONFIG WHERE WSID=?"; + DBSql.update(conn, deleteShapeConfigSql, params); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + flag = false; + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + } + DBSql.close(conn); + } + + return flag; + } + + /** + * 根据资产库id删除repository表中的数据 + * @param wsId + * @return + * @author tanj + */ + public boolean deleteRepositorysModelByWsId(String wsId) { + boolean flag = true; + Connection conn = DBSql.open(); + try { + conn.setAutoCommit(false); + Object[] params = new Object[] { wsId }; + String deleteRepositorySql = "DELETE FROM APP_ACT_COE_PAL_REPOSITORY WHERE WSID=?"; + DBSql.update(conn, deleteRepositorySql, params); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + flag = false; + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + flag = false; + } + DBSql.close(conn); + } + + return flag; + } + + /** + * 查询有关联关系的模型 + * + * @param name + * @param wsId + * @param modelMethodId + * @param relationMethodId + * @param versionType + * @return + * @author zhangming + */ + public List> searchModelsByRelation(String name, String wsId, String modelMethodId, String relationMethodId, String versionType) { + StringBuilder sql = new StringBuilder("SELECT pal1.ID AS modelId, pal2.ID AS relationId, r.FILEID, r.RELATIONFILEID, r.SHAPEID, r.RELATIONSHAPEID, r.SHAPETEXT, r.RELATIONSHAPETEXT FROM APP_ACT_COE_PAL_REPOSITORY pal1, APP_ACT_COE_PAL_REPOSITORY pal2, APP_ACT_COE_PAL_SHAPE_RLAT r").append(" WHERE pal1.WSID=? AND pal2.WSID=? AND pal2.PLMETHODID IN (" + relationMethodId + ") AND (pal1.ID = r.FILEID AND pal2.ID=r.RELATIONFILEID OR pal1.ID = r.RELATIONFILEID AND pal2.ID=r.FILEID)"); + if (name != null && !"".equals(name)) { + String namelike = ""; + name = name.toLowerCase(); + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql.append(" AND LOWER(pal1.PLNAME) LIKE ").append(namelike); + } + if ("isuse".equals(versionType.toLowerCase())) { + sql.append(" AND pal1.ISUSE=1 AND pal2.ISUSE=1 "); + } else { + sql.append(" AND pal1.ISPUBLISH=1 AND pal2.ISPUBLISH=1"); + } + if (modelMethodId != null && !"".equals(modelMethodId)) { + sql.append(" AND pal1.PLMETHODID IN (" + modelMethodId + ")"); + } + return DBSql.query(sql.toString(), new RowMapper>() { + @Override + public Map mapRow(ResultSet rs, int arg1) throws SQLException { + Map result = new HashMap(); + result.put("modelId", rs.getString(1)); + result.put("relationModelId", rs.getString(2)); + result.put("fileId", rs.getString(3)); + result.put("relationFileId", rs.getString(4)); + result.put("shapeId", rs.getString(5)); + result.put("relationShapeId", rs.getString(6)); + result.put("shapeText", rs.getString(7)); + result.put("relationShapeText", rs.getString(8)); + return result; + } + }, wsId, wsId); + } + + /** + * 关联查询,不包含关联关系 + * + * @param name + * @param wsId + * @param modelMethodId + * @param versionType + * @return + * @author zhangming + */ + public List searchModelsByRelation(String name, String wsId, String modelMethodId, String versionType) { + StringBuilder sql = new StringBuilder("SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE WSID = ?"); + if (name != null && !"".equals(name)) { + String namelike = ""; + name = name.toLowerCase(); + if (StringUtil.containSpecialChar(name)) { + namelike = "'%" + StringUtil.replaceSqlStr(name, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + name + "%'"; + } + sql.append(" AND LOWER(PLNAME) LIKE ").append(namelike); + } + if ("isuse".equals(versionType.toLowerCase())) { + sql.append(" AND ISUSE=1"); + } else { + sql.append(" AND ISPUBLISH=1"); + } + if (modelMethodId != null && !"".equals(modelMethodId)) { + sql.append(" AND PLMETHODID IN (" + modelMethodId + ")"); + } + + return DBSql.query(sql.toString(), new PALRespositoryModelMapper(), wsId); + } + + /** + * 获取部门下的流程根节点(仅适用于责任部门选择address) + * @param deptIds 部门ID + * @param wsId 资产库Id,为空则查询默认资产库 + * @param methodId + * @param category + * @param isUsed + * @param isPublish + * @return + */ + public List getRootPALRepositoryModelsByDeptId(String deptIds, String wsId, String methodId, String category, boolean isUsed, boolean isPublish) { + Map params = new HashMap(); + String deptSql = " AND PLDUTYDEPT in (" + deptIds + ")"; + + String wsIdSql = ""; + if (UtilString.isEmpty(wsId)) { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + wsId = defaultWsId; + } + } + if (!UtilString.isEmpty(wsId)) { + wsIdSql = " AND WSID = :WSID"; + params.put("WSID", wsId); + } + + String methodIdSql = ""; + if (!UtilString.isEmpty(methodId)) { + methodIdSql = " AND PLMETHODID = :METHODID"; + params.put("METHODID", methodId); + } + + String categorySql = ""; + if (!UtilString.isEmpty(category)) { + categorySql = " AND PLCATEGORY = :CATEGORY"; + params.put("CATEGORY", category); + } + + String useSql = ""; + if (isUsed) { + useSql = " AND ISUSE=1"; + } + + String publishSql = ""; + if (isPublish) { + publishSql = " AND ISPUBLISH=1"; + } + +// String sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE" +// + " PLLEVEL = (SELECT MIN(PLLEVEL) FROM APP_ACT_COE_PAL_REPOSITORY " +// + " WHERE 1=1 " + useSql + publishSql + wsIdSql + deptSql + methodIdSql + categorySql + ") " +// + useSql + publishSql + wsIdSql + deptSql + methodIdSql + categorySql +// + " ORDER BY PLLEVEL, PLORDERINDEX"; + String sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE 1=1 " + + useSql + publishSql + wsIdSql + deptSql + methodIdSql + categorySql + + " ORDER BY PLLEVEL, PLORDERINDEX"; + + return DBSql.query(sql, params, new PALRespositoryModelMapper()); + } + + /** + * 获取部门下的流程(仅适用于责任部门选择org) + * @param deptIds 部门ID + * @param wsId 资产库Id,为空则查询默认资产库 + * @param methodId + * @param category + * @param isUsed + * @param isPublish + * @return + */ + public List getAllPALRepositoryModelsByDeptId(String deptIds, String wsId, String methodId, String category, boolean isUsed, boolean isPublish) { + Map params = new HashMap(); + String deptSql = ""; + StringBuffer sb = new StringBuffer(); + String[] listStr = deptIds.split(","); + for (int i = 0, len = listStr.length; i < len; i++) { + if (i == 0) { + sb.append(" AND PLDUTYDEPT IN ("); + } + sb.append(listStr[i]); + if (i >= 900 && i < len - 1) { + if (i % 900 == 0) { + sb.append(") OR PLDUTYDEPT IN ("); + } else { + sb.append(","); + } + + } else if (i < len - 1) { + sb.append(","); + } + if (i == len - 1) { + sb.append(")"); + } + } + deptSql = sb.toString(); + + String wsIdSql = ""; + if (UtilString.isEmpty(wsId)) { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + wsId = defaultWsId; + } + } + if (!UtilString.isEmpty(wsId)) { + wsIdSql = " AND WSID = :WSID"; + params.put("WSID", wsId); + } + + String methodIdSql = ""; + if (!UtilString.isEmpty(methodId)) { + methodIdSql = " AND PLMETHODID = :METHODID"; + params.put("METHODID", methodId); + } + + String categorySql = ""; + if (!UtilString.isEmpty(category)) { + categorySql = " AND PLCATEGORY = :CATEGORY"; + params.put("CATEGORY", category); + } + + String useSql = ""; + if (isUsed) { + useSql = " AND ISUSE=1"; + } + + String publishSql = ""; + if (isPublish) { + publishSql = " AND ISPUBLISH=1"; + } + + String sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE 1=1" + + useSql + publishSql + wsIdSql + deptSql + methodIdSql + categorySql + + " ORDER BY PLLEVEL,PLORDERINDEX"; + + return DBSql.query(sql, params, new PALRespositoryModelMapper()); + } + + /** + * 资产库查询 + * @param wsId + * @param plName + * @param plNo + * @param pid + * @param bottomLevel + * @param plDesc + * @param plRd + * @param plRp + * @param pm + * @param plInput + * @param plOutput + * @param execType + * @param color + * @param category + * @param methodId + * @param isUsed + * @param isPublish + * @param dutyDept + * @param dutyPerson + * @param paramMap + * @param order + * @return + */ + public List searchRepositoryList(String wsId, String plName, String plNo, String pid, int bottomLevel, String plDesc, String plRd, String plRp, + String pm, String plInput, String plOutput, int execType, String color, String category, String methodId, boolean isUsed, boolean isPublish, String dutyDept, + String dutyPerson, int plLevel, JSONArray paramMap, String order) { + StringBuilder sql = new StringBuilder("SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE 1=1"); + Map params = new HashMap(); + if (!UtilString.isEmpty(wsId)) { + sql.append(" AND WSID=:WSID"); + params.put("WSID", wsId); + + } + if (!UtilString.isEmpty(plName)) { + String namelike = ""; + if (StringUtil.containSpecialChar(plName)) { + namelike = "'%" + StringUtil.replaceSqlStr(plName, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + plName + "%'"; + } + sql.append(" AND PLNAME like ").append(namelike); + } + if (!UtilString.isEmpty(plNo)) { + sql.append(" AND PLNO=:PLNO"); + params.put("PLNO", plNo); + } + if (!UtilString.isEmpty(pid)) { + sql.append(" AND PLPARENTID=:PID"); + params.put("PID", pid); + } + if (bottomLevel != -1) { + sql.append(" AND PLISBOTTOMLEVEL=:BOTTOMLEVEL"); + params.put("BOTTOMLEVEL", bottomLevel); + } + if (!UtilString.isEmpty(plDesc)) { + sql.append(" AND PLDESC LIKE :PLDESC"); + params.put("PLDESC", "%" + plDesc + "%"); + } + if (!UtilString.isEmpty(plRd)) { + sql.append(" AND PLRD=:PLRD"); + params.put("PLRD", plRd); + } + if (!UtilString.isEmpty(plRp)) { + sql.append(" AND PLRP=:PLRP"); + params.put("PLRP", plRp); + } + if (!UtilString.isEmpty(pm)) { + sql.append(" AND PM=:PM"); + params.put("PM", pm); + } + if (!UtilString.isEmpty(plInput)) { + sql.append(" AND PLINPUT LIKE PLINPUT"); + params.put("PLINPUT", "%" + plInput + "%"); + } + if (!UtilString.isEmpty(plOutput)) { + sql.append(" AND PLOUTPUT LIKE PLOUTPUT"); + params.put("PLOUTPUT", "%" + plOutput + "%"); + } + if (execType != -1) { + sql.append(" AND PLEXECTYPE=:PLEXECTYPE"); + params.put("PLEXECTYPE", execType); + } + if (!UtilString.isEmpty(color)) { + sql.append(" AND PLCOLOR=:PLCOLOR"); + params.put("PLCOLOR", color); + } + if (!UtilString.isEmpty(category)) { + sql.append(" AND PLCATEGORY=:PLCATEGORY"); + params.put("PLCATEGORY", category); + } + if (!UtilString.isEmpty(methodId)) { + sql.append(" AND PLMETHODID=:PLMETHODID"); + params.put("PLMETHODID", methodId); + } + if (isUsed) { + sql.append(" AND ISUSE=1"); + } + if (isPublish) { + sql.append(" AND ISPUBLISH=1"); + } + if (!UtilString.isEmpty(dutyDept)) { + sql.append(" AND PLDUTYDEPT=:PLDUTYDEPT"); + params.put("PLDUTYDEPT", dutyDept); + } + if (!UtilString.isEmpty(dutyPerson)) { + sql.append(" AND PLDUTYPERSON=:PLDUTYPERSON"); + params.put("PLDUTYPERSON", dutyPerson); + } + if (plLevel != -1) { + sql.append(" AND PLLEVEL=:PLLEVEL"); + params.put("PLLEVEL", plLevel); + } + if (paramMap != null && paramMap.size() > 0) { + boolean flag = false; + StringBuilder tables = new StringBuilder(); + StringBuilder wheres = new StringBuilder(); + for (int i = 0; i < paramMap.size(); i++) { + JSONObject param = paramMap.getJSONObject(i); + if (flag) { + tables.append(" , "); + wheres.append(" AND "); + } else { + flag = true; + wheres.append(" WHERE "); + } + tables.append(" APP_ACT_COE_PAL_PROP p" + i); + String key = param.getString("key"); + String value = param.getString("value"); + wheres.append("p" + i + ".PROPERTYID='" + key + "' AND p" + i + ".PROPERTYVALUE" + value); + } + sql.append(" AND ID IN (SELECT p0.PLID FROM ").append(tables).append(wheres).append(" )"); + } + + if (!UtilString.isEmpty(order)) { + sql.append(" ORDER BY ").append(order); + } + + return DBSql.query(sql.toString(), params, new PALRespositoryModelMapper()); + } + + /** + * 流程树--搜索流程 + * @param wsId + * @param methodId + * @param category + * @param isUsed + * @param isPublish + * @param deptIds 部门ids + * @param displayType 发布版本下,没有发布版本流程是否可见:hidden-不可见, visible-可见 + * @return + */ + public List searchRepositoryListForProcessTree(String wsId, String methodId, String category, boolean isUse, boolean isPublish, String deptIds, String palName) { + StringBuilder sql = new StringBuilder("SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE 1=1"); + Map paraMap = new HashMap(); + if (UtilString.isEmpty(wsId)) { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + wsId = defaultWsId; + } + } + if (!UtilString.isEmpty(wsId)) { + sql.append(" AND WSID = :WSID"); + paraMap.put("WSID", wsId); + } + if (!UtilString.isEmpty(methodId)) { + sql.append(" AND PLMETHODID = :METHODID "); + paraMap.put("METHODID", methodId); + } + + if (!UtilString.isEmpty(category)) { + sql.append(" AND PLCATEGORY = :CATEGORY "); + paraMap.put("CATEGORY", category); + } + if (isUse) { + sql.append(" AND ISUSE=1 "); + } + if (isPublish) { + sql.append(" AND ISPUBLISH=1 "); + } + if (!UtilString.isEmpty(deptIds)) { + sql.append(" AND PLDUTYDEPT IN (").append(deptIds).append(")"); + } + if (!UtilString.isEmpty(palName)) { + sql.append(" AND PLNAME LIKE :PALNAME "); + paraMap.put("PALNAME", "%" + palName + "%"); + } + sql.append(" ORDER BY PLLEVEL,PLORDERINDEX "); + return DBSql.query(sql.toString(), paraMap, new PALRespositoryModelMapper()); + } + + /** + * 获取指定部门的指定层级的流程 + * @param deptId + * @param wsId + * @param methodId + * @param category + * @param isUsed + * @param isPublish + * @param level + * @return + */ + public List getSpecityLevelByDeptId(String deptId, String wsId, String methodId, String category, boolean isUsed, boolean isPublish, int level) { + Map paraMap = new HashMap(); + String deptSql = ""; + StringBuffer sb = new StringBuffer(); + String[] listStr = deptId.split(","); + for (int i = 0, len = listStr.length; i < len; i++) { + if (i == 0) { + sb.append(" AND PLDUTYDEPT IN ("); + } + sb.append(listStr[i]); + if (i >= 900 && i < len - 1) { + if (i % 900 == 0) { + sb.append(") OR PLDUTYDEPT IN ("); + } else { + sb.append(","); + } + + } else if (i < len - 1) { + sb.append(","); + } + if (i == len - 1) { + sb.append(")"); + } + } + deptSql = sb.toString(); + String wsIdSql = ""; + if (UtilString.isEmpty(wsId)) { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + wsId = defaultWsId; + } + } + if (!UtilString.isEmpty(wsId)) { + wsIdSql = " AND WSID = :WSID"; + paraMap.put("WSID", wsId); + } + String methodIdSql = ""; + if (!UtilString.isEmpty(methodId)) { + methodIdSql = " AND PLMETHODID = :METHODID"; + paraMap.put("METHODID", methodId); + } + + String categorySql = ""; + if (!UtilString.isEmpty(category)) { + categorySql = " AND PLCATEGORY = :CATEGORY"; + paraMap.put("CATEGORY", category); + } + + String useSql = ""; + if (isUsed) { + useSql = " AND ISUSE=1"; + } + + String publishSql = ""; + if (isPublish) { + publishSql = " AND ISPUBLISH=1"; + } + String levelSql = ""; + if (level > 0) { + levelSql = " AND PLLEVEL = :PLLEVEL"; + paraMap.put("PLLEVEL", level); + } + String sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE 1=1 " + useSql + publishSql + wsIdSql + deptSql + methodIdSql + categorySql + levelSql + " ORDER BY PLLEVEL ASC"; + + return DBSql.query(sql, paraMap, new PALRespositoryModelMapper()); + } + + /** + * 流程属性模糊查询 + * @param wsId + * @param plName + * @param plNo + * @param pid + * @param bottomLevel + * @param plDesc + * @param plRd + * @param plRp + * @param pm + * @param plInput + * @param plOutput + * @param execType + * @param color + * @param category + * @param methodId + * @param isUsed + * @param isPublish + * @param dutyDept + * @param dutyPerson + * @param plLevel + * @param paramMap + * @param order + * @return + */ + public List searchByBlur(String wsId, String plName, String plNo, String pid, int bottomLevel, String plDesc, String plRd, String plRp, + String pm, String plInput, String plOutput, int execType, String color, String category, String methodId, boolean isUsed, boolean isPublish, String dutyDept, + String dutyPerson, int plLevel, JSONArray paramMap, String order) { + StringBuilder sql = new StringBuilder("SELECT * FROM " + PALRepositoryModelImpl.DATABASE_ENTITY + " WHERE 1=1"); + Map params = new HashMap(); + if (!UtilString.isEmpty(wsId)) { + sql.append(" AND WSID=:WSID"); + params.put("WSID", wsId); + } + sql.append(" AND ("); + if (!UtilString.isEmpty(plName)) { + String namelike = ""; + if (StringUtil.containSpecialChar(plName)) { + namelike = "'%" + StringUtil.replaceSqlStr(plName, AWSServerConf.isMySQL()) + "%'" + (AWSServerConf.isMySQL() ? "ESCAPE '\\\\'" : " ESCAPE '\\'"); + } else { + namelike = "'%" + plName + "%'"; + } + sql.append(" PLNAME like ").append(namelike); + } + if (!UtilString.isEmpty(plNo)) { + sql.append(" OR PLNO LIKE :PLNO"); + params.put("PLNO", "%" + plNo + "%"); + } + if (!UtilString.isEmpty(plDesc)) { + sql.append(" OR PLDESC LIKE :PLDESC"); + params.put("PLDESC", "%" + plDesc + "%"); + } + if (!UtilString.isEmpty(pm)) { + if (pm.equals("规划")) { + pm = "0"; + } else if (pm.equals("梳理")) { + pm = "1"; + } else if (pm.equals("设计")) { + pm = "2"; + } else if (pm.equals("实施")) { + pm = "3"; + } else if (pm.equals("测试")) { + pm = "4"; + } else if (pm.equals("运行")) { + pm = "5"; + } else if (pm.equals("暂停")) { + pm = "6"; + } + sql.append(" OR PM=:PM"); + params.put("PM", pm); + } + if (!UtilString.isEmpty(plInput)) { + sql.append(" OR PLINPUT LIKE PLINPUT"); + params.put("PLINPUT", "%" + plInput + "%"); + } + if (!UtilString.isEmpty(plOutput)) { + sql.append(" OR PLOUTPUT LIKE PLOUTPUT"); + params.put("PLOUTPUT", "%" + plOutput + "%"); + } + if (execType != -1) { + sql.append(" AND PLEXECTYPE=:PLEXECTYPE"); + params.put("PLEXECTYPE", execType); + } + if (!UtilString.isEmpty(color)) { + sql.append(" AND PLCOLOR=:PLCOLOR"); + params.put("PLCOLOR", color); + } + if (!UtilString.isEmpty(category)) { + sql.append(" OR PLCATEGORY=:PLCATEGORY"); + params.put("PLCATEGORY", category); + } + if (!UtilString.isEmpty(methodId)) { + if (methodId.indexOf("价值链图") > -1) { + methodId = "process.evc"; + } else if (methodId.indexOf("流程图") > -1) { + methodId = "process.flowchart"; + } else if (methodId.indexOf("事件驱动的过程链图") > -1) { + methodId = "process.epc"; + } else if (methodId.indexOf("BPMN流程图") > -1) { + methodId = "process.bpmn2"; + } + sql.append(" OR PLMETHODID=:PLMETHODID"); + params.put("PLMETHODID", methodId); + } + sql.append(" )"); + if (isUsed) { + sql.append(" AND ISUSE=1"); + } + if (isPublish) { + sql.append(" AND ISPUBLISH=1"); + } + if (!UtilString.isEmpty(dutyDept)) { + sql.append(" AND PLDUTYDEPT=:PLDUTYDEPT"); + params.put("PLDUTYDEPT", dutyDept); + } + if (!UtilString.isEmpty(dutyPerson)) { + sql.append(" AND PLDUTYPERSON=:PLDUTYPERSON"); + params.put("PLDUTYPERSON", dutyPerson); + } + if (plLevel != -1) { + sql.append(" AND PLLEVEL=:PLLEVEL"); + params.put("PLLEVEL", plLevel); + } + if (paramMap != null && paramMap.size() > 0) { + boolean flag = false; + StringBuilder tables = new StringBuilder(); + StringBuilder wheres = new StringBuilder(); + for (int i = 0; i < paramMap.size(); i++) { + JSONObject param = paramMap.getJSONObject(i); + if (flag) { + tables.append(" , "); + wheres.append(" AND "); + } else { + flag = true; + wheres.append(" WHERE "); + } + tables.append(" APP_ACT_COE_PAL_PROP p" + i); + String key = param.getString("key"); + String value = param.getString("value"); + wheres.append("p" + i + ".PROPERTYID='" + key + "' AND p" + i + ".PROPERTYVALUE" + value); + } + sql.append(" AND ID IN (SELECT p0.PLID FROM ").append(tables).append(wheres).append(" )"); + } + + if (!UtilString.isEmpty(order)) { + sql.append(" ORDER BY ").append(order); + } + + return DBSql.query(sql.toString(), params, new PALRespositoryModelMapper()); + } + + /** + * 获取流程(库,分类,方式,使用,发布,级别) + * @param wsId 资产库Id,为空则查询默认资产库 + * @param methodId + * @param category + * @param isUsed + * @param isPublish + * @return + */ + public List getDoorPALRepositoryModels(String wsId, int level, String methodId, String category, boolean isUsed, boolean isPublish) { + Map params = new HashMap(); + // + String wsIdSql = ""; + if (UtilString.isEmpty(wsId)) { + String defaultWsId = SDK.getAppAPI().getProperty(CoEConstant.APP_ID, CoEConstant.PROPERTY_DEFAULT_WSID); + if (!UtilString.isEmpty(defaultWsId)) { + wsId = defaultWsId; + } + } + if (!UtilString.isEmpty(wsId)) { + wsIdSql = " AND WSID = :WSID"; + params.put("WSID", wsId); + } + // + String levelSql = ""; + if(level>0) { + levelSql = " AND PLLEVEL = :LEVEL "; + params.put("LEVEL", level); + } + // + String methodIdSql = ""; + if (!UtilString.isEmpty(methodId)) { + methodIdSql = " AND PLMETHODID = :METHODID"; + params.put("METHODID", methodId); + } + // + String categorySql = ""; + if (!UtilString.isEmpty(category)) { + categorySql = " AND PLCATEGORY = :CATEGORY"; + params.put("CATEGORY", category); + } + // + String useSql = ""; + if (isUsed) { + useSql = " AND ISUSE=1"; + } + // + String publishSql = ""; + if (isPublish) { + publishSql = " AND ISPUBLISH=1"; + } + // + String sql = "SELECT * FROM APP_ACT_COE_PAL_REPOSITORY pal WHERE 1=1 " + + useSql + publishSql + wsIdSql + methodIdSql + categorySql + levelSql + + " ORDER BY PLLEVEL, PLORDERINDEX"; + return DBSql.query(sql, params, new PALRespositoryModelMapper()); + } + + /** + * 批量更新流程路径 + * @param map + * @return + */ + public boolean updateFilePath(Map map) { + boolean completeSuccess = false; + if (!map.isEmpty()) { + Connection conn = DBSql.open(); + PreparedStatement ps = null; + ResultSet rset = null; + try { + conn.setAutoCommit(false); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_FILE_PATH + "=? where " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + ps = conn.prepareStatement(sql); + for(Map.Entry entry : map.entrySet()) { + ps.setString(1, entry.getValue()); + ps.setString(2, entry.getKey()); + ps.addBatch(); + } + int[] results = ps.executeBatch(); + for (int i = 0; i < results.length; i++) { + if ((results[i] >= 0) || (results[i] == PreparedStatement.SUCCESS_NO_INFO)) { + completeSuccess = true; + } + } + if (completeSuccess) { + conn.commit(); + } else { + conn.rollback(); + PALRepositoryCache.getCache().reload(true); + } + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + } finally { + DBSql.close(conn, ps, rset); + } + } + return completeSuccess; + } + + /** + * 更新扩展字段内容 + * @param uuid + * @param ext1 + * @param ext2 + * @param ext3 + * @param ext4 + */ + public int updateRepositoryExt(String uuid, String ext1, String ext2, String ext3, String ext4) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_EXT1 + "=?," + PALRepositoryModelImpl.FIELD_PL_EXT2 + "=?," + PALRepositoryModelImpl.FIELD_PL_EXT3 + "=?," + PALRepositoryModelImpl.FIELD_PL_EXT4 + "=? WHERE " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object[] args = {ext1 == null ? "" : ext1, ext2 == null ? "" : ext2, ext3 == null ? "" : ext3, ext4 == null ? "" : ext4, uuid}; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setExt1(ext1 == null ? "" : ext1); + plModel.setExt2(ext2 == null ? "" : ext2); + plModel.setExt3(ext3 == null ? "" : ext3); + plModel.setExt4(ext4 == null ? "" : ext4); + PALRepositoryCache.getCache().put(uuid, plModel); + } + return r; + } + + /** + * 更新创建人、修改人、创建时间、修改时间字段内容 + * @param uuid + * @param createUser + * @param modifyUser + * @param createDate + * @param modifyDate + * @return + */ + public int updateRepositoryUserAndDate(String uuid, String createUser, String modifyUser, Timestamp createDate, Timestamp modifyDate) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_CREATEUSER + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYUSER + "=?," + PALRepositoryModelImpl.FIELD_PL_CREATEDATE + "=?," + PALRepositoryModelImpl.FIELD_PL_MODIFYDATE + "=? WHERE " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + if (UtilString.isEmpty(createUser)) { + createUser = plModel.getCreateUser(); + } + if (UtilString.isEmpty(modifyUser)) { + modifyUser = plModel.getModifyUser(); + } + if (createDate == null) { + createDate = plModel.getCreateDate(); + } + if (modifyDate == null) { + modifyDate = plModel.getModifyDate(); + } + Object[] args = {createUser, modifyUser, createDate, modifyDate, uuid}; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setCreateUser(createUser); + plModel.setModifyUser(modifyUser); + plModel.setCreateDate(createDate); + plModel.setModifyDate(modifyDate); + PALRepositoryCache.getCache().put(uuid, plModel); + } + return r; + } + + /** + * 修改版本号 + * @param uuid + * @param verNo + * @return + */ + public int updateVerNo(String uuid, double verNo) { + PALRepositoryModelImpl plModel = (PALRepositoryModelImpl) PALRepositoryCache.getCache().get(uuid); + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + String sql = "UPDATE " + PALRepositoryModelImpl.DATABASE_ENTITY + " set " + PALRepositoryModelImpl.FIELD_PL_VER + "=? WHERE " + PALRepositoryModelImpl.FIELD_UUID + "=?"; + Object[] args = {verNo, uuid }; + int r = DBSql.update(sql, args); + if (r > 0) { + plModel.setVersion(verNo); + PALRepositoryCache.getCache().put(uuid, plModel); + } + return r; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/BorrowService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/BorrowService.java new file mode 100644 index 00000000..397b4f72 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/BorrowService.java @@ -0,0 +1,70 @@ +package com.actionsoft.apps.kms.service; + +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bo.engine.BOEngine; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.BOQueryAPI; + +/** + * 借阅 + * + * @author wangshibao + */ +public class BorrowService { + public long totalRecords = 0;// 总行数 + + /** + * 查询某人的借阅信息(过滤掉不同意并且已结束的) + * + * @param uid + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 借阅BO表的List + * @author wangshibao + */ + public List queryBorrow(String uid, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + BOQueryAPI boQueryAPI = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).addQuery("APPLYUSER=", uid).addQuery(" (STATUS IN ('申请中','审批中','同意') OR (STATUS = '不同意' AND ISEND = 0))", null); + // 过滤知识名称 + if (!UtilString.isEmpty(filter)) { + boQueryAPI = boQueryAPI.addQuery(CardModel.CARDNAME + " LIKE ", "%" + filter + "%"); + } + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + if (sortDir.equals("up")) { + boQueryAPI = boQueryAPI.orderBy(CardModel.CARDNAME).asc(); + } else if (sortDir.equals("down")) { + boQueryAPI = boQueryAPI.orderBy(CardModel.CARDNAME).desc(); + } + } else if (sortIndx.equalsIgnoreCase(BOEngine.CREATEDATE)) { + if (sortDir.equals("up")) { + boQueryAPI = boQueryAPI.orderBy(BOEngine.CREATEDATE).asc(); + } else if (sortDir.equals("down")) { + boQueryAPI = boQueryAPI.orderBy(BOEngine.CREATEDATE).desc(); + } + } else if (sortIndx.equalsIgnoreCase("STATUS")) { + if (sortDir.equals("up")) { + boQueryAPI = boQueryAPI.orderBy("STATUS").asc(); + } else if (sortDir.equals("down")) { + boQueryAPI = boQueryAPI.orderBy("STATUS").desc(); + } + } + } + + List boList = boQueryAPI.listPage(firstRow, rowsPerPage); + totalRecords = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).addQuery("APPLYUSER=", uid).addQuery(" (STATUS IN ('申请中','审批中','同意') OR (STATUS = '不同意' AND ISEND = 0))", null).count(); + return boList; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CardService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CardService.java new file mode 100644 index 00000000..39b33416 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CardService.java @@ -0,0 +1,1371 @@ +package com.actionsoft.apps.kms.service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.sql.Types; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSLogUtil; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.CardACCM; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.dao.OptDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.LogModel; +import com.actionsoft.apps.kms.model.MetaDataModel; +import com.actionsoft.apps.kms.model.OptModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.lifecycle.log.AppsLogger; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.database.BatchPreparedStatementSetter; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.DispatcherRequest; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.dc.DCUtil; +import com.actionsoft.bpms.server.fs.file.ReadDCFile; +import com.actionsoft.bpms.server.fs.file.WriteDCFile; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilIO; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.actionsoft.sdk.local.api.PermAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 知识 + * + * @author wangshibao + */ +public class CardService { + public long totalRecords = 0;// 总行数 + + /** + * 查询我的知识 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 知识模型的List + * @author wangshibao + */ + public List queryMyCards(UserContext me, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + List cardModels = new ArrayList<>(); + FileService fileService = new FileService(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (me.getUID().equals(cardModel.getCreateUser())) { + // 过滤知识名称和文件名称 + if (!UtilString.isEmpty(filter)) { + if (!StringUtils.containsIgnoreCase(cardModel.getCardName(), filter) && !fileService.filterFileName(cardModel.getId(), filter)) { + continue; + } + } + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardModel.setCardContext(replaceSessionId(me, getCardContent(dc))); + } else { + cardModel.setCardContext(replaceSessionId(me, cardContext)); + } + cardModels.add(cardModel); + } + } + + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.CREATETIME)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o1.getCreateTime().compareTo(o2.getCreateTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o2.getCreateTime().compareTo(o1.getCreateTime()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = collatorChinese.compare(o1.getCardName(), o2.getCardName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = collatorChinese.compare(o2.getCardName(), o1.getCardName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.READCOUNT)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + long result = o1.getReadCount() - o2.getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + long result = o2.getReadCount() - o1.getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.ISPUBLISHED)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o1.getIsPublished() - o2.getIsPublished(); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o2.getIsPublished() - o1.getIsPublished(); + return result; + } + }); + } + } + } + + List cardModelPageList = new ArrayList<>(); + for (int i = firstRow; i < firstRow + rowsPerPage && i < cardModels.size(); i++) { + cardModelPageList.add(cardModels.get(i)); + } + + totalRecords = cardModels.size(); + return cardModelPageList; + } + + /** + * 查询设置有效期的知识 + * + * @param me + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 知识模型的List + * @author wangshibao + */ + public List queryValidDateCards(UserContext me, int curPage, int rowsPerPage, JSONArray dimensionIdJA, java.util.Date startValidDate, java.util.Date endValidDate, String sortIndx, String sortDir) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + if (dimensionIdJA.size() == 0) { + return new ArrayList(); + } + + CardCache cardCache = CardCache.getCache(); + PublishCache publishCache = PublishCache.getCache(); + + Map cardMap = new HashMap(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardModel.getValidDate() != null && cardModel.getIsPublished() == 1) { + if (!KMSUtil.checkCardAC(cardModel.getId(), me.getUID())) { + continue; + } + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (!UtilString.isEmpty(publishModel.getCardId()) && publishModel.getCardId().equals(cardModel.getId())) { + if (dimensionIdJA.contains(publishModel.getDimensionId())) { + if (startValidDate != null && startValidDate.compareTo(cardModel.getValidDate()) > 0) { + continue; + } + if (endValidDate != null && endValidDate.compareTo(cardModel.getValidDate()) < 0) { + continue; + } + if (!KMSUtil.checkSecurity(me.getUID(), cardModel)) { + continue; + } + cardMap.put(cardModel.getId(), cardModel); + } + } + } + } + } + List cardModels = new ArrayList<>(cardMap.values()); + + // 排序 + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = collatorChinese.compare(o1.getCardName(), o2.getCardName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = collatorChinese.compare(o2.getCardName(), o1.getCardName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.CREATETIME)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o1.getCreateTime().compareTo(o2.getCreateTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o2.getCreateTime().compareTo(o1.getCreateTime()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.VALIDDATE)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o1.getValidDate().compareTo(o2.getValidDate()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + int result = o2.getValidDate().compareTo(o1.getValidDate()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.READCOUNT)) { + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + long result = o1.getReadCount() - o2.getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + long result = o2.getReadCount() - o1.getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase("createUsername")) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getCreateUser()); + UserModel userModel2 = UserCache.getModel(o2.getCreateUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return -1; + } + if (userModel2 == null) { + return 1; + } + int result = collatorChinese.compare(userModel1.getUserName(), userModel2.getUserName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(cardModels, new Comparator() { + @Override + public int compare(CardModel o1, CardModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getCreateUser()); + UserModel userModel2 = UserCache.getModel(o2.getCreateUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return 1; + } + if (userModel2 == null) { + return -1; + } + + int result = collatorChinese.compare(userModel2.getUserName(), userModel1.getUserName()); + return result; + } + }); + } + } + } + + List cardModelPageList = new ArrayList<>(); + for (int i = firstRow; i < firstRow + rowsPerPage && i < cardModels.size(); i++) { + cardModelPageList.add(cardModels.get(i)); + } + totalRecords = cardModels.size(); + return cardModelPageList; + } + + /** + * 创建知识 + * + * @param uid + * @param cardId 知识ID + * @param cardName 知识名称 + * @param validDate 有效期 + * @param onlineLevel 在线控制级别 + * @param securityLevel 保密级别 + * @param cardType 知识类型 + * @return 是否创建成功 + */ + public boolean insertCard(String uid, String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, int isComment, int isRate, String cardContext, String url, String extParams) { + CardModel cardModel = new CardModel(); + cardModel.setCardName(cardName); + cardModel.setCardType(cardType); + cardModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + cardModel.setCreateUser(uid); + cardModel.setId(cardId); + cardModel.setIsPublished(0); + cardModel.setLastUpdate(null); + cardModel.setOnlineLevel(onlineLevel); + cardModel.setReadCount(0); + cardModel.setSecurityLevel(securityLevel); + cardModel.setIsComment(isComment); + cardModel.setIsRate(isRate); + cardModel.setExternalUrl(url); + cardModel.setExtParams(extParams); + + cardModel.setValidDate(validDate); + String cardContextName = cardId; + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, uid, cardId, cardContextName); + if (!UtilString.isEmpty(cardContext)) { + if (setCardContent(cardContext, dc)) { + cardModel.setCardContext(""); + } + } + CardDao cardDao = new CardDao(); + int result = cardDao.insert(cardModel); + if (result == 0) { + return false; + } else { + return true; + } + } + + /** + * 修改知识 + * + * @param uid + * @param cardId 知识ID + * @param cardName 知识名称 + * @param validDate 有效期 + * @param onlineLevel 在线控制级别 + * @param securityLevel 保密级别 + * @param cardType 知识类型 + * @return 是否修改成功 + */ + public boolean updateCard(String uid, String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, int isComment, int isRate, String cardContext) { + CardModel cardModel = CardCache.getCache().get(cardId); + int oldisComment = cardModel.getIsComment(); + int oldisRate = cardModel.getIsRate(); + int oldSecurityLevel = cardModel.getSecurityLevel(); + int oldonlineLevel = cardModel.getOnlineLevel(); + String oldCardName = cardModel.getCardName(); + Date oldvalidDate = cardModel.getValidDate(); + String oldCardContent = cardModel.getCardContext(); + if (UtilString.isEmpty(oldCardContent) || cardModel.getId().equals(oldCardContent)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + oldCardContent = getCardContent(dc); + } + cardModel.setCardName(cardName); + cardModel.setLastUpdate(new Timestamp(System.currentTimeMillis())); + cardModel.setOnlineLevel(onlineLevel); + cardModel.setSecurityLevel(securityLevel); + cardModel.setValidDate(validDate); + cardModel.setIsComment(isComment); + cardModel.setIsRate(isRate); + String cardContextName = cardId; + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, cardContextName); + if (setCardContent(cardContext, dc)) { + cardModel.setCardContext(""); + } + CardDao cardDao = new CardDao(); + int result = cardDao.update(cardModel); + String changeTxt = ""; + if (!cardName.equals(oldCardName)) { + changeTxt = "修改标题[" + oldCardName + "]为[" + cardName + "] "; + } + if (!KMSUtil.replaceText(KMSUtil.getPlainText(oldCardContent)).equals(KMSUtil.replaceText(KMSUtil.getPlainText(cardContext)))) { + changeTxt += ",修改简介 "; + } + try { + if (oldvalidDate.getTime() != validDate.getTime()) { + changeTxt += ",有效期由" + oldvalidDate.toString() + " 改为 " + validDate.toString() + " "; + } + } catch (Exception e) { + + } + + if (oldonlineLevel != onlineLevel) { + changeTxt += ",修改格式转换"; + } + if (oldisComment != isComment) { + changeTxt += "," + (oldisComment == 1 ? "允许评论" : "禁止评论") + " 改为 " + (isComment == 1 ? "允许评论" : "禁止评论") + " "; + } + if (oldisRate != isRate) { + changeTxt += "," + (oldisRate == 1 ? "允许打分" : "禁止打分") + " 改为 " + (isRate == 1 ? "允许打分" : "禁止打分") + " "; + } + if (oldSecurityLevel != securityLevel) { + String oldTxt = "普通"; + String newTxt = "普通"; + if (oldSecurityLevel == 1) { + oldTxt = "秘密"; + } else if (oldSecurityLevel == 2) { + oldTxt = "机密"; + } + if (securityLevel == 1) { + newTxt = "秘密"; + } else if (securityLevel == 2) { + newTxt = "机密"; + } + changeTxt += "," + "保密级别由[" + oldTxt + "]修改为[" + newTxt + "] "; + } + if (!cardName.equals(oldCardName) || !KMSUtil.replaceText(KMSUtil.getPlainText(oldCardContent)).equals(KMSUtil.replaceText(KMSUtil.getPlainText(cardContext)))) {//标题或简介有改动 + new Thread(new Runnable() { + @Override + public void run() { + AppContext appCtx = SDK.getAppAPI().getAppContext(KMSConstant.APP_FULLSEARCH); + if (appCtx != null && SDK.getAppAPI().isActive(appCtx)) { + //修改知识卡片 + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/updateIndex"; + Map params = new HashMap(); + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX_CARD); + params.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE_CARD); + params.put("documentId", cardModel.getId()); + params.put("abstract", KMSUtil.replaceText(KMSUtil.getPlainText(cardContext))); + params.put("title", cardName); + AppAPI appAPI = SDK.getAppAPI(); + ResponseObject resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + //修改已入库的附件的相关信息 + Iterator fileIterator = FileCache.getCache().iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (fileModel.getFileState() == 1) { + CardModel c = CardCache.getCache().get(fileModel.getCardId()); + if (c != null && cardModel.getId().equals(c.getId())) { + String targetDir = AWSServerConf.getProperty("dc.path") + KMSConstant.APP_ID + File.separator + "tmp" + File.separator + cardModel.getId() + File.separator + fileModel.getId() + File.separator;// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + String newFileName = KMSUtil.toDigestUTF8(fileModel.getFileName()) + "." + fileModel.getFileName().substring(fileModel.getFileName().lastIndexOf(".") + 1); + String documentPath = targetDir + newFileName; + Map params1 = new HashMap(); + params1.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params1.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + params1.put("documentPath", documentPath); + params1.put("abstract", cardName); + JSONArray extendFields = new JSONArray(); + JSONObject extendField = new JSONObject(); + extendField.put("fieldName", "cardContent"); + extendField.put("fieldContent", KMSUtil.replaceText(KMSUtil.getPlainText(cardContext))); + extendFields.add(extendField); + params1.put("otherFields", extendFields.toString()); + resultRO = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params1); + } + } + } + } + } + }).start(); + } + if (result == 0) { + return false; + } else { + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(uid); + logModel.setCardId(cardId); + int logType = KMSConstant.LOG_ACCESS_CARD; + if (!UtilString.isEmpty(changeTxt)) { + if (changeTxt.indexOf(",") == 0) { + changeTxt = changeTxt.substring(1, changeTxt.length()); + } + logType = KMSConstant.LOG_ACCESS_OTHER; + } + logModel.setFileId(null); + logModel.setLogInfo(changeTxt); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(logType); + KMSLogUtil.log(logModel); + return true; + } + } + + /** + * 删除知识,同时删除关联的file表以及物理文件 + * + * @param me + * @param cardIdArr 知识ID数组 + * @author wangshibao + */ + public void deleteCard(UserContext me, String[] cardIdArr) { + if (cardIdArr.length == 0) { + throw new AWSException("知识ID不能为空"); + } + Connection conn = null; + try { + LocalTxManager.getInstance().begin(); + conn = DBSql.open(); + // 根据知识ID查询知识model,如果个数不匹配则抛出异常 + String[] cardIdArgs = new String[cardIdArr.length]; + String cardSQLWhere = " " + CardModel.ID + " in ("; + + String commonSQLWhere = " " + FileModel.CARDID + " in (";// 通用sql where,包括评论、日志、元数据、评分、反馈、文件 + for (int i = 0; i < cardIdArr.length; i++) { + String cardId = cardIdArr[i]; + cardSQLWhere += "?,"; + cardIdArgs[i] = cardId; + + commonSQLWhere += "?,"; + } + cardSQLWhere = cardSQLWhere.substring(0, cardSQLWhere.length() - 1); + cardSQLWhere += ")"; + commonSQLWhere = commonSQLWhere.substring(0, commonSQLWhere.length() - 1); + commonSQLWhere += ")"; + + List cardModels = new ArrayList<>(); + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + List cardIdArgList = Arrays.asList(cardIdArgs); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardIdArgList.contains(cardModel.getId())) { + cardModels.add(cardModel); + } + } + + if (cardModels.size() != cardIdArr.length) { + throw new AWSException("知识ID个数不正确"); + } + if (cardModels == null) { + throw new AWSException("知识不存在"); + } + // 如果存在发布状态的知识卡片,抛出异常 + String isPublishedStr = ""; + for (int i = 0; i < cardModels.size(); i++) { + CardModel cardModel = cardModels.get(i); + if (cardModel.getIsPublished() == 1) { + isPublishedStr += "[" + cardModel.getCardName() + "]"; + } + } + if (!"".equals(isPublishedStr)) { + throw new AWSException("知识" + isPublishedStr + "处于发布状态,请先取消发布这些知识。"); + } + OptService optService = new OptService(); + // 删除知识 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_CARD + " WHERE" + cardSQLWhere, cardIdArgs); + // 删除知识相关的评论 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_OPT + " WHERE" + commonSQLWhere + " AND " + OptModel.OPTTYPE + " = " + KMSConstant.OPT_TYPE_COMMENT, cardIdArgs); + // 删除知识相关的日志 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_LOG + " WHERE" + commonSQLWhere, cardIdArgs); + // 删除知识相关的元数据 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_META_DATA + " WHERE" + commonSQLWhere, cardIdArgs); + // 删除知识相关的评分 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_OPT + " WHERE" + commonSQLWhere + " AND " + OptModel.OPTTYPE + " = " + KMSConstant.OPT_TYPE_RATE, cardIdArgs); + // 删除知识相关的反馈 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_OPT + " WHERE" + commonSQLWhere + " AND " + OptModel.OPTTYPE + " = " + KMSConstant.OPT_TYPE_REPORT, cardIdArgs); + // 删除知识关联的文件 + DBSql.update(conn, "DELETE FROM " + KMSConstant.ENTITY_NAME_FILE + " WHERE" + commonSQLWhere, cardIdArgs); + // 删除物理文件 + for (String cardId : cardIdArr) { + CardModel cardModel = CardCache.getCache().get(cardId); + List files = new FileService().queryFiles(cardId); + for (FileModel fm : files) { + DCContext dc = new DCContext(me, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId); + dc.setFileName(KMSUtil.getFileNameOfVersion(fm.getFileName(), fm.getFileVer())); + dc.delete(); + } + //Bug #57787 + DCContext dc_editor = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, "-form-ui-editor-"), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId); + String filePath = dc_editor.getPath(); + File fileDir = new File(filePath); + if(fileDir.exists()){ + File[] allFile = fileDir.listFiles(); + for (File file : allFile) { + String fileName = file.getName(); + DCContext dc = new DCContext(me, DCProfileManager.getDCProfile(KMSConstant.APP_ID,"-form-ui-editor-"), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId); + dc.setFileName(DCUtil.decryptFileName(fileName)); + dc.delete(); + } + } + DCContext content_dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, cardId); + content_dc.delete(); + String content_filePath = content_dc.getPath(); + File content_fileDir = new File(content_filePath); + if(content_fileDir.exists()){ + File[] allFile = content_fileDir.listFiles(); + for (File file : allFile) { + if(file.exists()){ + file.delete(); + } + } + } + } + LocalTxManager.getInstance().commit(); + // 删除缓存 + new CardService().removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs))); + optService.removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs)), KMSConstant.OPT_TYPE_COMMENT); + new MetaDataService().removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs))); + optService.removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs)), KMSConstant.OPT_TYPE_RATE); + optService.removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs)), KMSConstant.OPT_TYPE_REPORT); + new FileService().removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardIdArgs))); + //删除ac + PermAPI permAPI = SDK.getPermAPI(); + for (String cardId : cardIdArgs) { + permAPI.removeAC(CardACCM.resourceType, cardId); + } + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } + + /** + * 发布知识 + * + * @param me + * @param publishCardJA 知识JSON数组 + * @param publishDimensionJA 维度JSON数组 + * @param schemaMetaDataJO 元数据JSON对象 + * @param tags 标签 + * @param publishMemo 描述 + * @param examineInfo 发布信息 + */ + public void publishCard(UserContext me, JSONArray publishCardJA, JSONArray publishDimensionJA, JSONObject schemaMetaDataJO, String tags, String publishMemo, String examineInfo) { + Connection conn = null; + try { + LocalTxManager.getInstance().begin(); + conn = DBSql.open(); + // 检查该维度下是否已经发布过该知识 + if (publishCardJA == null || publishCardJA.size() == 0 || publishDimensionJA == null || publishDimensionJA.size() == 0) { + throw new AWSException("知识分类和知识不能为空"); + } + + for (int i = 0; i < publishCardJA.size(); i++) { + String cardId = publishCardJA.getString(i); + for (int j = 0; j < publishDimensionJA.size(); j++) { + String dimensionId = publishDimensionJA.getString(j); + + boolean checkResult = isPublishedInDimension(cardId, dimensionId); + if (checkResult) { + String dimensionName = DimensionCache.getCache().get(dimensionId).getDimensionName(); + CardModel cardModel = CardCache.getCache().get(cardId); + String cardName = cardModel.getCardName(); + throw new AWSException("知识[" + cardName + "]已经发布在知识分类[" + dimensionName + "]下,不能重复发布"); + } + + } + } + + // 将card标记为已发布 + List cardParamList = new ArrayList(); + String updateCardSql = "UPDATE " + KMSConstant.ENTITY_NAME_CARD + " SET " + CardModel.ISPUBLISHED + " = 1 WHERE " + CardModel.ISPUBLISHED + " = 0 AND " + CardModel.ID + " IN ("; + for (int i = 0; i < publishCardJA.size(); i++) { + String cardId = publishCardJA.getString(i); + updateCardSql += "?,"; + cardParamList.add(cardId); + } + updateCardSql = updateCardSql.substring(0, updateCardSql.length() - 1); + updateCardSql += ")"; + DBSql.update(updateCardSql, cardParamList.toArray()); + + // 插入publish表 + String insertPublishSql = "INSERT INTO " + KMSConstant.ENTITY_NAME_PUBLISH + "(" + PublishModel.ID + "," + PublishModel.CARDID + "," + PublishModel.DIMENSIONID + "," + PublishModel.PUBLISHUSER + "," + PublishModel.PUBLISHTIME + "," + PublishModel.TAG + "," + PublishModel.MEMO + "," + PublishModel.EXAMINEINFO + ") VALUES (?,?,?,?,?,?,?,?)"; + + // 插入meta_data表 + String insertMetaDataSql = "INSERT INTO " + KMSConstant.ENTITY_NAME_META_DATA + "(" + MetaDataModel.ID + "," + MetaDataModel.CARDID + "," + MetaDataModel.SCHEMAID + "," + MetaDataModel.ATTRID + "," + MetaDataModel.CREATETIME + "," + MetaDataModel.CREATEUSER + "," + MetaDataModel.METATEXT + ") VALUES (?,?,?,?,?,?,?)"; + + final List publishModels = new ArrayList<>(); + final List metaDataModels = new ArrayList<>(); + for (int i = 0; i < publishCardJA.size(); i++) { + String cardId = publishCardJA.getString(i); + for (int j = 0; j < publishDimensionJA.size(); j++) { + String dimensionId = publishDimensionJA.getString(j); + + String publishId = UUIDGener.getObjectId(); + Timestamp publishTime = new Timestamp(System.currentTimeMillis()); + + PublishModel publishModel = new PublishModel(); + publishModel.setId(publishId); + publishModel.setCardId(cardId); + publishModel.setDimensionId(dimensionId); + publishModel.setPublishUser(me.getUID()); + publishModel.setPublishTime(publishTime); + if (UtilString.isEmpty(tags)) { + publishModel.setTag(null); + } else { + publishModel.setTag(tags); + } + publishModel.setMemo(publishMemo); + publishModel.setExamineInfo(examineInfo); + publishModels.add(publishModel); + } + + JSONArray checkboxRadioJA = schemaMetaDataJO.getJSONArray("01"); + for (int j = 0; j < checkboxRadioJA.size(); j++) { + JSONObject checkboxRadioJO = checkboxRadioJA.getJSONObject(j); + String attrId = checkboxRadioJO.getString("attrId"); + String schemaId = checkboxRadioJO.getString("schemaId"); + + String metaDataId = UUIDGener.getObjectId(); + Timestamp metaDataCreateTime = new Timestamp(System.currentTimeMillis()); + + MetaDataModel metaDataModel = new MetaDataModel(); + metaDataModel.setAttrId(attrId); + metaDataModel.setCardId(cardId); + metaDataModel.setCreateTime(metaDataCreateTime); + metaDataModel.setCreateUser(me.getUID()); + metaDataModel.setId(metaDataId); + metaDataModel.setMetaText(null); + metaDataModel.setSchemaId(schemaId); + + metaDataModels.add(metaDataModel); + } + JSONArray textJA = schemaMetaDataJO.getJSONArray("2"); + for (int j = 0; j < textJA.size(); j++) { + JSONObject textJO = textJA.getJSONObject(j); + String metaValue = textJO.getString("metaValue"); + String schemaId = textJO.getString("schemaId"); + + String metaDataId = UUIDGener.getObjectId(); + Timestamp metaDataCreateTime = new Timestamp(System.currentTimeMillis()); + + MetaDataModel metaDataModel = new MetaDataModel(); + metaDataModel.setAttrId(null); + metaDataModel.setCardId(cardId); + metaDataModel.setCreateTime(metaDataCreateTime); + metaDataModel.setCreateUser(me.getUID()); + metaDataModel.setId(metaDataId); + metaDataModel.setMetaText(metaValue); + metaDataModel.setSchemaId(schemaId); + + metaDataModels.add(metaDataModel); + } + } + DBSql.batch(conn, insertPublishSql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement pstmt, int index) throws SQLException { + PublishModel publishModel = publishModels.get(index); + pstmt.setString(1, publishModel.getId()); + pstmt.setString(2, publishModel.getCardId()); + pstmt.setString(3, publishModel.getDimensionId()); + pstmt.setString(4, publishModel.getPublishUser()); + pstmt.setTimestamp(5, publishModel.getPublishTime()); + if (UtilString.isEmpty(publishModel.getTag())) { + pstmt.setNull(6, Types.VARCHAR); + } else { + pstmt.setString(6, publishModel.getTag()); + } + pstmt.setString(7, publishModel.getMemo()); + if (publishModel.getExamineInfo() == null) { + pstmt.setNull(8, Types.VARCHAR); + } else { + pstmt.setString(8, publishModel.getExamineInfo()); + } + } + + @Override + public int getBatchSize() { + + return publishModels.size(); + } + }); + + DBSql.batch(conn, insertMetaDataSql, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement pstmt, int index) throws SQLException { + MetaDataModel metaDataModel = metaDataModels.get(index); + pstmt.setString(1, metaDataModel.getId()); + pstmt.setString(2, metaDataModel.getCardId()); + pstmt.setString(3, metaDataModel.getSchemaId()); + pstmt.setString(4, metaDataModel.getAttrId()); + pstmt.setTimestamp(5, metaDataModel.getCreateTime()); + pstmt.setString(6, metaDataModel.getCreateUser()); + if (metaDataModel.getMetaText() == null) { + pstmt.setNull(7, Types.VARCHAR); + } else { + pstmt.setString(7, metaDataModel.getMetaText()); + } + } + + @Override + public int getBatchSize() { + return metaDataModels.size(); + } + }); + LocalTxManager.getInstance().commit(); + + // 更新缓存 + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardParamList.contains(cardModel.getId()) && cardModel.getIsPublished() == 0) { + cardModel.setIsPublished(1); + cardCache.put(cardModel.getId(), cardModel); + cardParamList.remove(cardModel.getId()); + } + } + // 更新缓存 + PublishCache publishCache = PublishCache.getCache(); + for (PublishModel publishModel : publishModels) { + publishCache.put(publishModel.getId(), publishModel); + } + + // 更新缓存 + MetaDataCache metaDataCache = MetaDataCache.getCache(); + for (MetaDataModel metaDataModel : metaDataModels) { + metaDataCache.put(metaDataModel.getId(), metaDataModel); + } + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw new AWSException(e); + } + } + + /** + * 是否已经发布在了该维度下 + * + * @param cardId + * @param dimensionId + * @return + * @author wangshibao + */ + public boolean isPublishedInDimension(String cardId, String dimensionId) { + boolean checkResult = false; + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel != null && cardId.equals(publishModel.getCardId()) && publishModel.getDimensionId().equals(dimensionId)) { + if (publishModel.getExamineInfo() == null || publishModel.getExamineInfo().contains("\"同意\"")) {// "同意"代表审批通过 + checkResult = true; + break; + } + } + } + return checkResult; + } + + /** + * 发布知识 + * + * @param me + * @param publishCardJA 知识JSON数组 + * @param publishDimensionJA 维度JSON数组 + * @param schemaMetaDataJO 元数据JSON对象 + * @param tags 标签 + * @param publishMemo 描述 + */ + public void publishCard(UserContext me, JSONArray publishCardJA, JSONArray publishDimensionJA, JSONObject schemaMetaDataJO, String tags, String publishMemo) { + publishCard(me, publishCardJA, publishDimensionJA, schemaMetaDataJO, tags, publishMemo, null); + } + + /** + * 根据人员统计知识和文件个数 + * + * @return Map> + * @author wangshibao + */ + public Map> statCardFileByUser() { + final Map> statMap = new LinkedHashMap>();// 有序集合 + Connection conn = DBSql.open(); + try { + // 统计知识 + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + String createUser = cardModel.getCreateUser(); + + Map userMap = statMap.get(createUser); + if (userMap == null) { + userMap = new HashMap(); + userMap.put("createUsername", UserCache.getModel(cardModel.getCreateUser()) == null ? cardModel.getCreateUser() : UserCache.getModel(cardModel.getCreateUser()).getUserName()); + userMap.put("card", String.valueOf(0)); + userMap.put("file", String.valueOf(0)); + } + int count = userMap.get("card") == null ? 0 : Integer.valueOf(userMap.get("card")); + userMap.put("card", String.valueOf(++count)); + + statMap.put(createUser, userMap); + } + + // 统计文件 + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + String createUser = fileModel.getCreateUser(); + Map userMap = statMap.get(createUser); + if (userMap == null) { + userMap = new HashMap(); + userMap.put("createUsername", UserCache.getModel(fileModel.getCreateUser()) == null ? fileModel.getCreateUser() : UserCache.getModel(fileModel.getCreateUser()).getUserName()); + userMap.put("card", String.valueOf(0)); + userMap.put("file", String.valueOf(0)); + } + int count = userMap.get("file") == null ? 0 : Integer.valueOf(userMap.get("file")); + userMap.put("file", String.valueOf(++count)); + statMap.put(createUser, userMap); + } + } finally { + DBSql.close(conn); + } + return statMap; + } + + /** + * 修改知识已发布为未发布 + * + * @param cardId 知识ID + * @author wangshibao + */ + public void updateCardIsPublishedStatus(Connection conn, String cardId) { + // 判断知识是否还存在于发布表 + PublishService publishService = new PublishService(); + int count = publishService.getPublishedCountByCardId(cardId); + if (count == 0) {// 不存在则修改知识的ISPUBLISHED状态为0 + int result = DBSql.update(conn, "UPDATE " + KMSConstant.ENTITY_NAME_CARD + " SET " + CardModel.ISPUBLISHED + " = 0 WHERE " + CardModel.ID + " = ? AND " + CardModel.ISPUBLISHED + " <> 0", new Object[] { cardId }); + if (result != 0) { + // 更新cache + CardCache cardCache = CardCache.getCache(); + CardModel cardModel = cardCache.get(cardId); + cardModel.setIsPublished(0); + cardCache.put(cardId, cardModel); + } + } + } + + /** + * 修改知识已发布为未发布 + * + * @param cardId 知识ID + * @author wangshibao + */ + public void updateCardIsPublishedStatus(String cardId) { + // 判断知识是否还存在于发布表 + PublishService publishService = new PublishService(); + int count = publishService.getPublishedCountByCardId(cardId); + if (count == 0) {// 不存在则修改知识的ISPUBLISHED状态为0 + int result = DBSql.update("UPDATE " + KMSConstant.ENTITY_NAME_CARD + " SET " + CardModel.ISPUBLISHED + " = 0 WHERE " + CardModel.ID + " = ? AND " + CardModel.ISPUBLISHED + " <> 0", new Object[] { cardId }); + if (result != 0) { + // 更新cache + CardCache cardCache = CardCache.getCache(); + CardModel cardModel = cardCache.get(cardId); + cardModel.setIsPublished(0); + cardCache.put(cardId, cardModel); + } + } + } + + /** + * 根据维度ID查询发布到该维度下的知识模型列表 + * + * @param dimensionId 维度ID + * @return + * @author wangshibao + */ + public List queryCardsByDimensionId(String dimensionId) { + List cardModels = new ArrayList<>(); + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + PublishCache publishCache = PublishCache.getCache(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardModel.getIsPublished() == 1) { + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getCardId().equals(cardModel.getId()) && publishModel.getDimensionId().equals(dimensionId)) { + cardModels.add(cardModel); + break;// 某个知识只能发布到某个维度下一次,不能重复 + } + } + } + } + return cardModels; + } + + /** + * 延期日期 + * + * @param cardIdArr 知识JSON数组 + * @param validDate + * @author wangshibao + */ + public void delayValiddate(JSONArray cardIdArr, String validDate) { + if (cardIdArr.size() != 0) { + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_CARD + " SET " + CardModel.VALIDDATE + " = ? WHERE " + CardModel.ID + " IN ("; + Object[] params = new Object[cardIdArr.size() + 1]; + params[0] = UtilDate.parse(validDate); + for (int i = 0; i < cardIdArr.size(); i++) { + sql += " ?,"; + params[i + 1] = cardIdArr.getString(i); + } + sql = sql.substring(0, sql.length() - 1); + sql += ")"; + + int result = DBSql.update(sql, params); + if (result != 0) { + // 更新缓存 + CardCache cardCache = CardCache.getCache(); + for (int i = 0; i < cardIdArr.size(); i++) { + CardModel cardModel = cardCache.get(cardIdArr.getString(i)); + cardModel.setValidDate(new Date(UtilDate.parse(validDate).getTime())); + } + } + } + } + + /** + * 根据cardId集合删除缓存, 注意:为了加快查询速度,cardIdList会被修改 + * + * @param cardIdList + * @author wangshibao + */ + public void removeCacheByCardIds(List cardIdList) { + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (cardIdList.contains(cardModel.getId())) { + cardCache.remove(cardModel.getId()); + cardIdList.remove(cardModel.getId()); + } + if (cardIdList.size() == 0) { + break; + } + } + } + + /** + * 反馈知识(给管理员发送邮件) + * + * @param cardId + * @param reportContent + * @param uid + * @author wangshibao + */ + public void reportCard(String cardId, String dimensionId, String reportContent, String uid) { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + throw new AWSException("知识不存在,知识ID:" + cardId); + } + OptModel optModel = new OptModel(); + optModel.setCardId(cardId); + String optId = UUIDGener.getObjectId(); + optModel.setId(optId); + try { + reportContent = URLDecoder.decode(reportContent, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + optModel.setOptContent(reportContent); + optModel.setOptTime(new Timestamp(System.currentTimeMillis())); + optModel.setOptType(KMSConstant.OPT_TYPE_REPORT); + optModel.setOptUser(uid); + int result = new OptDao().insert(optModel); + if (result == 1) { + try {// 给知识管理员发送邮件(优先维度管理员 其次) + String knwlMgrMail = ""; + if (!UtilString.isEmpty("dimensionId") && !dimensionId.equals("undefined")) { + List dimensionMgrUserModels = SDK.getPermAPI().getUserListByAC(dimensionId, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, DimensionMgrACCM.DIMENSION_MGR.getType()); + for (UserModel userModel : dimensionMgrUserModels) { + if (userModel != null && !userModel.isClosed() && !UtilString.isEmpty(userModel.getEmail())) { + knwlMgrMail += userModel.getEmail() + ";"; + } + } + } + if ("".equals(knwlMgrMail)) { + List knwlMgrUserModels = SDK.getPermAPI().getUserListByAC(KMSConstant.AC_RESOURCE_ID_KNWL_MGR, KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR); + for (int i = 0; i < knwlMgrUserModels.size(); i++) { + UserModel userModel = knwlMgrUserModels.get(i); + if (userModel != null && !userModel.isClosed() && !UtilString.isEmpty(userModel.getEmail())) { + knwlMgrMail += userModel.getEmail() + ";"; + } + } + } + if ("".equals(knwlMgrMail)) { + knwlMgrMail = UserCache.getModel("admin").getEmail(); + } + if (knwlMgrMail.endsWith(";")) { + knwlMgrMail = knwlMgrMail.substring(0, knwlMgrMail.length() - 1); + } + if ("".equals(knwlMgrMail)) { + AppsLogger.err(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "KMS知识管理员和admin均未设置外网邮箱,导致用户反馈内容无法发送,OptModel的ID:" + optId); + } else if (!SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.mail"))) { + AppsLogger.err(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "邮件通知app不是可用状态,导致用户反馈内容无法发送,OptModel的ID:" + optId); + } else { + String title = "来自[" + (UserCache.getModel(uid) == null ? uid : UserCache.getModel(uid).getUserName()) + "]关于知识[" + cardModel.getCardName() + "]的反馈"; + + String reportContent1 = + "
KMS知识管理员,您好

" + + title + ",内容如下:

" + reportContent + "

"; + // 调用异步发送的api,完成发送 + SDK.getNotificationAPI().sendEMailAsync("", knwlMgrMail, "", title, reportContent1); + + } + } catch (Exception e) { + e.printStackTrace(); + } + try {// 给知识管理员发送通知 + AppContext notificationApp = SDK.getAppAPI().getAppContext("com.actionsoft.apps.notification"); + if (SDK.getAppAPI().isActive(notificationApp)) { + String knwlMgrIds = ""; + if (!UtilString.isEmpty("dimensionId") && !dimensionId.equals("undefined")) { + List dimensionMgrUserModels = SDK.getPermAPI().getUserListByAC(dimensionId, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, DimensionMgrACCM.DIMENSION_MGR.getType()); + for (UserModel userModel : dimensionMgrUserModels) { + if (userModel != null && !userModel.isClosed()) { + knwlMgrIds += userModel.getUID() + " "; + } + } + } + if ("".equals(knwlMgrIds)) { + List knwlMgrUserModels = SDK.getPermAPI().getUserListByAC(KMSConstant.AC_RESOURCE_ID_KNWL_MGR, KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR); + for (int i = 0; i < knwlMgrUserModels.size(); i++) { + UserModel userModel = knwlMgrUserModels.get(i); + if (userModel != null && !userModel.isClosed()) { + knwlMgrIds += userModel.getUID() + " "; + } + } + } + if ("".equals(knwlMgrIds)) { + knwlMgrIds = "admin"; + } + if (knwlMgrIds.endsWith(" ")) { + knwlMgrIds = knwlMgrIds.substring(0, knwlMgrIds.length() - 1); + } + // 服务地址 + String aslp = "aslp://com.actionsoft.apps.notification/sendMessage"; + Map params = new HashMap(); + try { + params.put("sender", uid); + params.put("targetIds", knwlMgrIds); + params.put("sourceId", cardId); + JSONObject json = new JSONObject(); + json.put("cardId", cardId); + json.put("reportUser", UserCache.getModel(uid).getUserName()); + json.put("reportContent", reportContent); + json.put("cardName", cardModel.getCardName()); + params.put("content", json.toString()); + params.put("level", "info"); + params.put("systemName", KMSConstant.REPORT_SYSTEM_NAME); + SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), aslp, params); + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 检查若干个知识下是否存在文件,如果不存在则返回知识ID + * + * @param cardIdList + * @return + * @author wangshibao + */ + public String checkCardHasFile(List cardIdList) { + if (cardIdList == null || cardIdList.size() == 0) { + throw new AWSException("知识不能为空"); + } + for (String cardId : cardIdList) { + Iterator fileIterator = FileCache.getCache().iterator(); + boolean flag = false; + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (fileModel.getCardId().equals(cardId)) { + flag = true; + break; + } + } + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel != null) { + if (UtilString.isNotEmpty(cardModel.getCardContext())) { + flag = true; + } + } else { + throw new AWSException("知识不存在"); + } + if (!flag) { + return cardId; + } + } + return null; + } + + public boolean setCardContent(String text, DCContext dc) { + //先删除 + dc.delete(); + if (text == null) { + text = ""; + } + ByteArrayInputStream bis = null; + try { + bis = new ByteArrayInputStream(text.getBytes("UTF-8")); + } catch (Exception e) { + bis = new ByteArrayInputStream(text.getBytes()); + } + return WriteDCFile.getInstance().write(bis, dc); + } + + public String getCardContent(DCContext dc) { + InputStream is = ReadDCFile.getInstance().read(dc); + if (is == null) { + return ""; + } + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try { + UtilIO.copy(is, bos); + } catch (Exception e) { + throw new AWSException("读知识正文内容发生错误", e); + } + + try { + return new String(bos.toByteArray(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return new String(bos.toByteArray()); + } + } + + // 替换session + public static String replaceSessionId(UserContext me, String html) { + Pattern pattern = Pattern.compile("sid=([^&]*)"); + Matcher matcher = pattern.matcher(html); + while (matcher.find()) { + String tmpFind = matcher.group(); + String tmp = ""; + tmp = "sid=" + me.getSessionId(); + html = html.replace(tmpFind, tmp); + } + //替换特殊的字体,防止chrome下面显示成符号 + html = html.replaceAll("font-family:Wingdings", ""); + return html; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CollectionService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CollectionService.java new file mode 100644 index 00000000..a947d336 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/CollectionService.java @@ -0,0 +1,66 @@ +package com.actionsoft.apps.kms.service; + +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.sdk.local.SDK; + +/** + * 收藏 + * + * @author wangshibao + */ +public class CollectionService { + + /** + * 查询某知识是否被某人收藏 + * + * @param cardId 知识ID + * @return + * @author wangshibao + */ + public boolean isCollected(String cardId) { + if (SDK.getAppAPI().isActive("com.actionsoft.apps.favorite")) { + Map params = new HashMap(); + params.put("appId", KMSConstant.APP_ID); + params.put("favoriteId", cardId); + // 是否已收藏 + ResponseObject ro = SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "aslp://com.actionsoft.apps.favorite/isfavorite", params); + boolean isFavorite = false; + if (ro != null && ro.get("isFavorite") != null) { + isFavorite = (Boolean) ro.get("isFavorite"); + } + return isFavorite; + } else { + return false; + } + } + + /** + * 收藏/取消收藏知识 + * + * @param cardId + * @return true:收藏 false:取消收藏 + * @author wangshibao + */ + public boolean toogleCollection(String cardId, String sid) { + // 查询卡片是否被当前人收藏 + boolean isFavorite = isCollected(cardId); + if (isFavorite == false) {// 未收藏 + Map params = new HashMap(); + params.put("sid", sid); + params.put("title", CardCache.getCache().get(cardId).getCardName()); + params.put("id", cardId); + ResponseObject ro = SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "aslp://com.actionsoft.apps.favorite/favorite", params); + return true; + } else {// 已收藏 + Map params = new HashMap(); + params.put("id", cardId); + ResponseObject ro = SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "aslp://com.actionsoft.apps.favorite/unfavorite", params); + return false; + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/DimensionService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/DimensionService.java new file mode 100644 index 00000000..f514c979 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/DimensionService.java @@ -0,0 +1,1111 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Connection; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.ac.KnwlMgrACCM; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.apps.kms.dao.DimensionDao; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.exception.AWSObjectNotFindException; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.PermAPI; + +/** + * 维度 + * + * @author wangshibao + */ +public class DimensionService { + /** + * 查询维度列表 + * + * 特点: 不过滤权限 + * + * @param parentId + * @return + */ + public List queryListMgrDimensionsByParentId(String parentId) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId())) { + dimensionModels.add(dimensionModel); + } + + } + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } + + /** + * 列表:查询维度列表 + * + * 特点:1 仅显示权限内的 + * + * @param parentId 父维度id(如果为null或"",返回根维度列表) + * @return 维度模型的List + * @author wangshibao + */ + public List queryListMgrDimensionsByParentId(String parentId, String uid) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(uid); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId())) { + if (isKnwlMgr) {// 过滤权限 + dimensionModels.add(dimensionModel); + } else { + if (KMSUtil.isDimensionManager(dimensionModel.getId(), uid) || dimensionModel.getCreateUser().equals(uid)) { // 过滤权限 + dimensionModels.add(dimensionModel); + } + } + + } + } + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } + + /** + * 树:查询[管理]维度树的维度 + * + * 特点:1 仅显示权限内的 2 如果父维度无权限而子维度有权限,则禁用但显示父维度 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreeMgrDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + if (isKnwlMgr) { + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId())) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } else { + // 全查但不排序(筛选完毕后再排序,提高效率) + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + boolean isDimensionManager = KMSUtil.isDimensionManager(dimensionModel.getId(), uid); + if (isDimensionManager) { // 过滤权限 + dimensionModel.setHasPerm(true); + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + // 排序 + Collections.sort(permDimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return permDimensionModels; + } + } + + /** + * 树:查询[发布]维度树的维度 + * + * 特点:1 仅显示权限内的 2 如果父维度无权限而子维度有权限,则禁用但显示父维度 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreePublishDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + if (isKnwlMgr) { + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } else { + // 全查但不排序(筛选完毕后再排序,提高效率) + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + if (dimensionModel.getIsEnabled() == 1) { + boolean ac = true; + ac = KMSUtil.canPublishDimension(dimensionModel.getId(), uid); + if (ac) {// 发布权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPublishPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + // 排序 + Collections.sort(permDimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return permDimensionModels; + } + } + + /** + * 树:查询[管理]维度树的维度 + * + * 特点:1 仅显示权限内的 2 如果父维度无权限而子维度有权限,则禁用但显示父维度 3 如果不启用则过滤掉 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreeUsertaskDimensionsByParentId(String parentId, String uid, boolean isKnwlManager) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + if (isKnwlManager) { + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getIsEnabled() == KMSConstant.UNABLED) { + continue; + } + if (parentId.equals(dimensionModel.getParentId())) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } else { + // 全查但不排序(筛选完毕后再排序,提高效率) + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + if (dimensionModel.getIsEnabled() == KMSConstant.UNABLED) { + continue; + } + boolean isDimensionManager = KMSUtil.isDimensionManager(dimensionModel.getId(), uid); + if (isDimensionManager) { // 过滤权限 + dimensionModel.setHasPerm(true); + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + // 排序 + Collections.sort(permDimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return permDimensionModels; + } + } + + public List queryTreeAccessDimensionsByName(String key) { + // 全查但不排序(筛选完毕后再排序,提高效率) + List dimensionModels = new ArrayList<>(); + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getDimensionName().toUpperCase().indexOf(key.toUpperCase()) > -1) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } + + /** + * 树:查询[访问]维度树的维度 + *

+ * 特点:1 仅显示权限内的 2 如果父维度无权限而子维度有权限,则禁用但显示父维度 3 过滤掉未启用的 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreeAccessDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr, List dimensionACList) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + if (isKnwlMgr) { + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } else { + // 全查但不排序(筛选完毕后再排序,提高效率) + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + if (dimensionModel.getIsEnabled() == 1) { + if (dimensionACList != null) { + boolean ac = true; + if (DimensionPermCache.hasCacheByUID(dimensionModel.getId(), uid)) { + ac = DimensionPermCache.getPermByUID(dimensionModel.getId(), uid); + } else { + ac = KMSUtil.canAccessDimension(dimensionModel.getId(), uid, dimensionACList); + } + if (ac) {// 过滤权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } else { + boolean ac = true; + if (DimensionPermCache.hasCacheByUID(dimensionModel.getId(), uid)) { + ac = DimensionPermCache.getPermByUID(dimensionModel.getId(), uid); + } else { + ac = KMSUtil.canAccessDimension(dimensionModel.getId(), uid); + } + if (ac) {// 过滤权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + // 排序 + Collections.sort(permDimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return permDimensionModels; + } + } + + /** + * 树:查询[访问]维度树的维度 + * + * 特点:1 仅显示权限内的 2 如果父维度无权限而子维度有权限,则禁用但显示父维度 3 过滤掉未启用的 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreeAccessDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr) { + return queryTreeAccessDimensionsByParentId(parentId, uid, isKnwlMgr, null); + } + + /** + * 树:查询维度树的维度 + * + * 特点:1 过滤掉未启用的维度 + * + * @param parentId + * @return + * @author wangshibao + */ + public List queryTreeEnabledDimensionsByParentId(String parentId) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + List dimensionModels = new ArrayList<>(); + // 全查但不排序(筛选完毕后再排序,提高效率) + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + dimensionModels.add(dimensionModel); + } + } + // 排序 + Collections.sort(dimensionModels, new Comparator() { + @Override + public int compare(DimensionModel o1, DimensionModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + return dimensionModels; + } + + /** + * 树:查询[访问]维度树的维度 判断是否有权限内的子节点 + * + * @param parentDimensionId + * @param uid + * @return + * @author wangshibao + */ + public boolean isExistChildForQueryTreeAccessDimensionsByParentId(String parentDimensionId, String uid, boolean isKnwlMgr) { + if (UtilString.isEmpty(parentDimensionId)) { + parentDimensionId = ""; + } + if (isKnwlMgr) { + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentDimensionId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + return true; + } + } + } else { + List dimensionModels = new ArrayList<>(); + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentDimensionId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + boolean ac = true; + if (DimensionPermCache.hasCacheByUID(dimensionModel.getId(), uid)) { + ac = DimensionPermCache.getPermByUID(dimensionModel.getId(), uid); + } else { + ac = KMSUtil.canAccessDimension(dimensionModel.getId(), uid); + } + if (ac) { // 过滤权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + for (DimensionModel dimensionModel : permDimensionModels) { + if (parentDimensionId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + return true; + } + } + } + return false; + } + + /** + * 是否存在权限内的子维度 + * + * @param parentId 父维度ID + * @return 是否存在子维度 + * @author wangshibao + */ + public boolean isExistChildForQueryTreeMgrDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + if (isKnwlMgr) { + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentId.equals(dimensionModel.getParentId())) { + return true; + } + } + } else { + // 全查 + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + List dimensionModels = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + if (KMSUtil.isDimensionManager(dimensionModel.getId(), uid)) { // 过滤权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + for (DimensionModel dimensionModel : permDimensionModels) { + if (parentId.equals(dimensionModel.getParentId())) { + return true; + } + } + } + + return false; + } + + /** + * 是否存在权限内的子维度 过滤掉未启用的 + * + * @param parentId 父维度ID + * @return 是否存在子维度 + * @author wangshibao + */ + public boolean isExistChildForQueryTreeUsertaskDimensionsByParentId(String parentId, String uid, boolean isKnwlMgr) { + if (UtilString.isEmpty(parentId)) { + parentId = ""; + } + + if (isKnwlMgr) { + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getIsEnabled() == KMSConstant.UNABLED) { + continue; + } + if (parentId.equals(dimensionModel.getParentId())) { + return true; + } + } + } else { + // 全查 + List dimensionModels = new ArrayList<>(); + List dimensionListOfParent = DimensionCache.getCache().getDimensionListOfParent(parentId); + List mayHasPermDimensionList = new ArrayList<>(); + for (DimensionModel dimensionModel : dimensionListOfParent) { + if (dimensionModel.getIsEnabled() == KMSConstant.UNABLED) { + continue; + } + if (KMSUtil.isDimensionManager(dimensionModel.getId(), uid)) { // 过滤权限 + dimensionModels.add(dimensionModel); + } else { + mayHasPermDimensionList.add(dimensionModel); + } + } + // 获取权限外的必须的父维度 + List permDimensionModels = KMSUtil.getNoPermParentDimensions(mayHasPermDimensionList, uid); + permDimensionModels.addAll(dimensionModels);// 添加权限内的维度 + for (DimensionModel dimensionModel : permDimensionModels) { + if (parentId.equals(dimensionModel.getParentId())) { + return true; + } + } + } + + return false; + } + + /** + * 树:查询维度树的维度 过滤掉未启用的 + * + * @param parentDimensionId + * @return + * @author wangshibao + */ + public boolean isExistChildForTreeEnabledDimensionsByParentId(String parentDimensionId) { + if (UtilString.isEmpty(parentDimensionId)) { + parentDimensionId = ""; + } + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (parentDimensionId.equals(dimensionModel.getParentId()) && dimensionModel.getIsEnabled() == 1) { + return true; + } + } + return false; + } + + /** + * 新建维度 + * + * @param dimensionName 维度名称 + * @param parentId 父维度id + * @param showType 展示类型 + * @param isExamine 是否需要审批 + * @param memo 维度描述 + * @param createUser 创建人uid + * @param hotspotName 知识地图名称 + * @param isEnabled 是否启用 + * @return 返回维度新建的维度id或者抛出异常 + * @author wangshibao + */ + public String createDimension(String dimensionName, String parentId, int showType, boolean isExamine, String memo, String createUser, String hotspotName, boolean isEnabled) { + DimensionModel dimensionModel = new DimensionModel(); + String id = UUIDGener.getObjectId(); + dimensionModel.setDimensionName(dimensionName); + dimensionModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + dimensionModel.setCreateUser(createUser); + dimensionModel.setId(id); + + if (isEnabled) { + dimensionModel.setIsEnabled(KMSConstant.ENABLED); + } else { + dimensionModel.setIsEnabled(KMSConstant.UNABLED); + } + if (isExamine) { + dimensionModel.setIsExamine(KMSConstant.EXAMINE); + } else { + dimensionModel.setIsExamine(KMSConstant.UNEXAMINE); + } + + dimensionModel.setLastUpdate(null); + + dimensionModel.setMemo(memo); + dimensionModel.setParentId(parentId); + if (showType == KMSConstant.SHOWTYPE_HOTSPOT) { + dimensionModel.setHotspotDefId(hotspotName); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_HOTSPOT); + } else if (showType == KMSConstant.SHOWTYPE_DIMENSION) { + dimensionModel.setHotspotDefId(""); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_DIMENSION); + } else if (showType == KMSConstant.SHOWTYPE_CATEGORY) { + dimensionModel.setHotspotDefId(""); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_CATEGORY); + } + + try { + DimensionDao dimensionDao = new DimensionDao(); + + // 新建维度 + dimensionModel.setOrderIndex(getNextOrderIndex(dimensionModel.getParentId())); + dimensionDao.insert(dimensionModel); + DimensionTreeCache.getCache().destroy(); + return id; + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + } + + /** + * 获取下一个orderIndex(同级元素最大order + 1) + * + * @return + * @author wangshibao + */ + public int getNextOrderIndex(String parentDimensionId) { + Iterator iterator = DimensionCache.getCache().iterator(); + int nextOrderIndex = 0; + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getParentId().equals(parentDimensionId) && dimensionModel.getOrderIndex() >= nextOrderIndex) { + nextOrderIndex = dimensionModel.getOrderIndex() + 1; + } + } + return nextOrderIndex; + } + + /** + * 修改维度 + * + * @param id 维度id + * @param dimensionName 维度名称 + * @param showType 展示类型 + * @param isExamine 发布前是否需要审批 + * @param memo 描述 + * @param hotspotName 知识地图名称 + * @param isEnabled 是否启用 + * @return 成功修改返回1,否则抛出异常 + * @author wangshibao + */ + public int updateDimension(String id, String dimensionName, int showType, boolean isExamine, String memo, String hotspotName, boolean isEnabled) { + DimensionModel dimensionModel = DimensionCache.getCache().get(id); + if (dimensionModel == null) { + throw new AWSObjectNotFindException("维度不存在:" + id); + } + + dimensionModel.setDimensionName(dimensionName); + dimensionModel.setMemo(memo); + dimensionModel.setLastUpdate(new Timestamp(System.currentTimeMillis())); + if (isEnabled) { + dimensionModel.setIsEnabled(KMSConstant.ENABLED); + } else { + dimensionModel.setIsEnabled(KMSConstant.UNABLED); + } + if (isExamine) { + dimensionModel.setIsExamine(KMSConstant.EXAMINE); + } else { + dimensionModel.setIsExamine(KMSConstant.UNEXAMINE); + } + if (showType == KMSConstant.SHOWTYPE_HOTSPOT) { + dimensionModel.setHotspotDefId(hotspotName); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_HOTSPOT); + } else if (showType == KMSConstant.SHOWTYPE_DIMENSION) { + dimensionModel.setHotspotDefId(""); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_DIMENSION); + } else if (showType == KMSConstant.SHOWTYPE_CATEGORY) { + dimensionModel.setHotspotDefId(""); + dimensionModel.setShowType(KMSConstant.SHOWTYPE_CATEGORY); + } + DimensionDao dimensionDao = new DimensionDao(); + return dimensionDao.update(dimensionModel); + + } + + /** + * 修改维度 + * + * @param conn + * @param dimensionModel + * @return + * @author wangshibao + */ + public int updateDimension(Connection conn, DimensionModel dimensionModel) { + DimensionDao dimensionDao = new DimensionDao(); + return dimensionDao.update(conn, dimensionModel); + } + + /** + * 删除维度以及后代维度 + * + * @param ids 维度id字符串,分隔 + * @return 删除的维度数量 + * @author wangshibao + */ + public int delete(String ids) { + int result = 0; + try { + LocalTxManager.getInstance().begin(); + // 删除维度 + DimensionDao dimensionDao = new DimensionDao(); + if (UtilString.isEmpty(ids)) { + throw new AWSException("id不能为空"); + } + String[] dimensionIds = ids.split(","); + + // 递归查询子维度id + List dimensionIdList = Arrays.asList(dimensionIds); + List allDimensionIdList = new ArrayList<>(); + for (String dimensionId : dimensionIdList) { + allDimensionIdList.add(dimensionId); + dimensionDao.fillDescendantDimensions(dimensionId, allDimensionIdList); + } + result = dimensionDao.delete(allDimensionIdList); + // 删除发布到该维度的知识和全文检索(如果需要) + PublishService publishService = new PublishService(); + for (String dimensionId : allDimensionIdList) { + List publishModels = publishService.queryPublishByDimensionId(dimensionId); + for (PublishModel publishModel : publishModels) { + boolean deleteResult = publishService.delete(publishModel.getId()); + if (deleteResult) { + // 判断并修改知识的发布状态 + CardService cardService = new CardService(); + cardService.updateCardIsPublishedStatus(publishModel.getCardId()); + try { + // 判断并删除全文检索 + publishService.deleteFullSearch(publishModel.getCardId()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + LocalTxManager.getInstance().commit(); + //删除ac授权 + PermAPI permAPI = SDK.getPermAPI(); + for (String dimensionId : allDimensionIdList) { + permAPI.removeAC(DimensionMgrACCM.resourceType, dimensionId); + + } + DimensionTreeCache.getCache().destroy(); + } catch (Exception e) { + e.printStackTrace(); + LocalTxManager.getInstance().rollback(); + } + return result; + } + + /** + * 获取维度管理员 优先二级知识管理员 其次知识管理员 其次admin + * + * @param dimensionId 维度Id + * @return + * @author wangshibao + */ + public String getDimensionAdmin(String dimensionId) { + String dimensionAdmin = ""; + if (!UtilString.isEmpty(dimensionId)) { + List dimensionACUserModels = SDK.getPermAPI().getUserListByAC(dimensionId, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, DimensionMgrACCM.DIMENSION_MGR.getType()); + for (UserModel userModel : dimensionACUserModels) { + dimensionAdmin += userModel.getUID() + " "; + } + } + if ("".equals(dimensionAdmin)) {// 获取知识管理员 + List knwlMgrUserModels = SDK.getPermAPI().getUserListByAC(KMSConstant.AC_RESOURCE_ID_KNWL_MGR, KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR, KnwlMgrACCM.KNWLMGR.getType()); + for (UserModel userModel : knwlMgrUserModels) { + dimensionAdmin += userModel.getUID() + " "; + } + } + if ("".equals(dimensionAdmin)) { + dimensionAdmin = "admin"; + } + return dimensionAdmin; + } + + /** + * 获取维度管理员以及知识管理员,如果都为空则返回admin + * + * @param dimensionId + * @return + */ + public String getDimensionAdmin1(String dimensionId) { + String dimensionAdmin = ""; + if (!UtilString.isEmpty(dimensionId)) { + List dimensionACUserModels = SDK.getPermAPI().getUserListByAC(dimensionId, KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, DimensionMgrACCM.DIMENSION_MGR.getType()); + for (UserModel userModel : dimensionACUserModels) { + dimensionAdmin += userModel.getUID() + " "; + } + } + // 获取知识管理员 + List knwlMgrUserModels = SDK.getPermAPI().getUserListByAC(KMSConstant.AC_RESOURCE_ID_KNWL_MGR, KMSConstant.AC_RESOURCE_TYPE_KNWL_MGR, KnwlMgrACCM.KNWLMGR.getType()); + for (UserModel userModel : knwlMgrUserModels) { + dimensionAdmin += userModel.getUID() + " "; + } + + if ("".equals(dimensionAdmin)) { + dimensionAdmin = "admin"; + } + return dimensionAdmin; + } + + /** + * 根据维度展示类型查询维度列表 + * + * @param showtype 0:知识地图 1:列表(普通维度) + * @return + * @author wangshibao + */ + public List queryDimensionByShowtype(int showtype) { + List dimensionModels = new ArrayList(); + Iterator dimensionModelIterator = DimensionCache.getCache().iterator(); + while (dimensionModelIterator.hasNext()) { + DimensionModel dimensionModel = dimensionModelIterator.next(); + if (dimensionModel.getShowType() == showtype) { + dimensionModels.add(dimensionModel); + } + } + return dimensionModels; + } + + /** + * 查询某维度的tree路径 + * + * @param dimensionId + * @return 一个从root到dimensionId的list + * @author wangshibao + */ + public List getDimensionPathList(String dimensionId) { + List dimensionList = new ArrayList<>(); + dimensionPathRecursion(dimensionId, dimensionList); + // 反转list + Collections.reverse(dimensionList); + return dimensionList; + } + + /** + * 查询某维度的tree路径 + * + * @param dimensionId + * @return 一个从root到dimensionId的维度名称 用>分隔 + * @author wangshibao + */ + public String getDimensionPath(String dimensionId, String separator) { + List dimensionList = getDimensionPathList(dimensionId); + String dimPath = ""; + for (String dimId : dimensionList) { + dimPath += DimensionCache.getCache().get(dimId).getDimensionName() + separator; + } + if (!dimPath.equals("")) { + dimPath = dimPath.substring(0, dimPath.length() - separator.length()); + } + return dimPath; + } + + /** + * 递归查询维度,并放入list + * + * @param dimensionId + * @param dimensionList + * @author wangshibao + */ + private void dimensionPathRecursion(String dimensionId, List dimensionList) { + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel != null) { + dimensionList.add(dimensionId); + String parentDimensionId = dimensionModel.getParentId(); + if (!UtilString.isEmpty(parentDimensionId)) { + dimensionPathRecursion(parentDimensionId, dimensionList); + } + } + } + + /** + * 移动维度 + * + * @param sourceDimensionId 源维度ID + * @param targetDimensionId 目标维度ID + * @param sort 排序方法 above-上 below-下 append-追加到父节点最后 + * @author wangshibao + */ + public void moveDimension(String sourceDimensionId, String targetDimensionId, String sort) { + DimensionCache dimensionCache = DimensionCache.getCache(); + + DimensionModel targetDimensionModel = dimensionCache.get(targetDimensionId); + DimensionModel sourceDimensionModel = dimensionCache.get(sourceDimensionId); + if (sourceDimensionModel == null) { + throw new AWSException("源维度不存在"); + } + if ("root".equals(targetDimensionId)) { + targetDimensionId = ""; + } + if (!"".equals(targetDimensionId) && targetDimensionModel == null) {// 根维度特殊判断,并且target为root时只有append一种sort + throw new AWSException("目标维度不存在"); + } + + if (!"append".equals(sort) && !"above".equals(sort) && !"below".equals(sort)) { + throw new AWSException("排序信息错误"); + } + + try { + LocalTxManager.getInstance().begin(); + if ("append".equals(sort)) {// 移动source为target的最后一个子维度 + int orderIndex = getNextOrderIndex(targetDimensionModel == null ? "" : targetDimensionModel.getParentId()); + sourceDimensionModel.setOrderIndex(orderIndex); + sourceDimensionModel.setParentId(targetDimensionId); + new DimensionDao().update(sourceDimensionModel); + } else if ("above".equals(sort)) { + // 1 source的orderIndex = target的orderIndex + sourceDimensionModel.setOrderIndex(targetDimensionModel.getOrderIndex()); + sourceDimensionModel.setParentId(targetDimensionModel.getParentId()); + new DimensionDao().update(sourceDimensionModel); + // 2 >=target的orderIndex的model全部+1(不包括source) + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_DIMENSION + " SET " + DimensionModel.ORDERINDEX + " = " + DimensionModel.ORDERINDEX + "+1 WHERE " + DimensionModel.ORDERINDEX + " >= " + targetDimensionModel.getOrderIndex() + " AND " + DimensionModel.ID + " <> ?"; + DBSql.update(sql, new Object[] { sourceDimensionId }); + Iterator iterator = dimensionCache.iterator(); + List dimensionModels = new ArrayList(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getParentId().equals(targetDimensionModel.getParentId()) && dimensionModel.getOrderIndex() >= targetDimensionModel.getOrderIndex() && !dimensionModel.getId().equals(sourceDimensionId)) { + dimensionModel.setOrderIndex(dimensionModel.getOrderIndex() + 1); + dimensionModels.add(dimensionModel); + } + } + for (DimensionModel dimensionModel : dimensionModels) { + dimensionCache.put(dimensionModel.getId(), dimensionModel); + } + } else if ("below".equals(sort)) { + // 1 source的orderIndex = target的orderIndex+1 + sourceDimensionModel.setOrderIndex(targetDimensionModel.getOrderIndex() + 1); + sourceDimensionModel.setParentId(targetDimensionModel.getParentId()); + new DimensionDao().update(sourceDimensionModel); + // 2 >target的orderIndex的model全部+1(不包括source) + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_DIMENSION + " SET " + DimensionModel.ORDERINDEX + " = " + DimensionModel.ORDERINDEX + "+1 WHERE " + DimensionModel.ORDERINDEX + " > " + targetDimensionModel.getOrderIndex() + " AND " + DimensionModel.ID + " <> ?"; + DBSql.update(sql, new Object[] { sourceDimensionId }); + Iterator iterator = dimensionCache.iterator(); + List dimensionModels = new ArrayList(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionModel.getParentId().equals(targetDimensionModel.getParentId()) && dimensionModel.getOrderIndex() > targetDimensionModel.getOrderIndex() && !dimensionModel.getId().equals(sourceDimensionId)) { + dimensionModel.setOrderIndex(dimensionModel.getOrderIndex() + 1); + dimensionModels.add(dimensionModel); + } + } + for (DimensionModel dimensionModel : dimensionModels) { + dimensionCache.put(dimensionModel.getId(), dimensionModel); + } + } + LocalTxManager.getInstance().commit(); + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } + + /** + * 获取后代维度 + * + * @param dimensionId + * @return + */ + public void getDesDimensionModels(String dimensionId, List totalDimensionModels) { + List dimensionModels = getChildDimensionModels(dimensionId); + totalDimensionModels.addAll(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + getDesDimensionModels(dimensionModel.getId(), totalDimensionModels); + } + } + + /** + * 获取子维度 + * + * @param dimensionId + * @return + */ + public List getChildDimensionModels(String dimensionId) { + List dimensionModels = new ArrayList<>(); + Iterator iterator = DimensionCache.getCache().iterator(); + while (iterator.hasNext()) { + DimensionModel dimensionModel = iterator.next(); + if (dimensionId.equals(dimensionModel.getParentId())) { + dimensionModels.add(dimensionModel); + } + } + return dimensionModels; + } + + /** + * 复制维度 + * + * @param newDimensionName + * @param currDimensionId + * @param uid + */ + public void copyDimension(String newDimensionName, String currDimensionId, String uid) { + //当前维度 + DimensionModel curDimension = DimensionCache.getCache().get(currDimensionId); + //复制当前维度 + String newDimensionId = createDimension(newDimensionName, curDimension.getParentId(), curDimension.getShowType(), curDimension.getIsExamine() == 1 ? true : false, curDimension.getMemo(), uid, curDimension.getHotspotDefId(), curDimension.getIsEnabled() == 1 ? true : false); + //复制维度下的知识 + PublishService ps = new PublishService(); + //查询维度下的知识 + List publishModels = ps.queryPublishAllByDimensionId(uid, currDimensionId); + List cardArr = new ArrayList(); + List dimensionArr = new ArrayList(); + for (PublishModel publishModel : publishModels) { + cardArr.add(publishModel.getCardId()); + } + dimensionArr.add(newDimensionId); + if (cardArr.size() > 0) { + ps.copyCard(cardArr, dimensionArr, currDimensionId, uid); + } + //递归复制子维度 + copyChildrenDimension(queryListMgrDimensionsByParentId(currDimensionId), newDimensionId, uid); + DimensionTreeCache.getCache().destroy(); + } + + public void copyChildrenDimension(List childrenDimension, String newParentId, String uid) { + for (DimensionModel dimensionModel : childrenDimension) { + String newDimensionId = createDimension(dimensionModel.getDimensionName(), newParentId, dimensionModel.getShowType(), dimensionModel.getIsExamine() == 1 ? true : false, dimensionModel.getMemo(), uid, dimensionModel.getHotspotDefId(), dimensionModel.getIsEnabled() == 1 ? true : false); + PublishService ps = new PublishService(); + List publishModels = ps.queryPublishAllByDimensionId(uid, dimensionModel.getId()); + List cardArr = new ArrayList(); + List dimensionArr = new ArrayList(); + for (PublishModel publishModel : publishModels) { + cardArr.add(publishModel.getCardId()); + } + dimensionArr.add(newDimensionId); + if (cardArr.size() > 0) { + ps.copyCard(cardArr, dimensionArr, dimensionModel.getId(), uid); + } + copyChildrenDimension(queryListMgrDimensionsByParentId(dimensionModel.getId()), newDimensionId, uid); + } + } + + public void changeDimensionUser(List dimensionIdArr, String handoverCardUser) { + // 校验 + if (dimensionIdArr.size() == 0) { + throw new AWSException("维度不允许为空"); + } + if (UtilString.isEmpty(handoverCardUser)) { + throw new AWSException("交接人不许为空"); + } + for (int i = 0; i < dimensionIdArr.size(); i++) { + String dimensionId = dimensionIdArr.get(i); + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + dimensionModel.setCreateUser(handoverCardUser); + DimensionDao dimensionDao = new DimensionDao(); + int result = dimensionDao.update(dimensionModel); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/FileService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/FileService.java new file mode 100644 index 00000000..200237c2 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/FileService.java @@ -0,0 +1,209 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.LogModel; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.database.ResultSetHandler; +import com.actionsoft.bpms.util.DBSql; + +/** + * 知识-文件 + * + * @author wangshibao + */ +public class FileService { + /** + * 删除文件 + * + * @param fileId 文件ID + * @return 是否删除成功 + */ + public boolean deleteFile(String cardId, String fileId) { + try { + LocalTxManager.getInstance().begin(); + FileDao fileDao = new FileDao(); + int result = fileDao.delete(fileId); + if (result == 1) { + // 将同名的上个版本的文件标记为最新文件 + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel.getFileState() == 1) { + Iterator fileIterator = FileCache.getCache().iterator(); + FileModel lastFileModel = null; + while (fileIterator.hasNext()) { + FileModel tmpFileModel = fileIterator.next(); + if (tmpFileModel.getCardId().equals(cardId) && tmpFileModel.getFileName().equals(fileModel.getFileName()) && tmpFileModel.getFileState() == 0) { + if (lastFileModel == null) { + lastFileModel = tmpFileModel; + } else { + if (Double.parseDouble(tmpFileModel.getFileVer()) - Double.parseDouble(lastFileModel.getFileVer()) > 0) { + lastFileModel = tmpFileModel; + } else if (Double.parseDouble(tmpFileModel.getFileVer()) - Double.parseDouble(lastFileModel.getFileVer()) == 0) { + if (tmpFileModel.getCreateTime().compareTo(lastFileModel.getCreateTime()) > 0) { + lastFileModel = tmpFileModel; + } + } + } + } + } + if (lastFileModel != null) { + lastFileModel.setFileState(1); + fileDao.update(lastFileModel); + } + } + // 删除缓存 + FileCache.getCache().remove(fileId); + LocalTxManager.getInstance().commit(); + return true; + } else { + return false; + } + } catch (Exception e) { + if (LocalTxManager.getInstance().inTransaction()) { + LocalTxManager.getInstance().rollback(); + } + e.printStackTrace(); + return false; + } + } + + /** + * 查询文件列表 + * + * @param cardId 知识ID + * @return 文件模型的List + * @author wangshibao + */ + public List queryFiles(String cardId) { + List fileModels = new ArrayList<>(); + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (cardId.equals(fileModel.getCardId())) { + fileModels.add(fileModel); + } + } + Collections.sort(fileModels, new Comparator() { + + @Override public int compare(FileModel o1, FileModel o2) { + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + return fileModels; + } + + /** + * 查询文件列表(最新版本) + * + * @param cardId 知识ID + * @return 文件模型的List + * @author wangshibao + */ + public List queryLatestFiles(String cardId) { + List fileModels = new ArrayList<>(); + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (cardId.equals(fileModel.getCardId()) && (fileModel.getFileState() == 1 || fileModel.getFileState() == 2)) {//2为表单链接 + fileModels.add(fileModel); + } + } + Collections.sort(fileModels, new Comparator() { + + @Override public int compare(FileModel o1, FileModel o2) { + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + return fileModels; + } + + /** + * 根据cardId集合删除缓存, 注意:为了加快查询速度,cardIdList会被修改 + * + * @param cardIdList + * @author wangshibao + */ + public void removeCacheByCardIds(List cardIdList) { + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (cardIdList.contains(fileModel.getCardId())) { + fileCache.remove(fileModel.getId()); + cardIdList.remove(fileModel.getCardId()); + } + if (cardIdList.size() == 0) { + break; + } + } + } + + /** + * 批量查询下载次数(包括在线阅读) + * + * @param fileIdList + * @return + * @author wangshibao + */ + public Map getFileDownloadCount(List fileIdList) { + final Map map = new HashMap(); + if (fileIdList == null || fileIdList.size() == 0) { + return map; + } + String sql = "SELECT " + LogModel.FILEID + ", COUNT(*) AS C FROM " + KMSConstant.ENTITY_NAME_LOG + " WHERE " + LogModel.LOGTYPE + " IN (" + KMSConstant.LOG_DOWNLOAD_FILE + "," + KMSConstant.LOG_ACCESS_FILE + ") AND " + LogModel.FILEID + " IN ("; + List paramList = new ArrayList<>(); + for (String fileId : fileIdList) { + sql += "?,"; + paramList.add(fileId); + } + sql = sql.substring(0, sql.length() - 1); + sql += ") GROUP BY " + LogModel.FILEID; + + DBSql.query(sql, new ResultSetHandler() { + @Override public void handle(ResultSet rs) throws SQLException { + while (rs.next()) { + map.put(rs.getString(LogModel.FILEID), rs.getInt("C")); + } + } + }, paramList.toArray()); + return map; + } + + /** + * 查询某知识下是否存在某文件名的文件(模糊查询) + * + * @param cardId + * @param fileNameFilter + * @return + * @author wangshibao + */ + public boolean filterFileName(String cardId, String fileNameFilter) { + FileCache fileCache = FileCache.getCache(); + Iterator fileIterator = fileCache.iterator(); + while (fileIterator.hasNext()) { + FileModel fileModel = fileIterator.next(); + if (fileModel.getCardId().equals(cardId)) { + if (StringUtils.containsIgnoreCase(fileModel.getFileName(), fileNameFilter)) { + return true; + } + } + } + return false; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotDefService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotDefService.java new file mode 100644 index 00000000..d47d8387 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotDefService.java @@ -0,0 +1,148 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.HotspotCache; +import com.actionsoft.apps.kms.dao.HotspotDefDao; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.HotspotDefModel; +import com.actionsoft.apps.kms.model.HotspotModel; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.exception.AWSException; + +/** + * 知识地图定义 + * + * @author wangshibao + */ +public class HotspotDefService { + + /** + * 查询知识地图定义列表 + * + * @return 知识地图定义模型的List + * @author wangshibao + */ + public List queryHotspotDefs() { + return new HotspotDefDao().query().list(); + } + + /** + * 新建知识地图定义 + * + * @param hotspotName 知识地图名称 + * @param memo 描述 + * @return 是否新建成功 + */ + public boolean addHotspotDef(String hotspotName, String hotspotMetaId, String memo, String uid) { + HotspotDefDao hotspotDefDao = new HotspotDefDao(); + HotspotDefModel hotspotDefModel = new HotspotDefModel(); + hotspotDefModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + String id = UUIDGener.getObjectId(); + hotspotDefModel.setId(id); + hotspotDefModel.setMemo(memo); + hotspotDefModel.setHotspotName(hotspotName); + hotspotDefModel.setHotspotMetaId(hotspotMetaId); + hotspotDefModel.setCreateUser(uid); + int result = hotspotDefDao.insert(hotspotDefModel); + if (result == 1) { + return true; + } else { + return false; + } + } + + /** + * 删除知识地图定义 + * + * @param hotSpotDefIdArr 知识地图定义ID数组 + * @return 是否删除成功 + * @author wangshibao + */ + public void deleteHotspotDef(String[] hotSpotDefIdArr, UserContext me) { + if (hotSpotDefIdArr == null || hotSpotDefIdArr.length == 0) { + throw new AWSException("知识地图ID不允许为空"); + } + try { + LocalTxManager.getInstance().begin(); + // 同时删除图形和维度的关联 + String sql1 = "DELETE FROM " + KMSConstant.ENTITY_NAME_HOTSPOT + " WHERE " + HotspotModel.HOTSPOTDEFID + " IN ("; + for (int i = 0; i < hotSpotDefIdArr.length; i++) { + sql1 += "?,"; + } + sql1 = sql1.substring(0, sql1.length() - 1); + sql1 += ")"; + DBSql.update(sql1, hotSpotDefIdArr); + + // 删除文件 + HotspotDefDao hotspotDefDao = new HotspotDefDao(); + for (int i = 0; i < hotSpotDefIdArr.length; i++) { + HotspotDefModel hotspotDefModel = hotspotDefDao.queryById(hotSpotDefIdArr[i]); + DCContext dcContext = new DCContext(me, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_HOTSPOT), KMSConstant.APP_ID, KMSConstant.DOC_GROUP_HOTSPOT, KMSConstant.DOC_FILE_HOTSPOT, hotspotDefModel.getHotspotName()); + dcContext.delete(); + } + String sql = "DELETE FROM " + KMSConstant.ENTITY_NAME_HOTSPOT_DEF + " WHERE " + HotspotDefModel.ID + " IN ("; + for (int i = 0; i < hotSpotDefIdArr.length; i++) { + sql += "?,"; + } + sql = sql.substring(0, sql.length() - 1); + sql += ")"; + DBSql.update(sql, hotSpotDefIdArr); + LocalTxManager.getInstance().commit(); + + HotspotCache hotspotCache = HotspotCache.getCache(); + Iterator hotspotIterator = hotspotCache.iterator(); + List hotspotDefIdList = Arrays.asList(hotSpotDefIdArr); + while (hotspotIterator.hasNext()) { + HotspotModel hotspotModel = hotspotIterator.next(); + if (hotspotDefIdList.contains(hotspotModel.getHotspotDefId())) { + HotspotCache.getCache().remove(hotspotModel.getId()); + } + } + } catch (Exception e) { + e.printStackTrace(); + LocalTxManager.getInstance().rollback(); + } + } + + /** + * 删除知识地图定义前的检查 + * + * @param hotSpotIdArr 知识地图定义ID数组 + * @return 存在引用的中文描述或者null + * @author wangshibao + */ + public String deleteHotspotDefCheck(String[] hotSpotIdArr) { + if (hotSpotIdArr == null || hotSpotIdArr.length == 0) { + throw new AWSException("知识地图ID不允许为空"); + } + String result = null; + DimensionCache dimensionCache = DimensionCache.getCache(); + for (String hotspotDefId : hotSpotIdArr) { + if (result == null) { + Iterator dimensionIterator = dimensionCache.iterator(); + while (dimensionIterator.hasNext()) { + DimensionModel dimensionModel = dimensionIterator.next(); + if (hotspotDefId.equals(dimensionModel.getHotspotDefId())) { + String hotspotName = new HotspotDefDao().queryById(hotspotDefId).getHotspotName(); + result = "知识地图[" + hotspotName + "]和知识分类[" + dimensionModel.getDimensionName() + "]绑定,删除前请解除绑定"; + break; + } + } + } else { + break; + } + } + return result; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotService.java new file mode 100644 index 00000000..85c655e5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/HotspotService.java @@ -0,0 +1,204 @@ +package com.actionsoft.apps.kms.service; + +import java.util.Iterator; + +import com.actionsoft.apps.kms.cache.HotspotCache; +import com.actionsoft.apps.kms.dao.HotspotDao; +import com.actionsoft.apps.kms.model.HotspotModel; +import com.actionsoft.bpms.util.UUIDGener; + +/** + * 知识地图业务类 + * + * @author wangshibao + * + */ +public class HotspotService { + + /** + * 根据图形ID查询知识地图模型(维度ID) + * + * @param shapeId 图形ID + * @return + * @author wangshibao + */ + public HotspotModel getHotspotByShapeId(String shapeId) { + HotspotCache hotspotCache = HotspotCache.getCache(); + Iterator hotspotIterator = hotspotCache.iterator(); + while (hotspotIterator.hasNext()) { + HotspotModel hotspotModel = hotspotIterator.next(); + if (shapeId.equals(hotspotModel.getShapeId())) { + return hotspotModel; + } + } + return null; + } + + /** + * 根据维度ID查询知识地图模型(shapeID) + * + * @param dimensionId 图形ID + * @return + * @author wangshibao + */ + public HotspotModel getHotspotByDimensionId(String dimensionId) { + HotspotCache hotspotCache = HotspotCache.getCache(); + Iterator hotspotIterator = hotspotCache.iterator(); + while (hotspotIterator.hasNext()) { + HotspotModel hotspotModel = hotspotIterator.next(); + if (dimensionId.equals(hotspotModel.getShapeId())) { + return hotspotModel; + } + } + return null; + } + + /** + * 绑定知识地图 + * + * @param dimensionId 维度ID + * @param shapeId 图形ID + * @return + * @author wangshibao + */ + public boolean bindHotspot(String dimensionId, String shapeId, String hotspotDefId) { + try { + int result = 0; + HotspotDao hotspotDao = new HotspotDao(); + // 查询图形是否已经绑定过 + HotspotModel hotspotModel = getHotspotByShapeId(shapeId); + + if (hotspotModel != null) { + hotspotModel.setDimensionId(dimensionId); + hotspotModel.setBindType(1); + hotspotModel.setLinkURL(null); + hotspotModel.setTarget(null); + result = hotspotDao.update(hotspotModel); + } else { + hotspotModel = new HotspotModel(); + hotspotModel.setDimensionId(dimensionId); + hotspotModel.setShapeId(shapeId); + hotspotModel.setId(UUIDGener.getObjectId()); + hotspotModel.setHotspotDefId(hotspotDefId); + hotspotModel.setBindType(1); + hotspotModel.setLinkURL(null); + hotspotModel.setTarget(null); + result = hotspotDao.insert(hotspotModel); + } + + if (result == 1) { + return true; + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + /** + * 绑定知识地图 + * + * @param dimensionId 维度ID + * @param shapeId 图形ID + * @return + * @author wangshibao + */ + public boolean bindHotspotCard(String cardId, String shapeId, String hotspotDefId) { + try { + int result = 0; + HotspotDao hotspotDao = new HotspotDao(); + // 查询图形是否已经绑定过 + HotspotModel hotspotModel = getHotspotByShapeId(shapeId); + + if (hotspotModel != null) { + hotspotModel.setDimensionId(cardId); + hotspotModel.setBindType(2); + hotspotModel.setLinkURL(null); + hotspotModel.setTarget(null); + result = hotspotDao.update(hotspotModel); + } else { + hotspotModel = new HotspotModel(); + hotspotModel.setDimensionId(cardId); + hotspotModel.setShapeId(shapeId); + hotspotModel.setId(UUIDGener.getObjectId()); + hotspotModel.setHotspotDefId(hotspotDefId); + hotspotModel.setBindType(2); + hotspotModel.setLinkURL(null); + hotspotModel.setTarget(null); + result = hotspotDao.insert(hotspotModel); + } + + if (result == 1) { + return true; + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + /** + * 绑定知识地图 + * + * @param dimensionId 维度ID + * @param shapeId 图形ID + * @return + * @author wangshibao + */ + public boolean bindHotspotLinkURL(String linkURL, String target, String shapeId, String hotspotDefId) { + try { + int result = 0; + HotspotDao hotspotDao = new HotspotDao(); + // 查询图形是否已经绑定过 + HotspotModel hotspotModel = getHotspotByShapeId(shapeId); + + if (hotspotModel != null) { + hotspotModel.setLinkURL(linkURL); + hotspotModel.setTarget(target); + hotspotModel.setBindType(0); + hotspotModel.setDimensionId(null); + result = hotspotDao.update(hotspotModel); + } else { + hotspotModel = new HotspotModel(); + hotspotModel.setDimensionId(null); + hotspotModel.setShapeId(shapeId); + hotspotModel.setId(UUIDGener.getObjectId()); + hotspotModel.setHotspotDefId(hotspotDefId); + hotspotModel.setBindType(0); + hotspotModel.setLinkURL(linkURL); + hotspotModel.setTarget(target); + result = hotspotDao.insert(hotspotModel); + } + + if (result == 1) { + return true; + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + /** + * 删除绑定 + * + * @param hotspotId + * @return + * @author wangshibao + */ + public boolean deleteHotspot(String hotspotId) { + HotspotDao hotspotDao = new HotspotDao(); + int result = hotspotDao.delete(hotspotId); + if (result == 1) { + return true; + } else { + return false; + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/LogService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/LogService.java new file mode 100644 index 00000000..8d1d0639 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/LogService.java @@ -0,0 +1,73 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Connection; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.dao.LogDao; +import com.actionsoft.apps.kms.model.LogModel; +import com.actionsoft.bpms.commons.mvc.dao.IDaoQuery; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; + +/** + * 日志 + * + * @author wangshibao + */ +public class LogService { + public long totalRecords = 0;// 总行数 + + /** + * 查询知识日志 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 日志模型的List + * @author wangshibao + */ + public List queryCardLogs(int curPage, int rowsPerPage, String cardId, String sortIndx, String sortDir) { + LogDao logDao = new LogDao(); + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + + Connection conn = DBSql.open(); + try { + IDaoQuery iDaoQuery = logDao.query(conn, LogModel.CARDID + "=?", cardId); + + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(LogModel.ACCESSTIME)) { + if (sortDir.equals("up")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.ACCESSTIME).asc(); + } else if (sortDir.equals("down")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.ACCESSTIME).desc(); + } + } else if (sortIndx.equalsIgnoreCase(LogModel.ACCESSUSER + "name")) { + if (sortDir.equals("up")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.ACCESSUSER).asc(); + } else if (sortDir.equals("down")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.ACCESSUSER).desc(); + } + } else if (sortIndx.equalsIgnoreCase("logContent")) { + if (sortDir.equals("up")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.LOGTYPE).asc().orderBy(LogModel.FILEID).asc(); + } else if (sortDir.equals("down")) { + iDaoQuery = iDaoQuery.orderBy(LogModel.LOGTYPE).desc().orderBy(LogModel.FILEID).asc(); + } + } + } + + List logModels = iDaoQuery.list(firstRow, rowsPerPage); + totalRecords = DBSql.getInt(conn, "select count(" + LogModel.ID + ") as C from " + KMSConstant.ENTITY_NAME_LOG + " where " + LogModel.CARDID + " = '" + cardId + "'", "C"); + return logModels; + } finally { + DBSql.close(conn); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaAttrService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaAttrService.java new file mode 100644 index 00000000..4707ef29 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaAttrService.java @@ -0,0 +1,86 @@ +package com.actionsoft.apps.kms.service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.MetaAttrCache; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.exception.AWSException; + +/** + * 元数据-属性 + * + * @author wangshibao + */ +public class MetaAttrService { + /** + * 查询元数据-属性 + * + * @param schemaId 元数据ID + * @return 元数据属性的List + */ + public List queryMetaAttrs(String schemaId) { + MetaAttrCache metaAttrCache = MetaAttrCache.getCache(); + Iterator metaAttrIterator = metaAttrCache.iterator(); + List metaAttrModels = new ArrayList<>(); + while (metaAttrIterator.hasNext()) { + MetaAttrModel metaAttrModel = metaAttrIterator.next(); + if (schemaId.equals(metaAttrModel.getSchemaId())) { + metaAttrModels.add(metaAttrModel); + } + } + Collections.sort(metaAttrModels, new Comparator() { + @Override + public int compare(MetaAttrModel o1, MetaAttrModel o2) { + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + + return metaAttrModels; + } + + /** + * 删除元数据属性 + * + * @param schemaIds 元数据ID数组 + * @return 删除的元数据属性的数量 + * @author wangshibao + */ + public int deleteBySchemaIds(String... schemaIds) { + if (schemaIds == null || schemaIds.length == 0) { + throw new AWSException("元数据属性ID不能为空"); + } + String sqlWhere = " " + MetaAttrModel.SCHEMAID + " in ("; + String[] params = new String[schemaIds.length]; + for (int i = 0; i < schemaIds.length; i++) { + sqlWhere += "?,"; + params[i] = schemaIds[i]; + } + sqlWhere = sqlWhere.substring(0, sqlWhere.length() - 1); + sqlWhere += ")"; + int result = DBSql.update("DELETE FROM " + KMSConstant.ENTITY_NAME_META_ATTR + " WHERE " + sqlWhere, params); + + if (result > 0) { + // 删除缓存 + List schemaIdList = new ArrayList<>(Arrays.asList(schemaIds)); + + MetaAttrCache metaAttrCache = MetaAttrCache.getCache(); + Iterator metaAttrIterator = metaAttrCache.iterator(); + while (metaAttrIterator.hasNext()) { + MetaAttrModel metaAttrModel = metaAttrIterator.next(); + if (schemaIdList.contains(metaAttrModel.getSchemaId())) { + metaAttrCache.remove(metaAttrModel.getId()); + schemaIdList.remove(metaAttrModel.getSchemaId()); + } + } + } + return result; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaDataService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaDataService.java new file mode 100644 index 00000000..6b7dca71 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaDataService.java @@ -0,0 +1,50 @@ +package com.actionsoft.apps.kms.service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.model.MetaDataModel; + +public class MetaDataService { + /** + * 根据cardId集合删除缓存, 注意:为了加快查询速度,cardIdList会被修改 + * + * @param cardIdList + * @author wangshibao + */ + public void removeCacheByCardIds(List cardIdList) { + MetaDataCache metaDataCache = MetaDataCache.getCache(); + Iterator metaDataIterator = metaDataCache.iterator(); + while (metaDataIterator.hasNext()) { + MetaDataModel metaDataModel = metaDataIterator.next(); + if (cardIdList.contains(metaDataModel.getCardId())) { + metaDataCache.remove(metaDataModel.getId()); + cardIdList.remove(metaDataModel.getCardId()); + } + if (cardIdList.size() == 0) { + break; + } + } + } + + /** + * 根据知识ID获取元数据 + * + * @param cardId + * @return + * @author wangshibao + */ + public List queryMetaDataByCardId(String cardId) { + List metaDataModels = new ArrayList<>(); + Iterator metaIterator = MetaDataCache.getCache().iterator(); + while (metaIterator.hasNext()) { + MetaDataModel metaDataModel = metaIterator.next(); + if (metaDataModel.getCardId().equals(cardId)) { + metaDataModels.add(metaDataModel); + } + } + return metaDataModels; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaSchemaService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaSchemaService.java new file mode 100644 index 00000000..0b9fd1c9 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/MetaSchemaService.java @@ -0,0 +1,594 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Timestamp; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.MetaSchemaACCM; +import com.actionsoft.apps.kms.cache.MetaAttrCache; +import com.actionsoft.apps.kms.cache.MetaSchemaCache; +import com.actionsoft.apps.kms.dao.MetaAttrDao; +import com.actionsoft.apps.kms.dao.MetaSchemaDao; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.apps.kms.model.MetaSchemaModel; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.JavascriptEscape; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.PermAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 元数据 + * + * @author wangshibao + */ +public class MetaSchemaService { + public long totalRecordsSchema = 0;// 我发布的知识总行数 + + /** + * 查询元数据 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 元数据模型的List + */ + public List querySchemas(int curPage, int rowsPerPage, String sortIndx, String sortDir) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + + MetaSchemaCache metaSchemaCache = MetaSchemaCache.getCache(); + Iterator metaSchemaIterator = metaSchemaCache.iterator(); + List schemaModels = new ArrayList<>(); + while (metaSchemaIterator.hasNext()) { + schemaModels.add(metaSchemaIterator.next()); + } + + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(MetaSchemaModel.SCHEMATITLE)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = collatorChinese.compare(o1.getSchemaTitle(), o2.getSchemaTitle()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = collatorChinese.compare(o2.getSchemaTitle(), o1.getSchemaTitle()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.SCHEMASHOWTYPE)) { + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o1.getSchemaShowtype() - o2.getSchemaShowtype(); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o2.getSchemaShowtype() - o1.getSchemaShowtype(); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.SCHEMASHOWTYPE)) { + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o1.getSchemaShowtype() - o2.getSchemaShowtype(); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o2.getSchemaShowtype() - o1.getSchemaShowtype(); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.ISNULLABLE)) { + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o1.getIsNullable() - o2.getIsNullable(); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o2.getIsNullable() - o1.getIsNullable(); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.ISSEARCH)) { + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o1.getIsSearch() - o2.getIsSearch(); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o2.getIsSearch() - o1.getIsSearch(); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.CREATEUSER)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getCreateUser()); + UserModel userModel2 = UserCache.getModel(o2.getCreateUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return -1; + } + if (userModel2 == null) { + return 1; + } + int result = collatorChinese.compare(userModel1.getUserName(), userModel2.getUserName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getCreateUser()); + UserModel userModel2 = UserCache.getModel(o2.getCreateUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return 1; + } + if (userModel2 == null) { + return -1; + } + int result = collatorChinese.compare(userModel2.getUserName(), userModel1.getUserName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(MetaSchemaModel.CREATETIME)) { + if (sortDir.equals("up")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o1.getCreateTime().compareTo(o2.getCreateTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + int result = o2.getCreateTime().compareTo(o1.getCreateTime()); + return result; + } + }); + } + } + } else {// 默认按orderIndex排序 + Collections.sort(schemaModels, new Comparator() { + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + } + + List schemaModelPageList = new ArrayList<>(); + for (int i = firstRow; i < firstRow + rowsPerPage && i < schemaModels.size(); i++) { + schemaModelPageList.add(schemaModels.get(i)); + } + totalRecordsSchema = schemaModels.size(); + return schemaModelPageList; + } + + /** + * 创建元数据 + * + * @param me + * @param schemaTitle 元数据名称 + * @param schemaShowtype 元数据的展示类型 + * @param isNullable 是否可以为空 + * @param isSearch 是否参与检索 + * @param schemaDesc 元数据描述 + * @param metaAttr 元数据属性的JSON字符串(加密) + */ + public void insertSchema(UserContext me, String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + try { + LocalTxManager.getInstance().begin(); + // 新建元数据 + MetaSchemaModel schemaModel = new MetaSchemaModel(); + schemaModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + schemaModel.setCreateUser(me.getUID()); + if (isNullable) {// 页面上是"必填",逻辑相反 + schemaModel.setIsNullable(0); + } else { + schemaModel.setIsNullable(1); + } + if (isSearch) { + schemaModel.setIsSearch(1); + } else { + schemaModel.setIsSearch(0); + } + + String schemaId = UUIDGener.getObjectId(); + schemaModel.setId(schemaId); + schemaModel.setLastUpdate(null); + schemaModel.setSchemaDesc(schemaDesc); + schemaModel.setSchemaShowtype(schemaShowtype); + schemaModel.setSchemaTitle(schemaTitle); + // 最大orderIndex + 1 + schemaModel.setOrderIndex(getNextOrderIndex()); + + MetaSchemaDao schemaDao = new MetaSchemaDao(); + schemaDao.insert(schemaModel); + // 新建属性 + List metaAttrJA = JSONArray.parseArray((JavascriptEscape.unescape(metaAttr)), JSONObject.class); + MetaAttrDao metaAttrDao = new MetaAttrDao(); + long currMills = System.currentTimeMillis(); + for (JSONObject metaAttrJO : metaAttrJA) { + MetaAttrModel metaAttrModel = new MetaAttrModel(); + metaAttrModel.setAttrTitle(metaAttrJO.getString("attrTitle")); + metaAttrModel.setCreateTime(new Timestamp(currMills)); + metaAttrModel.setCreateUser(me.getUID()); + metaAttrModel.setSchemaId(schemaId); + + metaAttrDao.insert(metaAttrModel); + + currMills += 1000;// 批量创建时加1秒 方便排序 + } + LocalTxManager.getInstance().commit(); + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } + + /** + * 修改元数据 + * + * @param me + * @param schemaId 元数据ID + * @param schemaTitle 元数据名称 + * @param schemaShowtype 元数据展示类型 + * @param isNullable 是否可以为空 + * @param isSearch 是否参与检索 + * @param schemaDesc 元数据描述 + * @param metaAttr 元数据属性的JSON字符串(加密) + */ + public void updateSchema(UserContext me, String schemaId, String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + try { + LocalTxManager.getInstance().begin(); + // 新建元数据 + MetaSchemaModel schemaModel = MetaSchemaCache.getCache().get(schemaId); + if (isNullable) {// 页面上是"必填",逻辑相反 + schemaModel.setIsNullable(0); + } else { + schemaModel.setIsNullable(1); + } + if (isSearch) { + schemaModel.setIsSearch(1); + } else { + schemaModel.setIsSearch(0); + } + + schemaModel.setId(schemaId); + schemaModel.setLastUpdate(new Timestamp(System.currentTimeMillis())); + schemaModel.setSchemaDesc(schemaDesc); + schemaModel.setSchemaShowtype(schemaShowtype); + schemaModel.setSchemaTitle(schemaTitle); + + MetaSchemaDao schemaDao = new MetaSchemaDao(); + schemaDao.update(schemaModel); + // 修改属性 + List metaAttrJA = JSONArray.parseArray((JavascriptEscape.unescape(metaAttr)), JSONObject.class); + MetaAttrDao metaAttrDao = new MetaAttrDao(); + long currMills = System.currentTimeMillis(); + for (JSONObject metaAttrJO : metaAttrJA) { + if (metaAttrJO.get("id") != null) { + if (metaAttrJO.get("remove") != null) {// 删除 + metaAttrDao.delete((String) metaAttrJO.get("id")); + } else {// 修改 + MetaAttrModel metaAttrModel = new MetaAttrModel(); + metaAttrModel.setId(metaAttrJO.getString("id")); + metaAttrModel.setAttrTitle(metaAttrJO.getString("attrTitle")); + + metaAttrDao.update(metaAttrModel); + } + } else {// 新建 + MetaAttrModel metaAttrModel = new MetaAttrModel(); + metaAttrModel.setAttrTitle(metaAttrJO.getString("attrTitle")); + metaAttrModel.setCreateTime(new Timestamp(currMills)); + metaAttrModel.setCreateUser(me.getUID()); + metaAttrModel.setSchemaId(schemaId); + + metaAttrDao.insert(metaAttrModel); + currMills += 1000;// 批量创建时加1秒 方便排序 + } + } + LocalTxManager.getInstance().commit(); + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } + + /** + * 删除元数据以及元数据属性 + * + * @param schemaIdArr 元数据ID数组 + * @author wangshibao + */ + public void deleteSchema(String[] schemaIdArr) { + try { + LocalTxManager.getInstance().begin(); + if (schemaIdArr == null || schemaIdArr.length == 0) { + throw new AWSException("元数据ID不能为空"); + } + MetaSchemaDao schemaDao = new MetaSchemaDao(); + MetaAttrService metaAttrService = new MetaAttrService(); + for (String schemaId : schemaIdArr) { + schemaDao.delete(schemaId); + } + metaAttrService.deleteBySchemaIds(schemaIdArr); + LocalTxManager.getInstance().commit(); + //删除ac + PermAPI permAPI = SDK.getPermAPI(); + for (String schemaId : schemaIdArr) { + permAPI.removeAC(MetaSchemaACCM.resourceType, schemaId); + } + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } + + /** + * 发布时,查询元数据以及对应的属性(全查) + * + * @return Map> + * @author wangshibao + */ + public Map> querySchemaAttrPublished(String uid) { + Map> schemaAttrMap = new LinkedHashMap>(); + + MetaSchemaCache metaSchemaCache = MetaSchemaCache.getCache(); + Iterator metaSchemaIterator = metaSchemaCache.iteratorSorted(new Comparator() { + + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + + MetaAttrCache metaAttrCache = MetaAttrCache.getCache(); + List metaAttrModels = MetaAttrCache.iteratorToList(metaAttrCache.iterator()); + boolean isKnwlMgr = KMSUtil.isKnwlManager(uid); + while (metaSchemaIterator.hasNext()) { + MetaSchemaModel metaSchemaModel = metaSchemaIterator.next(); + + // 权限过滤 + if (!isKnwlMgr) {// 如果不是知识管理员 + boolean hasSchemaPublishPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_META_SCHEMA, metaSchemaModel.getId(), MetaSchemaACCM.PUBLISH.getType(), false); + if (!hasSchemaPublishPerm) {// 是否有元数据发布的权限(宽松模式) + continue; + } + } + Map schemaMap = new HashMap<>(); + + schemaMap.put("schemaTitle", metaSchemaModel.getSchemaTitle()); + schemaMap.put("showType", metaSchemaModel.getSchemaShowtype()); + schemaMap.put("isNullable", metaSchemaModel.getIsNullable()); + + List attrList = new ArrayList(); + for (MetaAttrModel metaAttrModel : metaAttrModels) { + if (metaAttrModel.getSchemaId().equals(metaSchemaModel.getId())) { + attrList.add(metaAttrModel); + } + } + Collections.sort(attrList, new Comparator() { + + @Override + public int compare(MetaAttrModel o1, MetaAttrModel o2) { + + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + schemaMap.put("attrList", attrList); + if (attrList.size() == 0 && metaSchemaModel.getSchemaShowtype() != 2) {// 属性列表为空并且不是文本框 + continue; + } + schemaAttrMap.put(metaSchemaModel.getId(), schemaMap); + } + return schemaAttrMap; + } + + /** + * 检索时,查询元数据以及对应的属性(权限内的,允许检索的) + * + * @return Map> + * @author wangshibao + */ + public Map> querySchemaAttrSearched(String uid) { + Map> schemaAttrMap = new LinkedHashMap>(); + + MetaSchemaCache metaSchemaCache = MetaSchemaCache.getCache(); + Iterator metaSchemaIterator = metaSchemaCache.iteratorSorted(new Comparator() { + + @Override + public int compare(MetaSchemaModel o1, MetaSchemaModel o2) { + return o1.getOrderIndex() - o2.getOrderIndex(); + } + }); + + MetaAttrCache metaAttrCache = MetaAttrCache.getCache(); + List metaAttrModels = MetaAttrCache.iteratorToList(metaAttrCache.iterator()); + boolean isKnwlMgr = KMSUtil.isKnwlManager(uid); + while (metaSchemaIterator.hasNext()) { + MetaSchemaModel metaSchemaModel = metaSchemaIterator.next(); + if (metaSchemaModel.getIsSearch() == 1) {// 允许参与检索的 + // 权限过滤 + if (!isKnwlMgr) {// 如果不是知识管理员 + boolean hasSchemaPublishPerm = SDK.getPermAPI().havingACPermission(uid, KMSConstant.AC_RESOURCE_TYPE_META_SCHEMA, metaSchemaModel.getId(), MetaSchemaACCM.READ.getType(), false); + if (!hasSchemaPublishPerm) {// 是否有元数据访问的权限(宽松模式) + continue; + } + } + Map schemaMap = new HashMap<>(); + + schemaMap.put("schemaTitle", metaSchemaModel.getSchemaTitle()); + schemaMap.put("showType", metaSchemaModel.getSchemaShowtype()); + schemaMap.put("isNullable", metaSchemaModel.getIsNullable()); + + List attrList = new ArrayList(); + for (MetaAttrModel metaAttrModel : metaAttrModels) { + if (metaAttrModel.getSchemaId().equals(metaSchemaModel.getId())) { + attrList.add(metaAttrModel); + } + } + Collections.sort(attrList, new Comparator() { + + @Override + public int compare(MetaAttrModel o1, MetaAttrModel o2) { + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + schemaMap.put("attrList", attrList); + if (attrList.size() == 0 && metaSchemaModel.getSchemaShowtype() != 2) {// 属性列表为空并且不是文本框 + continue; + } + schemaAttrMap.put(metaSchemaModel.getId(), schemaMap); + } + } + return schemaAttrMap; + } + + /** + * 获取下一个orderIndex(最大order + 1) + * + * @return + * @author wangshibao + */ + public int getNextOrderIndex() { + Iterator iterator = MetaSchemaCache.getCache().iterator(); + int nextOrderIndex = 0; + while (iterator.hasNext()) { + MetaSchemaModel metaSchemaModel = iterator.next(); + if (metaSchemaModel.getOrderIndex() >= nextOrderIndex) { + nextOrderIndex = metaSchemaModel.getOrderIndex() + 1; + } + } + return nextOrderIndex; + } + + /** + * 元数据排序 + * + * @param sourceId + * @param targetId + * @author wangshibao + */ + public void saveMetaSchemaOrderIndex(String sourceId, String targetId) { + MetaSchemaCache metaSchemaCache = MetaSchemaCache.getCache(); + MetaSchemaModel sourceMetaSchemaModel = metaSchemaCache.get(sourceId); + MetaSchemaModel targetMetaSchemaModel = metaSchemaCache.get(targetId); + MetaSchemaDao metaSchemaDao = new MetaSchemaDao(); + if (sourceMetaSchemaModel.getOrderIndex() > targetMetaSchemaModel.getOrderIndex()) {// source up + // 1 source的orderIndex = target的orderIndex + sourceMetaSchemaModel.setOrderIndex(targetMetaSchemaModel.getOrderIndex()); + metaSchemaDao.update(sourceMetaSchemaModel); + // 2 >=target的orderIndex的model全部+1(不包括source) + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_META_SCHEMA + " SET " + MetaSchemaModel.ORDERINDEX + " = " + MetaSchemaModel.ORDERINDEX + "+1 WHERE " + MetaSchemaModel.ORDERINDEX + " >= " + targetMetaSchemaModel.getOrderIndex() + " AND " + MetaSchemaModel.ID + " <> ?"; + DBSql.update(sql, new Object[] { sourceId }); + Iterator iterator = metaSchemaCache.iterator(); + List metaSchemaModels = new ArrayList(); + while (iterator.hasNext()) { + MetaSchemaModel metaSchemaModel = iterator.next(); + if (metaSchemaModel.getOrderIndex() >= targetMetaSchemaModel.getOrderIndex() && !metaSchemaModel.getId().equals(sourceId)) { + metaSchemaModel.setOrderIndex(metaSchemaModel.getOrderIndex() + 1); + metaSchemaModels.add(metaSchemaModel); + } + } + for (MetaSchemaModel metaSchemaModel : metaSchemaModels) { + metaSchemaCache.put(metaSchemaModel.getId(), metaSchemaModel); + } + } else if (sourceMetaSchemaModel.getOrderIndex() < targetMetaSchemaModel.getOrderIndex()) {// source down + // 1 source的orderIndex = target的orderIndex+1 + sourceMetaSchemaModel.setOrderIndex(targetMetaSchemaModel.getOrderIndex() + 1); + metaSchemaDao.update(sourceMetaSchemaModel); + // 2 >target的orderIndex的model全部+1(不包括source) + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_META_SCHEMA + " SET " + MetaSchemaModel.ORDERINDEX + " = " + MetaSchemaModel.ORDERINDEX + "+1 WHERE " + MetaSchemaModel.ORDERINDEX + " > " + targetMetaSchemaModel.getOrderIndex() + " AND " + MetaSchemaModel.ID + " <> ?"; + DBSql.update(sql, new Object[] { sourceId }); + Iterator iterator = metaSchemaCache.iterator(); + List metaSchemaModels = new ArrayList(); + while (iterator.hasNext()) { + MetaSchemaModel metaSchemaModel = iterator.next(); + if (metaSchemaModel.getOrderIndex() > targetMetaSchemaModel.getOrderIndex() && !metaSchemaModel.getId().equals(sourceId)) { + metaSchemaModel.setOrderIndex(metaSchemaModel.getOrderIndex() + 1); + metaSchemaModels.add(metaSchemaModel); + } + } + for (MetaSchemaModel metaSchemaModel : metaSchemaModels) { + metaSchemaCache.put(metaSchemaModel.getId(), metaSchemaModel); + } + } else { + throw new AWSException("位置无效"); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/OptService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/OptService.java new file mode 100644 index 00000000..bc57b762 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/OptService.java @@ -0,0 +1,270 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.OptCache; +import com.actionsoft.apps.kms.dao.OptDao; +import com.actionsoft.apps.kms.model.OptModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.alibaba.fastjson.JSONObject; + +/** + * 操作service(评论 评分 反馈) + * + * @author wangshibao + * + */ +public class OptService { + + /** + * 创建评论 + * + * @param me + * @param cardId 知识ID + * @param commentContent 评论内容 + * @return 新创建的评论ID + * @author wangshibao + */ + public String insertComment(UserContext me, String cardId, String commentContent) { + OptModel optModel = new OptModel(); + optModel.setCardId(cardId); + optModel.setOptTime(new Timestamp(System.currentTimeMillis())); + optModel.setOptUser(me.getUID()); + optModel.setOptContent(commentContent); + optModel.setOptType(KMSConstant.OPT_TYPE_COMMENT); + + String commentId = UUIDGener.getObjectId(); + optModel.setId(commentId); + + OptDao optDao = new OptDao(); + optDao.insert(optModel); + return commentId; + } + + /** + * 查询评论列表 + * + * @param cardId 知识ID + * @return 评论模型的List + * @author wangshibao + */ + public List queryComments(String cardId) { + List commentModels = new ArrayList<>(); + + OptCache optCache = OptCache.getCache(); + Iterator optIterator = optCache.iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == KMSConstant.OPT_TYPE_COMMENT && cardId.equals(optModel.getCardId())) { + commentModels.add(optModel); + } + } + Collections.sort(commentModels, new Comparator() { + @Override + public int compare(OptModel o1, OptModel o2) { + return o2.getOptTime().compareTo(o1.getOptTime()); + } + }); + return commentModels; + } + + /** + * 给知识评分 + * + * @param me + * @param cardId 知识ID + * @param rateLevel 分数是Integer类型的,因有可能是null值(代表删除评分) + * @author wangshibao + */ + public String rateCard(UserContext me, String rateId, String cardId, Integer rateLevel) { + if (!UtilString.isEmpty(rateId)) { + if (OptCache.getCache().get(rateId) == null) { + throw new AWSException("评分不存在"); + } + } + String newRateId = ""; + OptDao rateDao = new OptDao(); + if (rateLevel == null) {// 删除 + rateDao.delete(rateId); + } else { + if (UtilString.isEmpty(rateId)) {// 新增 + OptModel optModel = new OptModel(); + optModel.setCardId(cardId); + newRateId = UUIDGener.getObjectId(); + optModel.setId(newRateId); + optModel.setOptContent(rateLevel.toString()); + optModel.setOptTime(new Timestamp(System.currentTimeMillis())); + optModel.setOptUser(me.getUID()); + optModel.setOptType(KMSConstant.OPT_TYPE_RATE); + + rateDao.insert(optModel); + } else {// 修改 + OptModel optModel = OptCache.getCache().get(rateId); + newRateId = rateId; + optModel.setOptContent(rateLevel.toString()); + optModel.setOptTime(new Timestamp(System.currentTimeMillis())); + rateDao.update(optModel); + } + } + return newRateId; + } + + /** + * 获取某人对知识的评分 + * + * @param cardId 知识ID + * @param rateUser 评分人 + * @return 评分模型 + * @author wangshibao + */ + public OptModel getRate(String cardId, String rateUser) { + OptCache optCache = OptCache.getCache(); + Iterator optIterator = optCache.iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == KMSConstant.OPT_TYPE_RATE && rateUser.equals(optModel.getOptUser()) && cardId.equals(optModel.getCardId())) { + return optModel; + } + } + return null; + } + + /** + * 获取某知识的评分信息 + * + * @param cardId 知识ID + * @return json对象{1:num,2:num,3:num,4:num,5:num} + * @author wangshibao + */ + public JSONObject getRates(String cardId) { + final JSONObject ratesJO = new JSONObject(); + + int level1Count = 0; + int level2Count = 0; + int level3Count = 0; + int level4Count = 0; + int level5Count = 0; + + OptCache optCache = OptCache.getCache(); + Iterator optIterator = optCache.iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == KMSConstant.OPT_TYPE_RATE && cardId.equals(optModel.getCardId())) { + switch (optModel.getOptContent()) { + case "1": + level1Count += 1; + break; + case "2": + level2Count += 1; + break; + case "3": + level3Count += 1; + break; + case "4": + level4Count += 1; + break; + case "5": + level5Count += 1; + break; + } + } + } + + // 默认评分 + ratesJO.put("1", level1Count); + ratesJO.put("2", level2Count); + ratesJO.put("3", level3Count); + ratesJO.put("4", level4Count); + ratesJO.put("5", level5Count); + return ratesJO; + } + + /** + * 根据cardId集合删除缓存, 注意:为了加快查询速度,cardIdList会被修改 + * + * @param cardIdList + * @param optType 操作类型 + * @author wangshibao + */ + public void removeCacheByCardIds(List cardIdList, int optType) { + OptCache optCache = OptCache.getCache(); + Iterator optIterator = optCache.iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == optType && cardIdList.contains(optModel.getCardId())) { + optCache.remove(optModel.getId()); + cardIdList.remove(optModel.getCardId()); + } + if (cardIdList.size() == 0) { + break; + } + } + } + + /** + * 查询最新10条评论 + * + * @return + * @author wangshibao + */ + public List getLatestComment(String uid) { + List optModels = new ArrayList<>(); + OptCache optCache = OptCache.getCache(); + CardCache cardCache = CardCache.getCache(); + Iterator optIterator = optCache.iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == KMSConstant.OPT_TYPE_COMMENT) { + if (cardCache.get(optModel.getCardId()) != null) { + if (uid.equals(cardCache.get(optModel.getCardId()).getCreateUser())) {// 我的知识 + optModels.add(optModel); + } + } + } + } + // 按照时间倒叙排列 + Collections.sort(optModels, new Comparator() { + @Override + public int compare(OptModel o1, OptModel o2) { + + return o2.getOptTime().compareTo(o1.getOptTime()); + } + }); + // 取10条 + List pageOptModels = new ArrayList<>(); + for (int i = 0; i < optModels.size() && i < 10; i++) { + pageOptModels.add(optModels.get(i)); + } + return pageOptModels; + } + + /** + * 获取某个知识的评论数 + * + * @param cardId + * @return + * @author wangshibao + */ + public int getCommentCount(String cardId) { + int count = 0; + Iterator optIterator = OptCache.getCache().iterator(); + while (optIterator.hasNext()) { + OptModel optModel = optIterator.next(); + if (optModel.getOptType() == KMSConstant.OPT_TYPE_COMMENT && cardId.equals(optModel.getCardId())) { + count++; + } + + } + return count; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PermChangeByOrgSync.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PermChangeByOrgSync.java new file mode 100644 index 00000000..d29cf7fc --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PermChangeByOrgSync.java @@ -0,0 +1,158 @@ +package com.actionsoft.apps.kms.service; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.bpms.org.cache.TeamMemberCache; +import com.actionsoft.bpms.org.event.OrgSyncListener; +import com.actionsoft.bpms.org.model.CompanyModel; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.RoleModel; +import com.actionsoft.bpms.org.model.TeamMemberModel; +import com.actionsoft.bpms.org.model.TeamModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.sdk.local.SDK; + +public class PermChangeByOrgSync implements OrgSyncListener { + public PermChangeByOrgSync() { + super(); + } + + @Override + public void beforeCompanyChanged(CompanyModel cModel, int action) { + + } + + @Override + public void beforeDepartmentChanged(DepartmentModel dModel, int action) { + + } + + @Override + public void beforeRoleChanged(RoleModel rModel, int action) { + + } + + @Override + public void beforeTeamChanged(TeamModel tModel, int action) { + + } + + @Override + public void beforeUserChanged(UserModel uModel, int action) { + + } + + @Override + public void afterCompanyChanged(CompanyModel oldModel, CompanyModel newModel, int action) { + + } + + @Override + public void afterDepartmentChanged(DepartmentModel oldModel, DepartmentModel newModel, int action) { + //查询旧部门下的人的权限,然后删除 + if (oldModel != null) { + List userModels = SDK.getORGAPI().getUsersByDepartment(oldModel.getId()); + for (UserModel userModel : userModels) { + String uid = userModel.getUID(); + DimensionTreeCache.getCache().remove(uid); + Iterator> cardPermIterator = CardPermCache.getCache().iterator(); + while (cardPermIterator.hasNext()) { + HashMap map = cardPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + Iterator> dimensionPermIterator = DimensionPermCache.getCache().iterator(); + while (dimensionPermIterator.hasNext()) { + HashMap map = dimensionPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + } + } + } + + @Override + public void afterRoleChanged(RoleModel oldModel, RoleModel newModel, int action) { + if (oldModel == null) { + return; + } + //查询旧角色下的人的权限,然后删除 + List userModels = SDK.getORGAPI().getUsersByRole(oldModel.getId()); + for (UserModel userModel : userModels) { + String uid = userModel.getUID(); + DimensionTreeCache.getCache().remove(uid); + Iterator> cardPermIterator = CardPermCache.getCache().iterator(); + while (cardPermIterator.hasNext()) { + HashMap map = cardPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + Iterator> dimensionPermIterator = DimensionPermCache.getCache().iterator(); + while (dimensionPermIterator.hasNext()) { + HashMap map = dimensionPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + } + } + + @Override + public void afterTeamChanged(TeamModel oldModel, TeamModel newModel, int action) { + if (oldModel == null) { + return; + } + //查询旧角色下的人的权限,然后删除 + Iterator userModels = TeamMemberCache.getListOfMember(oldModel.getId()); + while (userModels.hasNext()) { + TeamMemberModel userModel = userModels.next(); + String uid = userModel.getUserId(); + DimensionTreeCache.getCache().remove(uid); + Iterator> cardPermIterator = CardPermCache.getCache().iterator(); + while (cardPermIterator.hasNext()) { + HashMap map = cardPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + Iterator> dimensionPermIterator = DimensionPermCache.getCache().iterator(); + while (dimensionPermIterator.hasNext()) { + HashMap map = dimensionPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + } + } + + @Override + public void afterUserChanged(UserModel oldModel, UserModel newModel, int action) { + if (oldModel == null) { + return; + } + String uid = oldModel.getUID(); + DimensionTreeCache.getCache().remove(uid); + Iterator> cardPermIterator = CardPermCache.getCache().iterator(); + while (cardPermIterator.hasNext()) { + HashMap map = cardPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + Iterator> dimensionPermIterator = DimensionPermCache.getCache().iterator(); + while (dimensionPermIterator.hasNext()) { + HashMap map = dimensionPermIterator.next(); + if (map.containsKey(uid)) { + map.remove(uid); + } + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PublishService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PublishService.java new file mode 100644 index 00000000..2c8f17e1 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/PublishService.java @@ -0,0 +1,919 @@ +package com.actionsoft.apps.kms.service; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.dao.PublishDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.commons.database.BatchPreparedStatementSetter; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.file.ReadDCFile; +import com.actionsoft.bpms.server.fs.file.WriteDCFile; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilFile; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import org.apache.commons.lang.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.sql.*; +import java.text.Collator; +import java.util.*; + +/** + * 发布 + * + * @author wangshibao + */ +public class PublishService { + public long totalRecordsPublish = 0;// 我发布的知识总行数 + public long totalRecordsPublishExamine = 0;// 发布审批总行数 + + /** + * 查询某人已发布的信息 + * + * @param uid 某人 + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 发布模型的List + * @author wangshibao + */ + public List queryMyPublish(String uid, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + List publishModels = new ArrayList<>(); + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + CardCache cardCache = CardCache.getCache(); + DimensionCache dimensionCache = DimensionCache.getCache(); + FileService fileService = new FileService(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (uid.equals(publishModel.getPublishUser())) { + publishModel.setCardModel(cardCache.get(publishModel.getCardId())); + publishModel.setDimensionModel(dimensionCache.get(publishModel.getDimensionId())); + //适配旧版本中删除知识但没有取消收藏的检索时报500异常的问题 + if (publishModel.getCardModel() == null) { + continue; + } + // 过滤知识名称和文件名称 + if (!UtilString.isEmpty(filter) && !UtilString.isEmpty(publishModel.getCardModel().getId())) { + if (!StringUtils.containsIgnoreCase(publishModel.getCardModel().getCardName(), filter) && !fileService.filterFileName(publishModel.getCardModel().getId(), filter)) { + continue; + } + } + publishModels.add(publishModel); + } + } + + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.READCOUNT)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + long result = o1.getCardModel().getReadCount() - o2.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + long result = o2.getCardModel().getReadCount() - o1.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o1.getCardModel().getCardName(), o2.getCardModel().getCardName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o2.getCardModel().getCardName(), o1.getCardModel().getCardName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(DimensionModel.DIMENSIONNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o1.getDimensionModel().getDimensionName(), o2.getDimensionModel().getDimensionName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o2.getDimensionModel().getDimensionName(), o1.getDimensionModel().getDimensionName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(PublishModel.PUBLISHTIME)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = o1.getPublishTime().compareTo(o2.getPublishTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = o2.getPublishTime().compareTo(o1.getPublishTime()); + return result; + } + }); + } + } + } + + List publishModelPageList = new ArrayList<>(); + for (int i = firstRow; i < firstRow + rowsPerPage && i < publishModels.size(); i++) { + publishModelPageList.add(publishModels.get(i)); + } + totalRecordsPublish = publishModels.size(); + return publishModelPageList; + } + + /** + * 查询发布待审 + * + * @param conn + * @param uid + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 发布BO模型的List + * @author wangshibao + */ + public List queryMyPublishExamine(Connection conn, String uid, int curPage, int rowsPerPage) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + List boList = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).addQuery("APPLYUSER=", uid).listPage(firstRow, rowsPerPage); + totalRecordsPublishExamine = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).addQuery("APPLYUSER=", uid).count(); + return boList; + } + + /** + * 查询维度下的知识信息 + * + * @param dimensionId 维度ID + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return 发布模型的List + * @author wangshibao + */ + public List queryPublishByDimensionId(String uid, String dimensionId, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + int firstRow = (curPage - 1) * rowsPerPage; + + List publishModels = new ArrayList<>(); + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + CardCache cardCache = CardCache.getCache(); + DimensionCache dimensionCache = DimensionCache.getCache(); + FileService fileService = new FileService(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getDimensionId().equals(dimensionId)) { + if (!KMSUtil.checkCardAC(publishModel.getCardId(), uid)) { + continue; + } + publishModel.setCardModel(cardCache.get(publishModel.getCardId())); + // if (!KMSUtil.isDimensionManager(dimensionId, uid)) {// 如果不是此维度管理员 + // + + // 过滤有效期 + if (publishModel.getCardModel() != null && publishModel.getCardModel().getValidDate() != null && (publishModel.getCardModel().getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤密级控制 + if (!KMSUtil.checkSecurity(uid, publishModel.getCardModel())) { + continue; + } + // } + // 发布状态过滤:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + // 过滤知识名称和文件名称 + if (!UtilString.isEmpty(filter)) { + if (!StringUtils.containsIgnoreCase(publishModel.getCardModel().getCardName(), filter) && !fileService.filterFileName(publishModel.getCardId(), filter)) { + continue; + } + } + publishModel.setDimensionModel(dimensionCache.get(publishModel.getDimensionId())); + publishModels.add(publishModel); + } + } + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.READCOUNT)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + long result = o1.getCardModel().getReadCount() - o2.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + long result = o2.getCardModel().getReadCount() - o1.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o1.getCardModel().getCardName(), o2.getCardModel().getCardName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o2.getCardModel().getCardName(), o1.getCardModel().getCardName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(PublishModel.PUBLISHUSER)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getPublishUser()); + UserModel userModel2 = UserCache.getModel(o2.getPublishUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return -1; + } + if (userModel2 == null) { + return 1; + } + int result = collatorChinese.compare(userModel1.getUserName(), userModel2.getUserName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + UserModel userModel1 = UserCache.getModel(o1.getPublishUser()); + UserModel userModel2 = UserCache.getModel(o2.getPublishUser()); + if (userModel1 == null && userModel2 == null) { + return 0; + } + if (userModel1 == null) { + return 1; + } + if (userModel2 == null) { + return -1; + } + int result = collatorChinese.compare(userModel2.getUserName(), userModel1.getUserName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(PublishModel.PUBLISHTIME)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = o1.getPublishTime().compareTo(o2.getPublishTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override public int compare(PublishModel o1, PublishModel o2) { + int result = o2.getPublishTime().compareTo(o1.getPublishTime()); + return result; + } + }); + } + } + } + // 分页 + List publishModelPageList = new ArrayList<>(); + for (int i = firstRow; i < firstRow + rowsPerPage && i < publishModels.size(); i++) { + publishModelPageList.add(publishModels.get(i)); + } + // 总行数 + totalRecordsPublish = publishModels.size(); + return publishModelPageList; + } + + /** + * 查询维度下的知识信息(不分页) + * + * @param dimensionId 维度ID + * @return 发布模型的List + * @author wangshibao + */ + public List queryPublishAllByDimensionId(String uid, String dimensionId) { + + List publishModels = new ArrayList<>(); + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + CardCache cardCache = CardCache.getCache(); + DimensionCache dimensionCache = DimensionCache.getCache(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getDimensionId().equals(dimensionId)) { + if (!KMSUtil.checkCardAC(publishModel.getCardId(), uid)) { + continue; + } + publishModel.setCardModel(cardCache.get(publishModel.getCardId())); + // if (!KMSUtil.isDimensionManager(dimensionId, uid)) {// 如果不是此维度管理员 + // + + // 过滤有效期 + if (publishModel.getCardModel().getValidDate() != null && (publishModel.getCardModel().getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤密级控制 + if (!KMSUtil.checkSecurity(uid, publishModel.getCardModel())) { + continue; + } + // } + // 发布状态过滤:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + publishModel.setDimensionModel(dimensionCache.get(publishModel.getDimensionId())); + publishModels.add(publishModel); + } + } + return publishModels; + } + + /** + * 获取维度下的知识数量 + * @param dimensionId + * @return + */ + public int getCountByDimensionId(String dimensionId) { + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + int count = 0; + while (publishIterator.hasNext()) { + PublishModel next = publishIterator.next(); + if (next.getDimensionId().equals(dimensionId)) { + // 发布状态过滤:申请中、审批中、不同意 + if (!UtilString.isEmpty(next.getExamineInfo())) { + if (!next.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + count++; + } + } + return count; + } + /** + * 查询维度下的知识信息(未填充PublishModel的CardModel和DimensionModel信息) + * + * @param dimensionId 维度ID + * @return 发布模型的List + * @author wangshibao + */ + public List queryPublishByDimensionId(String dimensionId) { + + List publishModels = new ArrayList<>(); + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getDimensionId().equals(dimensionId)) { + publishModels.add(publishModel); + } + } + return publishModels; + } + + /** + * 根据ID查询发布模型 + * + * @param publishId 发布模型ID + * @return + * @author wangshibao + */ + public PublishModel queryPublishById(String publishId) { + PublishModel publishModel = PublishCache.getCache().get(publishId); + publishModel.setCardModel(CardCache.getCache().get(publishModel.getCardId())); + publishModel.setDimensionModel(DimensionCache.getCache().get(publishModel.getDimensionId())); + return publishModel; + } + + /** + * 根据发布模型ID删除发布信息 + * + * @param publishId 发布模型ID + * @return + * @author wangshibao + */ + public boolean delete(String publishId) { + PublishDao publishDao = new PublishDao(); + int result = publishDao.delete(publishId); + if (result == 1) { + return true; + } else { + return false; + } + } + + /** + * 根据发布模型ID删除发布信息 + * + * @param conn 数据库连接 + * @param publishId 发布模型ID + * @return + * @author wangshibao + */ + public boolean delete(Connection conn, String publishId) { + PublishDao publishDao = new PublishDao(); + int result = publishDao.delete(conn, publishId); + if (result == 1) { + return true; + } else { + return false; + } + } + + /** + * 查询某知识的发布条数(单个知识可以发布在不同维度下) + * + * @param cardId 知识ID + * @return + * @author wangshibao + */ + public int getPublishedCountByCardId(String cardId) { + Iterator publishIterator = PublishCache.getCache().iterator(); + int count = 0; + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (cardId.equals(publishModel.getCardId())) { + count++; + } + } + return count; + } + + /** + * 查询某知识的发布信息 + * + * @param cardId + * @return + * @author wangshibao + */ + public List queryPublishByCardId(String cardId) { + List publishModels = new ArrayList<>(); + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (cardId.equals(publishModel.getCardId())) { + publishModels.add(publishModel); + } + } + return publishModels; + } + + /** + * 删除全文检索和标记(取消发布知识卡片时) + * + * @param cardId + * @author wangshibao + */ + public void deleteFullSearch(String cardId) { + CardModel cardModel = CardCache.getCache().get(cardId); + + if (cardModel != null && cardModel.getIsPublished() == 0) {// 未发布状态 + List fileModels = new FileService().queryFiles(cardId); + // 删除全文检索 + for (FileModel fileModel : fileModels) { + try { + String aslp = "aslp://"+KMSConstant.APP_FULLSEARCH+"/deleteIndex"; + Map params = new HashMap(); + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp/" + cardModel.getId() + "/" + fileModel.getId() + "/"; + File targetFile = new File(targetDir + fileModel.getFileName()); + params.put("documentPath", targetFile.getPath()); + SDK.getAppAPI().asynCallASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), aslp, params); + } catch (Exception e) { + e.printStackTrace(); + } + } + // 删除标记 + if (fileModels.size() > 0) { + String sql = "UPDATE " + KMSConstant.ENTITY_NAME_FILE + " SET " + FileModel.ISFULLSEARCH + " = 0 WHERE " + FileModel.ISFULLSEARCH + " = 1 AND " + FileModel.ID + " IN ("; + List paramList = new ArrayList<>(); + for (FileModel fileModel : fileModels) { + sql += "?,"; + paramList.add(fileModel.getId()); + } + sql = sql.substring(0, sql.length() - 1); + sql += ")"; + DBSql.update(sql, paramList.toArray()); + // 更新缓存 + FileCache fileCache = FileCache.getCache(); + for (FileModel fileModel : fileModels) { + if (fileModel.getIsFullsearch() == 1) { + fileModel.setIsFullsearch(0); + } + fileCache.put(fileModel.getId(), fileModel); + } + } + } + } + + /** + * 移动知识 + * + * @param cardArr + * @param dimensionArr 目标维度 + * @param currDimensionId 知识当前所在维度 + * @param uid + * @author wangshibao + */ + public void moveCard(List cardArr, List dimensionArr, String currDimensionId, String uid) { + + try { + // 校验 + if (cardArr.size() == 0) { + throw new AWSException("知识不允许为空"); + } + if (dimensionArr.size() == 0) { + throw new AWSException("知识分类不允许为空"); + } + CardService cardService = new CardService(); + for (int i = 0; i < cardArr.size(); i++) { + String cardId = cardArr.get(i); + for (int j = 0; j < dimensionArr.size(); j++) { + String dimensionId = dimensionArr.get(j); + + boolean checkResult = cardService.isPublishedInDimension(cardId, dimensionId); + if (checkResult) { + String dimensionName = DimensionCache.getCache().get(dimensionId).getDimensionName(); + CardModel cardModel = CardCache.getCache().get(cardId); + String cardName = cardModel.getCardName(); + throw new AWSException("知识[" + cardName + "]已经发布在知识分类[" + dimensionName + "]下,不能重复发布"); + } + + } + } + LocalTxManager.getInstance().begin(); + // 删除当前维度的知识 + List paramList = new ArrayList<>(); + List oldPublishModels = new ArrayList(); + String deleteSql = "DELETE FROM " + KMSConstant.ENTITY_NAME_PUBLISH + " WHERE " + PublishModel.DIMENSIONID + " = ? AND " + PublishModel.CARDID + " IN ("; + paramList.add(currDimensionId); + for (Object cardId : cardArr) { + deleteSql += "?,"; + paramList.add((String) cardId); + String publishModelId = DBSql.getString("SELECT ID FROM " + KMSConstant.ENTITY_NAME_PUBLISH + " WHERE " + PublishModel.DIMENSIONID + "='" + currDimensionId + "' AND " + PublishModel.CARDID + " ='" + (String) cardId + "'", "ID"); + PublishModel publishModel = PublishCache.getCache().get(publishModelId); + oldPublishModels.add(publishModel); + } + deleteSql = deleteSql.substring(0, deleteSql.length() - 1); + deleteSql += ")"; + DBSql.update(deleteSql, paramList.toArray()); + + // 将选中的知识发布到维度(无标签和描述信息) + + // 插入publish表 + String insertPublishSql = "INSERT INTO " + KMSConstant.ENTITY_NAME_PUBLISH + "(" + PublishModel.ID + "," + PublishModel.CARDID + "," + PublishModel.DIMENSIONID + "," + PublishModel.PUBLISHUSER + "," + PublishModel.PUBLISHTIME + "," + PublishModel.TAG + "," + PublishModel.MEMO + "," + PublishModel.EXAMINEINFO + ") VALUES (?,?,?,?,?,?,?,?)"; + + final List publishModels = new ArrayList<>(); + for (int i = 0; i < cardArr.size(); i++) { + String cardId = cardArr.get(i); + for (int j = 0; j < dimensionArr.size(); j++) { + String dimensionId = dimensionArr.get(j); + String publishId = UUIDGener.getObjectId(); + Timestamp publishTime = new Timestamp(System.currentTimeMillis()); + + PublishModel publishModel = new PublishModel(); + publishModel.setId(publishId); + publishModel.setCardId(cardId); + publishModel.setDimensionId(dimensionId); + PublishModel oldPublishModel = oldPublishModels.get(i); + if (oldPublishModel != null) { + publishModel.setPublishUser(oldPublishModel.getPublishUser()); + publishModel.setPublishTime(oldPublishModel.getPublishTime()); + } else { + publishModel.setPublishUser(uid); + publishModel.setPublishTime(publishTime); + } + + publishModel.setTag(null); + publishModel.setMemo(null); + publishModel.setExamineInfo(null); + publishModels.add(publishModel); + } + + } + DBSql.batch(insertPublishSql, new BatchPreparedStatementSetter() { + + @Override public void setValues(PreparedStatement pstmt, int index) throws SQLException { + PublishModel publishModel = publishModels.get(index); + pstmt.setString(1, publishModel.getId()); + pstmt.setString(2, publishModel.getCardId()); + pstmt.setString(3, publishModel.getDimensionId()); + pstmt.setString(4, publishModel.getPublishUser()); + pstmt.setTimestamp(5, publishModel.getPublishTime()); + pstmt.setNull(6, Types.VARCHAR); + pstmt.setNull(7, Types.VARCHAR); + pstmt.setNull(8, Types.VARCHAR); + } + + @Override public int getBatchSize() { + + return publishModels.size(); + } + }); + + LocalTxManager.getInstance().commit(); + + // 更新缓存 + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getDimensionId().equals(currDimensionId) && cardArr.contains(publishModel.getCardId())) { + publishCache.remove(publishModel.getId()); + } + } + + for (PublishModel publishModel : publishModels) { + publishCache.put(publishModel.getId(), publishModel); + } + } catch (Exception e) { + if (LocalTxManager.getInstance().inTransaction()) { + LocalTxManager.getInstance().rollback(); + } + throw new AWSException(e); + } + } + + /** + * 复制知识 + * + * @param cardArr + * @param dimensionArr 目标维度 + * @param currDimensionId 知识当前所在维度 + * @param uid + * @author wangshibao + */ + public void copyCard(List cardArr, List dimensionArr, String currDimensionId, String uid) { + + try { + // 校验 + if (cardArr.size() == 0) { + throw new AWSException("知识不允许为空"); + } + if (dimensionArr.size() == 0) { + throw new AWSException("知识分类不允许为空"); + } + CardService cardService = new CardService(); + for (int i = 0; i < cardArr.size(); i++) { + String cardId = cardArr.get(i); + for (int j = 0; j < dimensionArr.size(); j++) { + String dimensionId = dimensionArr.get(j); + + boolean checkResult = cardService.isPublishedInDimension(cardId, dimensionId); + if (checkResult) { + String dimensionName = DimensionCache.getCache().get(dimensionId).getDimensionName(); + CardModel cardModel = CardCache.getCache().get(cardId); + String cardName = cardModel.getCardName(); + throw new AWSException("知识[" + cardName + "]已经发布在知识分类[" + dimensionName + "]下,不能重复发布"); + } + + } + } + LocalTxManager.getInstance().begin(); + + // 将选中的知识发布到维度(无标签和描述信息) + + // 插入publish表 + String insertPublishSql = "INSERT INTO " + KMSConstant.ENTITY_NAME_PUBLISH + "(" + PublishModel.ID + "," + PublishModel.CARDID + "," + PublishModel.DIMENSIONID + "," + PublishModel.PUBLISHUSER + "," + PublishModel.PUBLISHTIME + "," + PublishModel.TAG + "," + PublishModel.MEMO + "," + PublishModel.EXAMINEINFO + ") VALUES (?,?,?,?,?,?,?,?)"; + + final List publishModels = new ArrayList<>(); + for (int i = 0; i < cardArr.size(); i++) { + String cardId = cardArr.get(i); + for (int j = 0; j < dimensionArr.size(); j++) { + String dimensionId = dimensionArr.get(j); + String publishId = UUIDGener.getObjectId(); + Timestamp publishTime = new Timestamp(System.currentTimeMillis()); + + PublishModel publishModel = new PublishModel(); + publishModel.setId(publishId); + publishModel.setCardId(cardId); + publishModel.setDimensionId(dimensionId); + publishModel.setPublishUser(uid); + publishModel.setPublishTime(publishTime); + publishModel.setTag(null); + publishModel.setMemo(null); + publishModel.setExamineInfo(null); + publishModels.add(publishModel); + } + + } + DBSql.batch(insertPublishSql, new BatchPreparedStatementSetter() { + + @Override public void setValues(PreparedStatement pstmt, int index) throws SQLException { + PublishModel publishModel = publishModels.get(index); + pstmt.setString(1, publishModel.getId()); + pstmt.setString(2, publishModel.getCardId()); + pstmt.setString(3, publishModel.getDimensionId()); + pstmt.setString(4, publishModel.getPublishUser()); + pstmt.setTimestamp(5, publishModel.getPublishTime()); + pstmt.setNull(6, Types.VARCHAR); + pstmt.setNull(7, Types.VARCHAR); + pstmt.setNull(8, Types.VARCHAR); + } + + @Override public int getBatchSize() { + + return publishModels.size(); + } + }); + LocalTxManager.getInstance().commit(); + + // 更新缓存 + PublishCache publishCache = PublishCache.getCache(); + + for (PublishModel publishModel : publishModels) { + publishCache.put(publishModel.getId(), publishModel); + } + } catch (Exception e) { + if (LocalTxManager.getInstance().inTransaction()) { + LocalTxManager.getInstance().rollback(); + } + throw new AWSException(e); + } finally { + + } + } + + public void changeCardUser(List cardArr, String handoverCardUser) { + // 校验 + if (cardArr.size() == 0) { + throw new AWSException("知识不允许为空"); + } + if (UtilString.isEmpty(handoverCardUser)) { + throw new AWSException("交接人不许为空"); + } + CardService cardService = new CardService(); + for (int i = 0; i < cardArr.size(); i++) { + String cardId = cardArr.get(i); + Boolean b = handOverAttachments(cardId, handoverCardUser); + if (b) { + CardModel cardModel = CardCache.getCache().get(cardId); + cardModel.setCreateUser(handoverCardUser); + CardDao cardDao = new CardDao(); + int result = cardDao.update(cardModel); + } else { + throw new AWSException("知识移交失败,请检查"); + } + } + } + + /** + * Hunter_Todo 移交知识时进行知识附件的移交处理 + * + * @param cardIds 知识ID + * + * @return java.lang.Boolean + * + * @author hunter + * @date 2021/3/29 11:26 + */ + public Boolean handOverAttachments(String cardId, String handoverCardUser) { + //检查是否存在文件,存在则进行物理文件路径变更 + List modelList = new FileService().queryLatestFiles(cardId); + CardModel cardModel = CardCache.getCache().get(cardId); + String user = cardModel.getCreateUser(); + boolean b = false; + for (FileModel fileModel : modelList) { + String createUser = fileModel.getCreateUser(); + String fileVer = fileModel.getFileVer(); + if (!createUser.equals(handoverCardUser)) { + UserContext userContext = null; + DCPluginProfile dcProfile = DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME); + //获得源附件DC + DCContext sourceContext = new DCContext(userContext, dcProfile, KMSConstant.APP_ID, user, cardModel.getId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileVer)); + //获得目标附件 + DCContext targetContext = new DCContext(userContext, dcProfile, KMSConstant.APP_ID, handoverCardUser, cardModel.getId(), fileModel.getFileName()); + Map hashMap = new LinkedHashMap<>(); + hashMap.put("transferFileVersion", fileVer); + targetContext.setExtParams(hashMap); + InputStream in = ReadDCFile.getInstance().read(sourceContext); + b = WriteDCFile.getInstance().write(in, targetContext); + //文件复制成功后进行原文件的删除操作 + if (b) { + String securityFileName = sourceContext.getSecurityFileName(); + String path = sourceContext.getPath() + securityFileName; + File file = new File(path); + UtilFile.removeFile(file); + File parentFile = file.getParentFile(); + if (parentFile.list() != null && parentFile.list().length <= 0) { + UtilFile.removeFile(parentFile); + File fileParentFile = parentFile.getParentFile(); + if (fileParentFile.list() != null && fileParentFile.list().length <= 0) { + UtilFile.removeFile(fileParentFile); + } + } + } else { + System.err.println(sourceContext.getDCMessage()); + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } else { + //兼容一下之前移交出错的场景 + b = true; + } + } + return b; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/SearchService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/SearchService.java new file mode 100644 index 00000000..dd3335f7 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/SearchService.java @@ -0,0 +1,1182 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Timestamp; +import java.text.Collator; +import java.util.*; + +import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.cache.DesignerShapeRelationCache; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeRelationModel; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.bpms.commons.database.RowMap; +import com.actionsoft.bpms.util.DBSql; +import com.awspaas.user.apps.yili.reportform.util.RepositoryAttribute; +import org.apache.commons.lang.StringUtils; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.FileCache; +import com.actionsoft.apps.kms.cache.MetaDataCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.MetaDataModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.security.ac.cache.AccessControlCache; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 检索(全文检索、属性检索) + * + * @author wangshibao + */ +public class SearchService { + public long totalRecords = 0;// 总行数 + + /** + * 属性检索 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @param dimensionList 维度IDList + * @param schemaMetaDataJO 元数据JSON对象 + * @param tagList 标签List + * @param cardName 知识名称 + * @param lastPublishId 上一页的最后一个publishId,用于分页计算时忽略前面的publishModel,从publishId的下一个publishModel开始计算。如果该publishId无效(比如被取消发布)则从头开始计算,是效率最低的极端情况 + * @return 知识模型的List + * @author wangshibao + */ + public List attrSearchCard(int curPage, int rowsPerPage, String sortIndx, String sortDir, String uid, List dimensionList, JSONObject schemaMetaDataJO, String cardName, Timestamp publishStartTime, Timestamp publishEndTime, List publishUserList, List tagList, String lastPublishId, String searchType,String departId) { + uid = "admin"; + if (curPage <= 0) { + throw new AWSException("参数错误:" + curPage); + } + if (rowsPerPage <= 0) { + throw new AWSException("参数错误:" + rowsPerPage); + } + // 知识管理员 + boolean isKnwlMgr = KMSUtil.isKnwlManager(uid); + // 将endTime + 23:59:59(默认是00:00:00) + if (publishEndTime != null) { + publishEndTime = new Timestamp(publishEndTime.getTime() + (24 * 60 * 60 * 1000 - 1)); + } + int firstRow = (curPage - 1) * rowsPerPage; + + Iterator publishIterator = PublishCache.getCache().iterator(); + List publishModelList = new ArrayList<>(); + while (publishIterator.hasNext()) { + PublishModel next = publishIterator.next(); + CardModel cardModel = CardCache.getCache().get(next.getCardId()); + if (cardModel == null) { + continue; + } + next.setCardModel(cardModel); + publishModelList.add(next); + } + boolean isCommentCountSort = false; + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase("commentCount")) {//如果是以评论数排序,先计算出评论数 + isCommentCountSort = true; + // 计算出每个知识的评论数 + OptService optService = new OptService(); + for (PublishModel publishModel : publishModelList) { + publishModel.getCardModel().setCommentCount(optService.getCommentCount(publishModel.getCardId())); + } + } + } + List list_new_card = new LinkedList<>(); + if (UtilString.isNotEmpty(departId)) { + ArrayList childDept = getChildDept(departId, new ArrayList<>()); + List palRepositoryModels = CoeProcessLevelDaoFacotory.createCoeProcessLevel() + .getAllCoeProcessLevelByWsId("7d3ca852-a0bd-42e6-80b1-3dcea6f55083"); + for (PALRepositoryModel palRepositoryModel : palRepositoryModels) { + String id = palRepositoryModel.getId(); + boolean publish = palRepositoryModel.isPublish(); + if (!publish) { + continue; + } + // 同步发布部门到APP_ACT_COE_PAL_REPOSITORY + try { + Map queryRepositoryAttributeById = new RepositoryAttribute().queryRepositoryAttributeById(id); + if (null != queryRepositoryAttributeById && !queryRepositoryAttributeById.isEmpty()) { + // 发布部门 + JSONObject Issuing_department = queryRepositoryAttributeById.get("Issuing_department"); + if (null != Issuing_department && !Issuing_department.equals("")) { + JSONArray PUBDEPTJA = Issuing_department.getJSONArray("value"); + if (null != PUBDEPTJA && !PUBDEPTJA.isEmpty()) { + for (Object PUBDEPTO : PUBDEPTJA) { + JSONObject PUBDEPTJO = JSONObject.parseObject(String.valueOf(PUBDEPTO)); + String dempId = PUBDEPTJO.getString("id"); + if (childDept.contains(dempId)) { + list_new_card.add(palRepositoryModel.getExt4()); + } + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + // 排序 + sortPublishModels(sortIndx, sortDir, publishModelList); + + List returnPublishModels = new ArrayList<>(); + JSONArray checkboxRadioJA = schemaMetaDataJO.getJSONArray("01"); + JSONArray textJA = schemaMetaDataJO.getJSONArray("2"); + MetaDataService metaDataService = new MetaDataService(); + int countRow = 0; + boolean isGoon = false;//是否参与条件判断 + if (!UtilString.isEmpty(lastPublishId) && PublishCache.getCache().get(lastPublishId) != null) {//如果lastPublishId存在(防止被取消发布导致的计算错误) + firstRow = 0;//相当于从第一页开始查询 + } else { + isGoon = true; + } + Iterator cardACIterator = AccessControlCache.getACList(KMSConstant.AC_RESOURCE_TYPE_CARD); + Iterator dimensionACIterator = AccessControlCache.getACList(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR); + List cardACList = new ArrayList(); + List dimensionACList = new ArrayList(); + for (Iterator it = dimensionACIterator; it.hasNext(); ) { + AccessControlModel ac = (AccessControlModel) it.next(); + dimensionACList.add(ac); + } + for (Iterator it = cardACIterator; it.hasNext(); ) { + AccessControlModel ac = (AccessControlModel) it.next(); + cardACList.add(ac); + } + Map accessDimensionACMap = new HashMap(); + for (PublishModel publishModel : publishModelList) { + try { + if (!isGoon) { + if (publishModel.getId().equals(lastPublishId)) { + isGoon = true; + } + continue; + } + long t1 = System.currentTimeMillis(); + if (!"moreTop".equals(searchType)) { + //先判断权限是否已缓存 + if (CardPermCache.hasCacheByUID(publishModel.getCardId(), uid)) { + if (!CardPermCache.getPermByUID(publishModel.getCardId(), uid)) { + continue; + } + } else { + /* + * if (!KMSUtil.checkCardAC(publishModel.getCardId(), uid, cardACList)) { + * continue; } + */ + } + } + + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + if (dimensionModel != null) { + // 维度未启用 + if (dimensionModel.getIsEnabled() != 1) { + continue; + } + // 过滤维度 + if (!dimensionList.isEmpty()) { + if (!dimensionList.contains(publishModel.getDimensionId())) { + continue; + } + } + } + if (!"moreTop".equals(searchType)) { + if (!accessDimensionACMap.containsKey(publishModel.getDimensionId())) { + boolean ac = true; + if (DimensionPermCache.hasCacheByUID(publishModel.getDimensionId(), uid)) { + ac = DimensionPermCache.getPermByUID(publishModel.getDimensionId(), uid); + } else { + ac = KMSUtil.canAccessDimension(publishModel.getDimensionId(), uid, dimensionACList); + } + accessDimensionACMap.put(publishModel.getDimensionId(), ac); + } + } + // 过滤发布时间 + if (publishStartTime != null) { + if (publishModel.getPublishTime().compareTo(publishStartTime) < 0) { + continue; + } + } + if (publishEndTime != null) { + if (publishModel.getPublishTime().compareTo(publishEndTime) > 0) { + continue; + } + } + // 过滤发布人 + if (!publishUserList.isEmpty()) { + if (!publishUserList.contains(publishModel.getPublishUser())) { + continue; + } + } + //过滤发布部门 + if (UtilString.isNotEmpty(departId)){ + if (!list_new_card.contains(publishModel.getCardId())){ + continue; + } + } + + + // 标签 + if (!tagList.isEmpty()) { + // 第一版tag只可能是一个 + String tag = tagList.get(0); + if (!UtilString.isEmpty(tag)) { + if (!UtilString.isEmpty(publishModel.getTag())) { + if (!publishModel.getTag().contains(KMSConstant.TAG_SEPRATOR + tag + KMSConstant.TAG_SEPRATOR)) { + continue; + } + } else { + continue; + } + } + } + // 过滤知识名称 + if (!UtilString.isEmpty(cardName)) { + CardModel cardModel = CardCache.getCache().get(publishModel.getCardId()); + if (!StringUtils.containsIgnoreCase(cardModel.getCardName(), cardName)) { + continue; + } + } + // 过滤元数据 + boolean metaFlag = false; + if (checkboxRadioJA != null && textJA != null) { + if (checkboxRadioJA.size() != 0 || textJA.size() != 0) { + //List metaDataModels = metaDataService.queryMetaDataByCardId(publishModel.getCardId()); + List metaDataModels = MetaDataCache.getCache().getMetaDataListOfCardId(publishModel.getCardId()); + if (checkboxRadioJA.size() != 0) { + List attrIdList = new ArrayList<>(); + for (MetaDataModel metaDataModel : metaDataModels) { + if (metaDataModel.getAttrId() != null) { + attrIdList.add(metaDataModel.getAttrId()); + } + } + for (int j = 0; j < checkboxRadioJA.size(); j++) { + JSONObject checkboxRadioJO = checkboxRadioJA.getJSONObject(j); + String attrId = checkboxRadioJO.getString("attrId"); + if (attrIdList.contains(attrId)) { + metaFlag = true; + break; + } + } + } + if (!metaFlag) { + if (textJA.size() != 0) { + for (int j = 0; j < textJA.size(); j++) { + if (!metaFlag) { + JSONObject textJO = textJA.getJSONObject(j); + String metaValue = textJO.getString("metaValue"); + String schemaId = textJO.getString("schemaId"); + for (MetaDataModel metaDataModel : metaDataModels) { + if (metaDataModel.getSchemaId().equals(schemaId) && metaDataModel.getMetaText() != null && metaDataModel.getMetaText().contains(metaValue)) { + metaFlag = true; + break; + } + } + } else { + break; + } + } + } + } + if (!metaFlag) { + continue; + } + } + } + if (!"moreTop".equals(searchType)) { + // 过滤权限 + if (!isKnwlMgr && !accessDimensionACMap.get(publishModel.getDimensionId())) { + continue; + } + if (!isKnwlMgr && KMSUtil.isNeedBorrow(publishModel.getDimensionId(), uid, dimensionACList)) { + continue; + } + } + // 如果不是此维度管理员 + // if (!KMSUtil.isDimensionManager(publishModel.getDimensionId(), uid)) { + CardModel cardModel = CardCache.getCache().get(publishModel.getCardId()); + // 过滤有效期 + if (cardModel.getValidDate() != null && (cardModel.getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤密级控制 + if (!KMSUtil.checkSecurity(uid, cardModel)) { + continue; + } + // } + // 过滤发布状态:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + boolean hasRepeat = false; + for (PublishModel returnPublishModel : returnPublishModels) {//过滤包含重复知识 + if (returnPublishModel.getCardId().equals(publishModel.getCardId())) { + hasRepeat = true; + break; + } + } + if (hasRepeat) { + continue; + } + publishModel.setCardModel(CardCache.getCache().get(publishModel.getCardId())); + countRow++; + if (countRow <= Long.valueOf(firstRow) + rowsPerPage + 1) {//多查一条,如果达不到rowsPerPage+1条,说明已经查询完毕 + returnPublishModels.add(publishModel); + } else { + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 分页(该分页在lastPublishId有效和无效情况下均适用) + List publishModelPageList = new ArrayList<>(); + for (int i = firstRow; i < Long.valueOf(firstRow) + rowsPerPage + 1 && i < returnPublishModels.size(); i++) { + PublishModel publishModel = returnPublishModels.get(i); + publishModel.setCardModel(CardCache.getCache().get(publishModel.getCardId())); + publishModelPageList.add(publishModel); + } + if (!isCommentCountSort) {//如果不是以评论数排序,需要计算评论数 + OptService optService = new OptService(); + for (PublishModel publishModel : returnPublishModels) { + publishModel.getCardModel().setCommentCount(optService.getCommentCount(publishModel.getCardId())); + } + } + totalRecords = 10000000;//设置成足够大的数,翻到最后一页时再计算真正的条数 + return publishModelPageList; + } + + /** + * 排序 + * + * @param sortIndx + * @param sortDir + * @param publishModels + */ + public void sortPublishModels(String sortIndx, String sortDir, List publishModels) { + if (!UtilString.isEmpty(sortIndx) && !UtilString.isEmpty(sortDir) && (sortDir.equals("up") || sortDir.equals("down"))) { + if (sortIndx.equalsIgnoreCase(CardModel.READCOUNT)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + long result = o1.getCardModel().getReadCount() - o2.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + long result = o2.getCardModel().getReadCount() - o1.getCardModel().getReadCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase(CardModel.CARDNAME)) { + final Collator collatorChinese = Collator.getInstance(Locale.CHINA); + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o1.getCardModel().getCardName(), o2.getCardModel().getCardName()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + int result = collatorChinese.compare(o2.getCardModel().getCardName(), o1.getCardModel().getCardName()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase(PublishModel.PUBLISHTIME)) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + int result = o1.getPublishTime().compareTo(o2.getPublishTime()); + return result; + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + int result = o2.getPublishTime().compareTo(o1.getPublishTime()); + return result; + } + }); + } + } else if (sortIndx.equalsIgnoreCase("commentCount")) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + long result = o1.getCardModel().getCommentCount() - o2.getCardModel().getCommentCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + long result = o2.getCardModel().getCommentCount() - o1.getCardModel().getCommentCount(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase("rateScore")) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + double result = o1.getCardModel().getRateScore() - o2.getCardModel().getRateScore(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + double result = o2.getCardModel().getRateScore() - o1.getCardModel().getRateScore(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } else if (sortIndx.equalsIgnoreCase("rdoSL")) { + if (sortDir.equals("up")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + double result = o1.getCardModel().getSecurityLevel() - o2.getCardModel().getSecurityLevel(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } else if (sortDir.equals("down")) { + Collections.sort(publishModels, new Comparator() { + @Override + public int compare(PublishModel o1, PublishModel o2) { + double result = o2.getCardModel().getSecurityLevel() - o1.getCardModel().getSecurityLevel(); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + } + } + } + } + + public String fullSearchWrap(UserContext me, int curPage, int rowsPerPage, String searchText, List docTypeList, String searchType) { + ResponseObject roResult = ResponseObject.newOkResponse(); + curPage++; + // 总的json数组(可能多页) + JSONArray totalJA = new JSONArray(); + PassedModel passedModel = new PassedModel(); + passedModel.curPage = curPage; + passedModel.hasNextPage = true; + CardCache cache = CardCache.getCache(); + Iterator iterator = cache.iterator(); + int existPublishKnowledge = 0; + while (iterator.hasNext()) { + CardModel cardModel = iterator.next(); + if (cardModel != null && cardModel.getIsPublished() == 1) { + existPublishKnowledge++; + } + } + if (existPublishKnowledge > 0) {//没有发布的知识时不进行检索,否则报404 + fullSearchRec(me, rowsPerPage, searchText, docTypeList, passedModel, totalJA, KMSUtil.isKnwlManager(me.getUID()), searchType); + } + roResult.put("result", totalJA); + roResult.put("hasNextPage", passedModel.hasNextPage); + roResult.put("curPage", passedModel.curPage); + return roResult.toString(); + } + + public void fullSearchRec(UserContext me, int rowsPerPage, String searchText, List docTypeList, PassedModel passedModel, JSONArray totalJA, boolean isKnwlMgr, String searchType) { + JSONArray pageJA = new JSONArray(); + if ("1".equals(searchType)) { + // 单页json数组 + pageJA = fullSearch(me, rowsPerPage, searchText, docTypeList, passedModel, isKnwlMgr); + } else if ("2".equals(searchType)) { + // 单页json数组 + pageJA = fullSearchByCard(me, rowsPerPage, searchText, passedModel, isKnwlMgr); + } else { + // 单页json数组 + pageJA = fullSearch(me, rowsPerPage, searchText, docTypeList, passedModel, isKnwlMgr); + } + totalJA.addAll(pageJA); + + if (passedModel.hasNextPage) {// 还有下一页数据 + if (totalJA.size() < rowsPerPage) {// 总条数小于请求的条数 + // 请求下一页数据 + passedModel.curPage++; + fullSearchRec(me, rowsPerPage, searchText, docTypeList, passedModel, totalJA, isKnwlMgr, searchType); + } + } + + } + + private class PassedModel { + int curPage = 0; + boolean hasNextPage = true; + } + + /** + * 全文检索 + * + * @param rowsPerPage 每页的行数 + * @return 检索结果JSON数组 + * @author wangshibao + */ + public JSONArray fullSearch(UserContext me, int rowsPerPage, String searchText, List docTypeList, PassedModel passedModel, boolean isKnwlMgr) { + String sourceAppId = KMSConstant.APP_ID; + AppAPI appAPI = SDK.getAppAPI(); + // 检索内容 + Map paramsResult = new HashMap(); + paramsResult.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + paramsResult.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + JSONObject queryBody = new JSONObject(); + JSONObject query = new JSONObject(); + JSONObject bool = new JSONObject(); + JSONArray mustArray = new JSONArray(); + JSONObject mustContent = new JSONObject(); + JSONObject subBool = new JSONObject(); + JSONArray should1 = new JSONArray(); + JSONObject matchContent = new JSONObject(); + JSONObject content = new JSONObject(); + JSONObject boostContent = new JSONObject(); + boostContent.put("query", boostContent); + boostContent.put("boost", 1); + content.put("content", searchText); + matchContent.put("match", content); + should1.add(matchContent); + JSONObject matchTitle = new JSONObject(); + JSONObject title = new JSONObject(); + JSONObject boostTitle = new JSONObject(); + boostTitle.put("query", searchText); + boostTitle.put("boost", 5); + title.put("title", boostTitle); + matchTitle.put("match_phrase", title); + should1.add(matchTitle); + JSONObject matchAbstract = new JSONObject(); + JSONObject abst = new JSONObject(); + JSONObject boostAbstract = new JSONObject(); + boostAbstract.put("query", searchText); + boostAbstract.put("boost", 10); + abst.put("abstract", boostAbstract); + matchAbstract.put("match_phrase", abst); + should1.add(matchAbstract); + JSONObject matchCardContent = new JSONObject(); + JSONObject cardContent = new JSONObject(); + JSONObject boostCardContent = new JSONObject(); + boostCardContent.put("query", searchText); + boostCardContent.put("boost", 5); + cardContent.put("cardContent", boostCardContent); + matchCardContent.put("match_phrase", cardContent); + should1.add(matchCardContent); + subBool.put("should", should1); + subBool.put("minimum_should_match", 1); + mustContent.put("bool", subBool); + mustArray.add(mustContent); + //paramsResult.put("searchText", "content:'" + searchText + "'"); + JSONObject mustDocType = new JSONObject(); + JSONObject subBool1 = new JSONObject(); + JSONArray should = new JSONArray(); + String searchTextDocType = "content:'" + searchText + "' AND ("; + if (docTypeList != null && docTypeList.size() != 0) { + for (String docType : docTypeList) { + switch (docType) { + case "pdf": + searchTextDocType += "documentType:\"pdf\" OR "; + JSONObject matchDocumentType = new JSONObject(); + JSONObject documentType = new JSONObject(); + documentType.put("documentType", "pdf"); + matchDocumentType.put("match", documentType); + should.add(matchDocumentType); + break; + case "doc": + searchTextDocType += "documentType:\"docx\" OR documentType:\"doc\" OR documentType:\"wps\" OR "; + JSONObject matchDocumentType1 = new JSONObject(); + JSONObject documentType1 = new JSONObject(); + documentType1.put("documentType", "docx"); + matchDocumentType1.put("match", documentType1); + should.add(matchDocumentType1); + JSONObject matchDocumentType2 = new JSONObject(); + JSONObject documentType2 = new JSONObject(); + documentType2.put("documentType", "doc"); + matchDocumentType2.put("match", documentType2); + should.add(matchDocumentType2); + JSONObject matchDocumentType3 = new JSONObject(); + JSONObject documentType3 = new JSONObject(); + documentType3.put("documentType", "wps"); + matchDocumentType3.put("match", documentType3); + should.add(matchDocumentType3); + break; + case "ppt": + searchTextDocType += "documentType:\"pptx\" OR documentType:\"ppt\" OR "; + JSONObject matchDocumentType4 = new JSONObject(); + JSONObject documentType4 = new JSONObject(); + documentType4.put("documentType", "pptx"); + matchDocumentType4.put("match", documentType4); + should.add(matchDocumentType4); + JSONObject matchDocumentType5 = new JSONObject(); + JSONObject documentType5 = new JSONObject(); + documentType5.put("documentType", "ppt"); + matchDocumentType5.put("match", documentType5); + should.add(matchDocumentType5); + break; + case "xls": + searchTextDocType += "documentType:\"xlsx\" OR documentType:\"xls\" OR "; + JSONObject matchDocumentType6 = new JSONObject(); + JSONObject documentType6 = new JSONObject(); + documentType6.put("documentType", "xlsx"); + matchDocumentType6.put("match", documentType6); + should.add(matchDocumentType6); + JSONObject matchDocumentType7 = new JSONObject(); + JSONObject documentType7 = new JSONObject(); + documentType7.put("documentType", "xls"); + matchDocumentType7.put("match", documentType7); + should.add(matchDocumentType7); + break; + case "txt": + searchTextDocType += "documentType:\"txt\" OR "; + JSONObject matchDocumentType8 = new JSONObject(); + JSONObject documentType8 = new JSONObject(); + documentType8.put("documentType", "txt"); + matchDocumentType8.put("match", documentType8); + should.add(matchDocumentType8); + break; + default: + break; + } + } + if (searchTextDocType.endsWith("OR ")) { + searchTextDocType = searchTextDocType.substring(0, searchTextDocType.length() - 4);// 去掉" OR " + } + searchTextDocType += ")"; + subBool1.put("should", should); + subBool1.put("minimum_should_match", 1); + mustDocType.put("bool", subBool1); + mustArray.add(mustDocType); + } else { + searchTextDocType += "documentType:\"docx\" OR documentType:\"doc\" OR documentType:\"wps\" OR "; + JSONObject matchDocumentType1 = new JSONObject(); + JSONObject documentType1 = new JSONObject(); + documentType1.put("documentType", "docx"); + matchDocumentType1.put("match", documentType1); + should.add(matchDocumentType1); + JSONObject matchDocumentType2 = new JSONObject(); + JSONObject documentType2 = new JSONObject(); + documentType2.put("documentType", "doc"); + matchDocumentType2.put("match", documentType2); + should.add(matchDocumentType2); + JSONObject matchDocumentType3 = new JSONObject(); + JSONObject documentType3 = new JSONObject(); + documentType3.put("documentType", "wps"); + matchDocumentType3.put("match", documentType3); + should.add(matchDocumentType3); + searchTextDocType += ")"; + subBool1.put("should", should); + subBool1.put("minimum_should_match", 1); + mustDocType.put("bool", subBool1); + mustArray.add(mustDocType); + } + bool.put("must", mustArray); + query.put("bool", bool); + queryBody.put("query", query); + paramsResult.put("searchText", queryBody.toString()); + paramsResult.put("highlight", true); + paramsResult.put("pageNo", passedModel.curPage); + paramsResult.put("pageSize", rowsPerPage); + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/advancedSearch"; + ResponseObject roResult = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, paramsResult); + if (roResult.isOk()) { + JSONArray newResultJA = new JSONArray(); + //String results = ((JSONObject) roResult.toJsonObject().get("data")).get("result").toString(); + String results = JSONObject.parseObject(roResult.toDataString()).getString("result"); + if (UtilString.isNotEmpty(results) && !results.equals("null")) { + JSONArray resultJA = JSONArray.parseArray(results); + CardCache cardCache = CardCache.getCache(); + FileCache fileCache = FileCache.getCache(); + PublishService publishService = new PublishService(); + + if (resultJA.size() == 0) {// 已经到达末页 + passedModel.hasNextPage = false; + } else { + if (resultJA.size() < rowsPerPage) { + passedModel.hasNextPage = false; + } + for (int i = 0; i < resultJA.size(); i++) { + try { + JSONObject resultJO = resultJA.getJSONObject(i); + String documentPath = resultJO.getString("documentPath"); + // 获取groupValue + String groupValueStartStr = KMSConstant.APP_ID + "/tmp/"; + int groupValueStartIdx = documentPath.indexOf(groupValueStartStr) + groupValueStartStr.length(); + String groupValue = documentPath.substring(groupValueStartIdx, documentPath.indexOf("/", groupValueStartIdx)); + // 获取fileValue + int fileValueStartIdx = groupValueStartIdx + groupValue.length() + 1; + String fileValue = documentPath.substring(fileValueStartIdx, documentPath.indexOf("/", fileValueStartIdx)); + FileModel fileModel = fileCache.get(fileValue); + /*if (fileModel == null || fileModel.getFileState() == 0 || fileModel.getFileSize() < 0) {// 老版本不显示 + continue; + }*/ + if (fileModel != null) { + if (fileModel.getFileState() == 0 || fileModel.getFileSize() < 0) { + continue; + } + CardModel cardModel = cardCache.get(groupValue); + + resultJO.put("fileName", fileModel.getFileName().replaceAll(searchText, "" + searchText + "")); + // + " v" + fileModel.getFileVer() + UserModel fileCreateUserModel = UserCache.getModel(fileModel.getCreateUser()); + resultJO.put("fileCreateUser", fileCreateUserModel == null ? fileModel.getCreateUser() : fileCreateUserModel.getUserName()); + resultJO.put("fileCreateTime", UtilDate.datetimeFormat(fileModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + resultJO.put("fileId", fileModel.getId()); + resultJO.put("createUserPhoto", SDK.getPortalAPI().getUserPhoto(me, fileModel.getCreateUser())); + resultJO.put("createUser", fileModel.getCreateUser()); + resultJO.put("securityName", KMSUtil.getUserSecurityName(cardModel.getSecurityLevel())); + resultJO.put("isExistAttachment", true); + } else if (UtilString.isNotEmpty(resultJO.getString("cardContent"))) {//知识简介不为空时检索的结果 + CardModel cardModel = cardCache.get(groupValue); + resultJO.put("fileName", cardModel.getCardName().replaceAll(searchText, "" + searchText + "")); + // + " v" + fileModel.getFileVer() + UserModel fileCreateUserModel = UserCache.getModel(cardModel.getCreateUser()); + resultJO.put("fileCreateUser", fileCreateUserModel == null ? cardModel.getCreateUser() : fileCreateUserModel.getUserName()); + resultJO.put("fileCreateTime", UtilDate.datetimeFormat(cardModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + resultJO.put("fileId", cardModel.getId()); + resultJO.put("createUserPhoto", SDK.getPortalAPI().getUserPhoto(me, cardModel.getCreateUser())); + resultJO.put("createUser", cardModel.getCreateUser()); + resultJO.put("securityName", KMSUtil.getUserSecurityName(cardModel.getSecurityLevel())); + + resultJO.put("isExistAttachment", false); + } + // 获取下载路径 + CardModel cardModel = cardCache.get(groupValue); + if (cardModel == null) { + continue; + } + resultJO.put("knwlId", groupValue); + resultJO.put("knwlName", cardModel.getCardName()); + resultJO.put("onlineLevel", cardModel.getOnlineLevel()); + resultJO.put("externalUrl", cardModel.getExternalUrl()); + // 判断知识权限 + // totalNum + + // DCContext dcContext = new DCContext(me, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + // dcContext.setFileNameShow(fileModel.getFileName()); + // resultJO.put("downloadURL", dcContext.getDownloadURL()); + // 维度路径(只展示第一个) + resultJO.put("dimensionPath", ""); + List publishModels = publishService.queryPublishByCardId(cardModel.getId()); + List dimensionModels = new ArrayList<>(); + if (publishModels.size() > 0) {// 知识发布状态 + // 循环所有发布的维度,查找出第一个有权限访问的维度,如果都没有权限则不显示该知识 + boolean permFlag = false; + for (PublishModel publishModel : publishModels) { + if (!KMSUtil.checkCardAC(publishModel.getCardId(), me.getUID())) { + continue; + } + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + // 维度未启用 + if (dimensionModel.getIsEnabled() != 1) { + continue; + } + // 过滤访问权限 + if (!isKnwlMgr && !KMSUtil.canAccessDimension(publishModel.getDimensionId(), me.getUID())) { + continue; + } + //不需要借阅 + if (!isKnwlMgr && KMSUtil.isNeedBorrow(publishModel.getDimensionId(), me.getUID())) { + continue; + } + // 如果不是此维度管理员 + // if (!KMSUtil.isDimensionManager(publishModel.getDimensionId(), me.getUID())) { + CardModel cardModel1 = CardCache.getCache().get(publishModel.getCardId()); + // 过滤有效期 + if (cardModel1.getValidDate() != null && (cardModel1.getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤密级控制 + if (!KMSUtil.checkSecurity(me.getUID(), cardModel1)) { + continue; + } + // } + // 过滤发布状态:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + + dimensionModels.add(dimensionModel); + while (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionModel = DimensionCache.getCache().get(dimensionModel.getParentId()); + dimensionModels.add(dimensionModel); + } + Collections.reverse(dimensionModels); + String dimensionPath = ""; + for (int j = 0; j < dimensionModels.size(); j++) { + if (j == dimensionModels.size() - 1) { + dimensionPath += dimensionModels.get(j).getDimensionName(); + } else { + dimensionPath += dimensionModels.get(j).getDimensionName() + " > "; + } + } + resultJO.put("dimensionPath", dimensionPath); + resultJO.put("cardName", cardModel1.getCardName().replaceAll(searchText, "" + searchText + "")); + permFlag = true; + break; + } + if (permFlag) { + newResultJA.add(resultJO); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } else { + passedModel.hasNextPage = false; + } + return newResultJA; + } else { + throw new AWSException(roResult.getMsg()); + } + + } + + /** + * 全文检索(搜索知识卡片) + * + * @param rowsPerPage 每页的行数 + * @return 检索结果JSON数组 + * @author wangshibao + */ + public JSONArray fullSearchByCard(UserContext me, int rowsPerPage, String searchText, PassedModel passedModel, boolean isKnwlMgr) { + String sourceAppId = KMSConstant.APP_ID; + AppAPI appAPI = SDK.getAppAPI(); + // 检索内容 + Map paramsResult = new HashMap(); + paramsResult.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX_CARD); + paramsResult.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE_CARD); + JSONObject queryBody = new JSONObject(); + JSONObject query = new JSONObject(); + JSONObject subBool = new JSONObject(); + JSONArray should1 = new JSONArray(); + JSONObject matchTitle = new JSONObject(); + JSONObject title = new JSONObject(); + JSONObject boostTitle = new JSONObject(); + boostTitle.put("query", boostTitle); + boostTitle.put("boost", 1); + title.put("title", searchText); + matchTitle.put("match_phrase", title); + should1.add(matchTitle); + JSONObject matchAbstract = new JSONObject(); + JSONObject abst = new JSONObject(); + JSONObject boostAbstract = new JSONObject(); + boostAbstract.put("query", searchText); + boostAbstract.put("boost", 10); + abst.put("abstract", boostAbstract); + matchAbstract.put("match_phrase", abst); + should1.add(matchAbstract); + subBool.put("should", should1); + subBool.put("minimum_should_match", 1); + query.put("bool", subBool); + queryBody.put("query", query); + paramsResult.put("searchText", queryBody.toString()); + paramsResult.put("pageNo", passedModel.curPage); + paramsResult.put("pageSize", rowsPerPage); + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/advancedSearch"; + ResponseObject roResult = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, paramsResult); + if (roResult.isOk()) { + JSONArray newResultJA = new JSONArray(); + //String results = ((JSONObject) roResult.toJsonObject().get("data")).get("result").toString(); + String results = JSONObject.parseObject(roResult.toDataString()).getString("result"); + if (UtilString.isNotEmpty(results) && !results.equals("null")) { + JSONArray resultJA = JSONArray.parseArray(results); + CardCache cardCache = CardCache.getCache(); + FileCache fileCache = FileCache.getCache(); + PublishService publishService = new PublishService(); + + if (resultJA.size() == 0) {// 已经到达末页 + passedModel.hasNextPage = false; + } else { + if (resultJA.size() < rowsPerPage) { + passedModel.hasNextPage = false; + } + for (int i = 0; i < resultJA.size(); i++) { + try { + JSONObject resultJO = resultJA.getJSONObject(i); + String documentId = resultJO.getString("documentId"); + CardModel cardModel = cardCache.get(documentId); + if (cardModel == null) { + continue; + } + resultJO.put("cardId", documentId); + resultJO.put("cardCreateUser", cardModel.getCreateUser()); + resultJO.put("cardCreateTime", UtilDate.datetimeFormat(cardModel.getCreateTime())); + resultJO.put("cardId", documentId); + String cardContent = ""; + if (resultJO.containsKey("abstract")) { + cardContent = resultJO.getString("abstract").replaceAll(searchText, "" + searchText + ""); + } + resultJO.put("cardContent", cardContent); + // 判断知识权限 + // 维度路径(只展示第一个) + resultJO.put("dimensionPath", ""); + List publishModels = publishService.queryPublishByCardId(cardModel.getId()); + List dimensionModels = new ArrayList<>(); + if (publishModels.size() > 0) {// 知识发布状态 + // 循环所有发布的维度,查找出第一个有权限访问的维度 + boolean permFlag = false; + for (PublishModel publishModel : publishModels) { + if (!KMSUtil.checkCardAC(publishModel.getCardId(), me.getUID())) { + continue; + } + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + // 维度未启用 + if (dimensionModel.getIsEnabled() != 1) { + continue; + } + // 过滤访问权限 + if (!isKnwlMgr && !(KMSUtil.canAccessDimension(publishModel.getDimensionId(), me.getUID()) && !KMSUtil.isNeedBorrow(publishModel.getDimensionId(), me.getUID()))) { + continue; + } + // 如果不是此维度管理员 + // if (!KMSUtil.isDimensionManager(publishModel.getDimensionId(), me.getUID())) { + CardModel cardModel1 = CardCache.getCache().get(publishModel.getCardId()); + // 过滤有效期 + if (cardModel1.getValidDate() != null && (cardModel1.getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤密级控制 + if (!KMSUtil.checkSecurity(me.getUID(), cardModel1)) { + continue; + } + // } + // 过滤发布状态:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + + dimensionModels.add(dimensionModel); + while (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionModel = DimensionCache.getCache().get(dimensionModel.getParentId()); + dimensionModels.add(dimensionModel); + } + Collections.reverse(dimensionModels); + String dimensionPath = ""; + for (int j = 0; j < dimensionModels.size(); j++) { + if (j == dimensionModels.size() - 1) { + dimensionPath += dimensionModels.get(j).getDimensionName(); + } else { + dimensionPath += dimensionModels.get(j).getDimensionName() + " > "; + } + } + resultJO.put("dimensionPath", dimensionPath); + resultJO.put("dimensionId", dimensionModel.getId()); + resultJO.put("cardName", cardModel1.getCardName().replaceAll(searchText, "" + searchText + "")); + permFlag = true; + break; + } + if (permFlag) { + resultJO.put("idNeedBorrow", false); + newResultJA.add(resultJO); + } else { + boolean borrowFlag = false; + //循环所有发布的维度,查找出第一个有借阅权限的维度 + for (PublishModel publishModel : publishModels) { + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + // 借阅权限 + if (!isKnwlMgr && !KMSUtil.isNeedBorrow(publishModel.getDimensionId(), me.getUID())) { + continue; + } + dimensionModels.add(dimensionModel); + while (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionModel = DimensionCache.getCache().get(dimensionModel.getParentId()); + dimensionModels.add(dimensionModel); + } + Collections.reverse(dimensionModels); + String dimensionPath = ""; + for (int j = 0; j < dimensionModels.size(); j++) { + if (j == dimensionModels.size() - 1) { + dimensionPath += dimensionModels.get(j).getDimensionName(); + } else { + dimensionPath += dimensionModels.get(j).getDimensionName() + " > "; + } + } + resultJO.put("dimensionPath", dimensionPath); + resultJO.put("dimensionId", dimensionModel.getId()); + resultJO.put("cardName", cardModel.getCardName().replaceAll(searchText, "" + searchText + "")); + borrowFlag = true; + break; + } + if (borrowFlag) {//显示有借阅权限的维度 + resultJO.put("idNeedBorrow", true); + newResultJA.add(resultJO); + } else {//显示第一个维度 + resultJO.put("idNeedBorrow", true); + for (PublishModel publishModel : publishModels) { + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + dimensionModels.add(dimensionModel); + while (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionModel = DimensionCache.getCache().get(dimensionModel.getParentId()); + dimensionModels.add(dimensionModel); + } + Collections.reverse(dimensionModels); + String dimensionPath = ""; + for (int j = 0; j < dimensionModels.size(); j++) { + if (j == dimensionModels.size() - 1) { + dimensionPath += dimensionModels.get(j).getDimensionName(); + } else { + dimensionPath += dimensionModels.get(j).getDimensionName() + " > "; + } + } + resultJO.put("dimensionPath", dimensionPath); + resultJO.put("dimensionId", dimensionModel.getId()); + resultJO.put("cardName", cardModel.getCardName().replaceAll(searchText, "" + searchText + "")); + break; + } + newResultJA.add(resultJO); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } else { + passedModel.hasNextPage = false; + } + return newResultJA; + } else { + throw new AWSException(roResult.getMsg()); + } + + } + + /** + * 删除全部索引 + * + * @return + */ + public ResponseObject deleteAllIndex() { + ResponseObject ro = ResponseObject.newOkResponse(); + AppAPI appAPI = SDK.getAppAPI(); + AppContext workbenchApp = appAPI.getAppContext(KMSConstant.APP_ID); + if (chargeAppCanUse(KMSConstant.APP_FULLSEARCH)) { + // 服务地址 + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/deleteAllIndex"; + Map params = new HashMap(); + try { + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + ro = appAPI.callASLP(workbenchApp, aslp, params); + } catch (Exception e) { + e.printStackTrace(); + ro.err(e.getMessage()); + } + } + return ro; + } + + public static ArrayList getChildDept(String deptID,ArrayList deptIDList) { + deptIDList.add(deptID); + Object[] sqlParams = new Object[]{}; + sqlParams = new Object[]{deptID}; + List subDeptMaps = DBSql.getMaps("SELECT ID FROM ORGDEPARTMENT WHERE PARENTDEPARTMENTID=?",sqlParams); + if (null!=subDeptMaps && !subDeptMaps.isEmpty()) { + for (RowMap subDeptMap : subDeptMaps) { + deptID = subDeptMap.getString("ID"); + getChildDept(deptID,deptIDList); + } + } + return deptIDList; + } + + public boolean chargeAppCanUse(String appId) { + AppAPI appAPI = SDK.getAppAPI(); + AppContext appCtx = appAPI.getAppContext(appId); + if (appCtx != null && SDK.getAppAPI().isActive(appCtx)) { + return true; + } else { + return false; + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/VersionService.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/VersionService.java new file mode 100644 index 00000000..a0ee0097 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/service/VersionService.java @@ -0,0 +1,106 @@ +package com.actionsoft.apps.kms.service; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.VersionCache; +import com.actionsoft.apps.kms.dao.VersionDao; +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.exception.AWSException; + +/** + * 版本号 + * + * @author wangshibao + */ +public class VersionService { + + /** + * 查询版本号列表 + * + * @return 版本号模型的List + * @author wangshibao + */ + public List queryVersions() { + List versionModels = new ArrayList<>(); + VersionCache versionCache = VersionCache.getCache(); + Iterator versionIterator = versionCache.iteratorSorted(new Comparator() { + @Override + public int compare(VersionModel o1, VersionModel o2) { + double result = Double.parseDouble(o1.getVersionNo()) - Double.parseDouble(o2.getVersionNo()); + if (result > 0) { + return 1; + } else if (result < 0) { + return -1; + } else { + return 0; + } + } + }); + while (versionIterator.hasNext()) { + VersionModel versionModel = versionIterator.next(); + versionModels.add(versionModel); + } + return versionModels; + } + + /** + * 新建版本号 + * + * @param versionNo 版本号 + * @param memo 版本描述 + * @return 是否新建成功 + */ + public boolean addVersion(String versionNo, String memo, String uid) { + VersionDao versionDao = new VersionDao(); + VersionModel versionModel = new VersionModel(); + versionModel.setCreateTime(new Timestamp(System.currentTimeMillis())); + String id = UUIDGener.getObjectId(); + versionModel.setId(id); + versionModel.setMemo(memo); + versionModel.setVersionNo(versionNo); + versionModel.setCreateUser(uid); + int result = versionDao.insert(versionModel); + if (result == 1) { + return true; + } else { + return false; + } + } + + /** + * 删除版本号 + * + * @param versionIdArr 版本号数组 + * @return 是否删除成功 + * @author wangshibao + */ + public boolean deleteVersion(String[] versionIdArr) { + if (versionIdArr == null || versionIdArr.length == 0) { + throw new AWSException("版本号不允许为空"); + } + String sql = "DELETE FROM " + KMSConstant.ENTITY_NAME_VERSION + " WHERE " + VersionModel.ID + " IN ("; + for (int i = 0; i < versionIdArr.length; i++) { + sql += "?,"; + } + sql = sql.substring(0, sql.length() - 1); + sql += ")"; + int result = DBSql.update(sql, versionIdArr); + if (result == versionIdArr.length) { + // 更新缓存 + VersionCache versionCache = VersionCache.getCache(); + for (String versionId : versionIdArr) { + versionCache.remove(versionId); + } + return true; + } else { + return false; + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ui/FormUIComponentKnwlImpl.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ui/FormUIComponentKnwlImpl.java new file mode 100644 index 00000000..6321fd79 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/ui/FormUIComponentKnwlImpl.java @@ -0,0 +1,259 @@ +package com.actionsoft.apps.kms.ui; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.bpms.bo.design.cache.BOCache; +import com.actionsoft.bpms.bo.design.model.BOItemModel; +import com.actionsoft.bpms.bo.design.model.BOModel; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.ui.base.AbstractUIComponent; +import com.actionsoft.bpms.ui.base.UIContext; +import com.actionsoft.bpms.util.Html; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author wangshibao + * Created on 2017-5-4 + */ +public class FormUIComponentKnwlImpl extends AbstractUIComponent { + public FormUIComponentKnwlImpl(UIContext uiContext) { + super(uiContext); + } + + @Override + public String getCustomUIJoinScript(UIContext context) { + return ""; + } + + @Override + public String getInitScript(UIContext uiContext, boolean readonly) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + if (!readonly) { + return "initKnwlUI('" + boItemModel.getName() + "')"; + } else { + return ""; + } + } + + @Override + public String getUI(UIContext uiContext, boolean readonly) { + StringBuilder html = new StringBuilder(); + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + if (!readonly) { + html.append(""); + + JSONArray valueJA = new JSONArray(); + // ProcessInstance processInstance = uiContext.getProcessInstance(); + // if (processInstance != null) {//表单模拟预览时,流程实例为空 + // String value = (String) SDK.getBOAPI().getByProcess(boModel.getName(), processInstance.getId(), boItemModel.getName()); + String value = uiContext.getValue(); + if (!UtilString.isEmpty(value)) { + List knwlIdList = JSONArray.parseArray(value, String.class); + for (String knwlId : knwlIdList) { + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel != null) { + JSONObject valueJO = new JSONObject(); + valueJO.put("id", knwlId); + valueJO.put("cardName", cardModel.getCardName()); + valueJA.add(valueJO); + } + } + } + // } + html.append(""); + + StringBuilder isNull = new StringBuilder(); + if (!boItemModel.isNullable() && !readonly) { + isNull.append("").append(html.toString()).append(""); + return isNull.toString(); + } + } else { + // ProcessInstance processInstance = uiContext.getProcessInstance(); + // String value = (String) SDK.getBOAPI().getByProcess(boModel.getName(), processInstance.getId(), boItemModel.getName()); + String value = uiContext.getValue(); + String showValue = ""; + if (!UtilString.isEmpty(value)) { + List knwlIdList = JSONArray.parseArray(value, String.class); + for (String knwlId : knwlIdList) { + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel != null) { + showValue += cardModel.getCardName() + ","; + } + } + } + if (showValue.endsWith(",")) { + showValue = showValue.substring(0, showValue.length() - ",".length()); + } + html.append(getHiddenUI(uiContext)); + html.append(""); + return html.toString(); + } + return html.toString(); + } + + @Override + public String getValidateScript(UIContext uiContext, boolean readonly) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + StringBuilder js = new StringBuilder(); + js.append("function(){"); + js.append(" var dom" + boItemModel.getName() + " = $('#" + boItemModel.getName() + "');\n");//select的jquery对象 + js.append(" var dom" + boItemModel.getName() + "Parent = $('#" + boItemModel.getName() + "').parent();\n");//span.required的jquery对象,方便在正确的位置错误提示,如果显示在select上则过高 + js.append(" var dom" + boItemModel.getName() + "Label = $('#" + boItemModel.getName() + "Label').text();\n");//对应的label的文本,用于错误提示 + js.append(" if (dom" + boItemModel.getName() + ".parent().is(\"span\") && dom" + boItemModel.getName() + ".parent().hasClass(\"required\")) {\n"); + js.append(" if(dom" + boItemModel.getName() + ".val() == null || dom" + boItemModel.getName() + ".val() == ''){\n"); + js.append(" \n"); + js.append(" UIValidate.pushInfo({checkNull:true,itemName:'" + boItemModel.getName() + "',tableName:'" + boModel.getName() + "',isBreak:true,msg:'[" + boItemModel.getTitle() + "]不允许为空'});\n"); + js.append(" return false;\n"); + js.append(" }else{\n"); + js.append(" return true\n"); + js.append(" }\n"); + js.append(" }\n"); + js.append("}();"); + return js.toString(); + } + + @Override + public String getGridDisplayHtmlValue(UIContext uiContext, boolean readonly, String eventStart, String eventEnd) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + StringBuilder html = new StringBuilder(); + ProcessInstance processInstance = uiContext.getProcessInstance(); + // String value = (String) SDK.getBOAPI().getByProcess(boModel.getName(), processInstance.getId(), boItemModel.getName()); + String value = uiContext.getValue(); + String showValue = ""; + if (!UtilString.isEmpty(value)) { + List knwlIdList = JSONArray.parseArray(value, String.class); + for (String knwlId : knwlIdList) { + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel != null) { + showValue += cardModel.getCardName() + ","; + } + } + } + if (showValue.endsWith(",")) { + showValue = showValue.substring(0, showValue.length() - ",".length()); + } + html.append(showValue); + + return html.toString(); + } + + @Override + public String getEditGridUIEditorFn(UIContext uiContext, boolean readonly) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + + StringBuilder functionEditor = new StringBuilder(""); + Map params = new HashMap<>(); + params.put("boDefName", boModel.getName()); + params.put("boItemDefName", boItemModel.getName()); + params.put("uiId", boItemModel.getComponentId()); + params.put("uiSetting", Html.toJSObj(boModel.getName() + ".getColumnConfig('" + boItemModel.getName() + "')")); + params.put("componentExtendCode", ""); + params.put("tooltip", SDK.getRuleAPI().executeAtScript(boItemModel.getTooltip(), getContext())); + + ProcessInstance processInstance = uiContext.getProcessInstance(); + + List boList = SDK.getBOAPI().query(boModel.getName()).bindId(processInstance.getId()).list(); + JSONObject initKnwlJO = new JSONObject(); + for (BO bo : boList) { + String value = bo.getString(boItemModel.getName()); + JSONArray valueJA = new JSONArray(); + if (!UtilString.isEmpty(value)) { + List knwlIdList = JSONArray.parseArray(value, String.class); + for (String knwlId : knwlIdList) { + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel != null) { + JSONObject valueJO = new JSONObject(); + valueJO.put("id", knwlId); + valueJO.put("cardName", cardModel.getCardName()); + valueJA.add(valueJO); + } + } + } + initKnwlJO.put(bo.getId(), valueJA); + } + params.put("initKnwlJO", initKnwlJO.toString()); + functionEditor.append(HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.ui.editgrid.edit.htm", params)); + + return functionEditor.toString(); + } + + @Override + public String getEditGridUIRenderFn(UIContext uiContext, boolean readonly) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + ProcessInstance processInstance = uiContext.getProcessInstance(); + + List boList = SDK.getBOAPI().query(boModel.getName()).bindId(processInstance.getId()).list(); + JSONObject showValueJO = new JSONObject(); + for (BO bo : boList) { + String value = bo.getString(boItemModel.getName()); + String showValue = ""; + if (!UtilString.isEmpty(value)) { + List knwlIdList = JSONArray.parseArray(value, String.class); + for (String knwlId : knwlIdList) { + CardModel cardModel = CardCache.getCache().get(knwlId); + if (cardModel != null) { + showValue += cardModel.getCardName() + ","; + } + } + } + if (showValue.endsWith(",")) { + showValue = showValue.substring(0, showValue.length() - ",".length()); + } + showValueJO.put(bo.getId(), showValue); + } + StringBuilder functionEditor = new StringBuilder(""); + Map params = new HashMap<>(); + params.put("boDefName", boModel.getName()); + params.put("boItemDefName", boItemModel.getName()); + params.put("uiId", boItemModel.getComponentId()); + params.put("uiSetting", Html.toJSObj(boModel.getName() + ".getColumnConfig('" + boItemModel.getName() + "')")); + params.put("readonly", readonly); + params.put("showValueJO", showValueJO.toString()); + + functionEditor.append(HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.ui.editgrid.render.htm", params)); + return functionEditor.toString(); + } + + @Override + public String getEditGridUIGetEditCellDataFn(UIContext uiContext, boolean readonly) { + BOItemModel boItemModel = uiContext.getBoItemModel(); + BOModel boModel = BOCache.getInstance().getModel(boItemModel.getBoModelId()); + + StringBuilder functionEditor = new StringBuilder(""); + Map params = new HashMap<>(); + params.put("boDefName", boModel.getName()); + params.put("boItemDefName", boItemModel.getName()); + params.put("uiId", boItemModel.getComponentId()); + params.put("uiSetting", Html.toJSObj(boModel.getName() + ".getColumnConfig('" + boItemModel.getName() + "')")); + + functionEditor.append(HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.ui.editgrid.geteditcell.htm", params)); + + return functionEditor.toString(); + } + + @Override + public String getConfigWebPage(UIContext context) { + return ""; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/AddonsWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/AddonsWeb.java new file mode 100644 index 00000000..4257b2c7 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/AddonsWeb.java @@ -0,0 +1,65 @@ +package com.actionsoft.apps.kms.web; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.bpms.commons.addons.AddOnsInterface; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.security.ac.AccessControlAPI; +import com.actionsoft.bpms.commons.security.ac.cache.AccessControlCache; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.server.UserContext; + +/** + * 由于删除维度的时候,未删除ac,此addons页面用于一次性删除历史冗余ac + * + * @author willard + * Created on 2017/10/10 + */ +public class AddonsWeb extends ActionWeb implements AddOnsInterface { + + @Override + public String mainPage(UserContext context) { + Map macroLibraries = new HashMap<>(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("count", removeRedundancyDimensionAC()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.addons.htm", macroLibraries); + } + + /** + * 获取维度的重复ac列表 + * + * @return + */ + private int removeRedundancyDimensionAC() { + List dimensionIdList = new ArrayList<>(); + Iterator dimensionIterator = DimensionCache.getCache().iterator(); + while (dimensionIterator.hasNext()) { + DimensionModel next = dimensionIterator.next(); + dimensionIdList.add(next.getId()); + } + + Iterator acIterator = AccessControlCache.getACList(DimensionMgrACCM.resourceType); + List acIdList = new ArrayList<>(); + while (acIterator.hasNext()) { + AccessControlModel next = acIterator.next(); + String _resourceId = next._resourceId; + if (!dimensionIdList.contains(_resourceId)) {//如果该资源不在维度ID的list中,则是无效的 + //加入删除集合 + acIdList.add(next._id); + } + } + for (String acId : acIdList) { + AccessControlAPI.getInstance().removeACResource(acId); + } + return acIdList.size(); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/FavoriteWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/FavoriteWeb.java new file mode 100644 index 00000000..cbcace0d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/FavoriteWeb.java @@ -0,0 +1,41 @@ +package com.actionsoft.apps.kms.web; + +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; + +/** + * 绑定应用扩展点-我的收藏 + * + * @author wangshibao + */ +public class FavoriteWeb extends ActionWeb { + public FavoriteWeb() { + super(); + } + + public FavoriteWeb(UserContext uc) { + super(uc); + } + + /** + * 查看收藏的信息 + * + * @return + */ + public String getHome(String title, String favoriteId) { + return new KnwlCenterWeb(getContext()).openBrowseCardPage(favoriteId, true); + } + + /** + * 取消收藏 + * + * @param title + * @param favoriteId + * @return + */ + public String cancel(String title, String favoriteId) { + return ResponseObject.newOkResponse().toString(); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlCenterWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlCenterWeb.java new file mode 100644 index 00000000..a9adeacd --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlCenterWeb.java @@ -0,0 +1,3014 @@ +package com.actionsoft.apps.kms.web; + +import com.actionsoft.apps.AppsConst; +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSLogUtil; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.cache.*; +import com.actionsoft.apps.kms.dao.CardDao; +import com.actionsoft.apps.kms.dao.FileDao; +import com.actionsoft.apps.kms.dao.PublishDao; +import com.actionsoft.apps.kms.model.*; +import com.actionsoft.apps.kms.service.*; +import com.actionsoft.apps.lifecycle.log.AppsLogger; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.bpms.bo.engine.BOEngineInterface; +import com.actionsoft.bpms.bpmn.constant.TaskRuntimeConst; +import com.actionsoft.bpms.bpmn.constant.UserTaskRuntimeConst; +import com.actionsoft.bpms.bpmn.engine.cache.ProcessDefCache; +import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionTrack; +import com.actionsoft.bpms.bpmn.engine.model.def.ProcessDefinition; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance; +import com.actionsoft.bpms.bpmn.engine.model.run.delegate.TaskInstance; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.htmlframework.AlertWindow; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.security.high.constant.SecurityLevelConst; +import com.actionsoft.bpms.form.engine.FormAPIManager; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.DispatcherRequest; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.server.fs.dc.DCUtil; +import com.actionsoft.bpms.util.*; +import com.actionsoft.exception.*; +import com.actionsoft.i18n.I18nRes; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.actionsoft.sdk.local.api.PortalAPI; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.IOUtils; + +import java.io.*; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.Date; +import java.sql.Timestamp; +import java.util.*; + +/** + * 知识中心(KMS前台)web类 + * + * @author wangshibao + */ +public class KnwlCenterWeb extends ActionWeb { + private final static String versionMatchRuleMonth = "^[1-9]\\.([1-9]{1}|[1-9]{1}[0-9]{1})\\.([1-9]{1}|[1-9]{1}[0-9]{1}|[1-9]{1}[0-9]{1}[0-9]{1})$"; + private final static String versionMatchRuleRC = "^[1-9]\\.([1-9]{1}|[1-9]{1}[0-9]{1})\\.RC([1-9]{1}|[1-9]{1}[0-9]{1})$"; + private static String[] exts = { ".doc", ".docx", ".wps", ".rtf", ".ppt", ".pptx", ".dps", ".pdf", ".txt", ".java", ".js", ".css", ".sh", ".bat", ".html", ".htm", ".jpg", ".png", ".bmp", ".gif", "jpeg" }; + + public KnwlCenterWeb(UserContext me) { + super(me); + } + + /** + * 知识中心和知识检索的home页 + * + * @param page + * @return + * @author wangshibao + */ + public String getKnwlHome(String page) { + Map macroLibraries = new HashMap(); + + boolean hasKnwlCenterNavPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_KNWL_CENTER); + boolean hasKnwlSearchPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_KNWL_SEARCH); + if (!hasKnwlCenterNavPerm && !hasKnwlSearchPerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + + macroLibraries.put("hasKnwlCenterNavPerm", hasKnwlCenterNavPerm); + macroLibraries.put("hasKnwlSearchPerm", hasKnwlSearchPerm); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("page", page); + + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + macroLibraries.put("appId", this.getAppId()); + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl.iframe.htm", macroLibraries); + } + + /** + * 知识中心home页 + * + * @return html + * @author wangshibao + */ + public String getKnwlCenterHome() { + // 判断菜单权限 + boolean hasNavPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_KNWL_CENTER); + if (!hasNavPerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + // 查询个数(我的知识 我发布的 我借阅的) + long meCount = 0; + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (getContext().getUID().equals(cardModel.getCreateUser())) { + meCount++; + } + } + + long publishCount = 0; + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (getContext().getUID().equals(publishModel.getPublishUser())) { + publishCount++; + } + } + + long borrowCount = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).addQuery("APPLYUSER=", getContext().getUID()).count(); + + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("uid", super.getContext().getUID()); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + macroLibraries.put("meCount", meCount); + macroLibraries.put("publishCount", publishCount); + macroLibraries.put("borrowCount", borrowCount); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + if (DispatcherRequest.getContext() != null) { + macroLibraries.put("appId", DispatcherRequest.getContext().getAppContext().getId()); + } + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_center.htm", macroLibraries); + } + + public String getKnowladgeCount() { + ResponseObject rs = ResponseObject.newOkResponse(); + boolean showFavorite = false; + String appId = "com.actionsoft.apps.favorite"; + AppContext hwsignatureContext = SDK.getAppAPI().getAppContext(appId); + if (hwsignatureContext != null && SDK.getAppAPI().isActive(hwsignatureContext)) { + showFavorite = true; + } + rs.put("showFavorite", showFavorite); + // 判断菜单权限 + boolean hasNavPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_KNWL_CENTER); + if (!hasNavPerm) { + rs.msg("no permise"); + return rs.toString(); + } + // 查询个数(我的知识 我发布的 我借阅的) + long meCount = 0; + CardCache cardCache = CardCache.getCache(); + Iterator cardIterator = cardCache.iterator(); + while (cardIterator.hasNext()) { + CardModel cardModel = cardIterator.next(); + if (getContext().getUID().equals(cardModel.getCreateUser())) { + meCount++; + } + } + + long publishCount = 0; + PublishCache publishCache = PublishCache.getCache(); + Iterator publishIterator = publishCache.iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (getContext().getUID().equals(publishModel.getPublishUser())) { + publishCount++; + } + } + BorrowService borrowService = new BorrowService(); + List bos = borrowService.queryBorrow(getContext().getUID(), 1, 10000, "CREATEDATE", "down", ""); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + int rowsPerPage = systemParamJO.getInteger("gridRowPP"); + rs.put("rowsPerPage", rowsPerPage); + rs.put("borrowCount", bos.size()); + rs.put("publishCount", publishCount); + rs.put("meCount", meCount); + return rs.toString(); + } + public String openBrowseCardPage(String cardId, boolean isPage) { + return openBrowseCardPage("", cardId, isPage) ; + } + /** + * 打开浏览知识页面 + * + * @param cardId + * @return + * @author wangshibao + */ + public String openBrowseCardPage(String dimensionId,String cardId, boolean isPage) { + if(UtilString.isNotEmpty(dimensionId)){ + boolean hasPerm = false; + boolean isKnwlMgr = KMSUtil.isKnwlManager(super.getContext().getUID()); + CardModel cardModel = CardCache.getCache().get(cardId); + if (isKnwlMgr || (KMSUtil.checkCardAC(cardId, this.getContext().getUID()) && KMSUtil.canAccessDimension(dimensionId, this.getContext().getUID()) && !KMSUtil.isNeedBorrow(dimensionId,this.getContext().getUID()))) { + hasPerm = true; + } + if (!hasPerm) { + if (cardModel.getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + } + } + if(!hasPerm){ + throw new AWSForbiddenException("您无权限阅读此文件"); + } + } + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("uid", super.getContext().getUID()); + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + macroLibraries.put("cardId", cardId); + macroLibraries.put("isPage", isPage); + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + boolean isMobile = this.getContext().isMobileClient(); + if (isMobile) { + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.browsecard.mobile.htm", macroLibraries); + } else { + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.browsecard.iframe.htm", macroLibraries); + } + } + + /** + * 知识中心-个人-我的知识-查询知识列表 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return JSON + */ + public String getMeCardListJson(int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray cardJA = new JSONArray(); + CardService cardService = new CardService(); + try { + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + filter = URLDecoder.decode(filter, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + OptService optService = new OptService(); + List cardModels = cardService.queryMyCards(super.getContext(), curPage, rowsPerPage, sortIndx, sortDir, filter); + for (CardModel cardModel : cardModels) { + try { + JSONObject cardJO = new JSONObject(); + cardJO.put("cardId", cardModel.getId()); + cardJO.put("cardName", cardModel.getCardName()); + cardJO.put("myKnowlage", true); + cardJO.put("cardType", cardModel.getCardType()); + cardJO.put("onlineLevel", cardModel.getOnlineLevel()); + cardJO.put("securityLevel", cardModel.getSecurityLevel()); + cardJO.put("lastUpdate", cardModel.getLastUpdate()); + cardJO.put("readCount", cardModel.getReadCount()); + cardJO.put("commentCount", optService.getCommentCount(cardModel.getId())); + cardJO.put("isPublished", cardModel.getIsPublished()); + cardJO.put("createTime", UtilDate.datetimeFormat(cardModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("validDate", UtilDate.dateFormat(cardModel.getValidDate())); + cardJO.put("createUser", cardModel.getCreateUser()); + cardJO.put("isComment", cardModel.getIsComment()); + cardJO.put("isRate", cardModel.getIsRate()); + cardJO.put("rdoSL", KMSUtil.getSecurityLevelLabel(cardModel.getSecurityLevel())); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.replaceSessionId(this.getContext(), cardService.getCardContent(dc)); + } else { + cardContext = cardService.replaceSessionId(this.getContext(), cardContext); + } + cardJO.put("cardContext", cardContext); + // UserModel createUserModel = UserCache.getModel(cardModel.getCreateUser()); + // String cardEditInfo = "创建人:"+createUserModel==null?cardModel.getCreateUser():createUserModel.getUserName()+"("+UtilDate.datetimeFormat(cardModel.getCreateTime(), "yyyy-MM-dd HH:mm")+")"; + // if(cardModel.getLastUpdate()!=null){ + // UserModel editUserModel = UserCache.getModel(cardModel.get()); + // cardEditInfo+=" 修改人:()"; + // } + // cardJO.put("cardEditInfo", ""); + + cardJA.add(cardJO); + } catch (Exception e) { + e.printStackTrace(); + } + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", cardJA); + dataJson.put("totalRecords", cardService.totalRecords); + dataJson.put("curPage", curPage); + dataJson.put("rowsPerPage", rowsPerPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 知识中心-个人-我发布的-查询列表 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return JSON + * @author wangshibao + */ + public String getPublishListJson(int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray publishJA = new JSONArray(); + PublishService publishService = new PublishService(); + CardService cardService = new CardService(); + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + try { + filter = URLDecoder.decode(filter, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + DimensionService dimensionService = new DimensionService(); + List publishModels = publishService.queryMyPublish(super.getContext().getUID(), curPage, rowsPerPage, sortIndx, sortDir, filter); + for (PublishModel publishModel : publishModels) { + try { + JSONObject publishJO = new JSONObject(); + publishJO.put("publishId", publishModel.getId()); + publishJO.put("cardId", publishModel.getCardModel() != null ? publishModel.getCardModel().getId() : ""); + publishJO.put("cardName", publishModel.getCardModel() != null ? publishModel.getCardModel().getCardName() : ""); + publishJO.put("cardType", publishModel.getCardModel() != null ? publishModel.getCardModel().getCardType() : ""); + publishJO.put("onlineLevel", publishModel.getCardModel() != null ? publishModel.getCardModel().getOnlineLevel() : ""); + publishJO.put("securityLevel", publishModel.getCardModel() != null ? publishModel.getCardModel().getSecurityLevel() : ""); + publishJO.put("validDate", publishModel.getCardModel() != null ? UtilDate.dateFormat(publishModel.getCardModel().getValidDate()) : ""); + publishJO.put("isComment", publishModel.getCardModel() != null ? publishModel.getCardModel().getIsComment() : false); + publishJO.put("isRate", publishModel.getCardModel() != null ? publishModel.getCardModel().getIsRate() : false); + publishJO.put("readCount", publishModel.getCardModel() != null ? publishModel.getCardModel().getReadCount() : 0); + publishJO.put("commentCount", publishModel.getCardModel() != null ? publishModel.getCardModel().getCommentCount() : 0); + publishJO.put("dimensionId", publishModel.getDimensionId()); + publishJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + publishJO.put("dimensionName", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + publishJO.put("dimensionPath", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + publishJO.put("showType", publishModel.getDimensionModel().getShowType()); + publishJO.put("rdoSL", publishModel.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModel.getCardModel().getSecurityLevel()) : ""); + String cardContext = ""; + if (publishModel.getCardModel() != null) { + cardContext = publishModel.getCardModel().getCardContext(); + if (UtilString.isEmpty(cardContext) || publishModel.getCardModel().getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, publishModel.getCardModel().getCreateUser(), publishModel.getCardModel().getId(), publishModel.getCardModel().getId()); + cardContext = cardService.replaceSessionId(this.getContext(), cardService.getCardContent(dc)); + } else { + cardContext = cardService.replaceSessionId(this.getContext(), cardContext); + } + } + + publishJO.put("cardContext", cardContext); + String examineInfo = publishModel.getExamineInfo(); + if (!UtilString.isEmpty(examineInfo)) { + JSONObject examineInfoJO = JSONObject.parseObject(examineInfo); + String processInstId = examineInfoJO.getString("processInstId"); + String publishStatus = examineInfoJO.getString("status"); + publishJO.put("processInstId", processInstId); + publishJO.put("publishStatus", publishStatus); + } else { + publishJO.put("publishStatus", "无需审批"); + } + + publishJA.add(publishJO); + } catch (Exception e) { + e.printStackTrace(); + } + } + SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).addQuery("APPLYUSER=", getContext().getUID()); + JSONObject dataJson = new JSONObject(); + dataJson.put("data", publishJA); + dataJson.put("totalRecords", publishService.totalRecordsPublish); + dataJson.put("curPage", curPage); + dataJson.put("rowsPerPage", rowsPerPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 知识中心-个人-我借阅的-查询列表 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return JSON + * @author wangshibao + */ + public String getBorrowListJson(int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray borrowJA = new JSONArray(); + BorrowService borrowService = new BorrowService(); + try { + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + filter = URLDecoder.decode(filter, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + List bos = borrowService.queryBorrow(super.getContext().getUID(), curPage, rowsPerPage, sortIndx, sortDir, filter); + + java.util.Date today = new java.util.Date(); + Timestamp lastMillOfLastDay = new Timestamp(UtilDate.parse(UtilDate.getYear(today) + "-" + UtilDate.getMonth(today) + "-" + UtilDate.getDay(today)).getTime() - 1); + for (BO bo : bos) { + JSONObject borrowJO = new JSONObject(); + borrowJO.put("boId", bo.get(BOEngineInterface.ID, String.class)); + borrowJO.put("ISEND", bo.get(BOEngineInterface.ISEND, Integer.class)); + borrowJO.put("CARDNAME", bo.get("CARDNAME", String.class)); + borrowJO.put("CREATEDATE", UtilDate.datetimeFormat(bo.get("CREATEDATE", Timestamp.class), "yyyy-MM-dd HH:mm")); + borrowJO.put("publishTime", UtilDate.datetimeFormat(bo.get("CREATEDATE", Timestamp.class), "yyyy-MM-dd HH:mm")); + int TIMES = bo.get("TIMES") != null ? (bo.get("TIMES", Integer.class)) : 0; + int READTIMES = (bo.get("READTIMES") != null && !bo.get("READTIMES").equals("")) ? (bo.get("READTIMES", Integer.class)) : 0; + boolean isEndDate = bo.get("ENDDATE") != null ? (bo.get("ENDDATE", Timestamp.class) != null ? (bo.get("ENDDATE", Timestamp.class).compareTo(lastMillOfLastDay) > 0 ? false : true) : false) : false; + borrowJO.put("TIMES", TIMES); + borrowJO.put("READTIMES", READTIMES); + borrowJO.put("ENDDATE", UtilDate.dateFormat(bo.get("ENDDATE", Timestamp.class))); + borrowJO.put("isEndDate", isEndDate); + borrowJO.put("CARDID", bo.get("CARDID", String.class)); + borrowJO.put("STATUS", bo.get("STATUS", String.class)); + String CONTROLTYPE = bo.get("CONTROLTYPE", String.class); + borrowJO.put("CONTROLTYPE", CONTROLTYPE); + borrowJO.put("DIMENSIONID", bo.get("DIMENSIONID", String.class)); + borrowJO.put("cardId", bo.get("CARDID", String.class)); + CardModel cardModel = CardCache.getCache().get(bo.get("CARDID", String.class)); + boolean readFlag = true;//只读 + if ("同意".equals(bo.get("STATUS", String.class))) { + if ("限制阅读次数".equals(CONTROLTYPE)) { + if (READTIMES < TIMES) { + readFlag = false; + } + } else if ("限制有效日期".equals(CONTROLTYPE)) { + readFlag = isEndDate; + } + } + borrowJO.put("readFlag", readFlag); + if (cardModel != null) { + borrowJO.put("cardName", cardModel.getCardName()); + borrowJO.put("cardType", cardModel.getCardType()); + borrowJO.put("onlineLevel", cardModel.getOnlineLevel()); + borrowJO.put("securityLevel", cardModel.getSecurityLevel()); + borrowJO.put("validDate", cardModel.getValidDate()); + borrowJO.put("isComment", cardModel.getIsComment()); + borrowJO.put("isRate", cardModel.getIsRate()); + borrowJO.put("readCount", cardModel.getReadCount()); + borrowJO.put("commentCount", cardModel.getCommentCount()); + } + borrowJO.put("dimensionId", bo.get("DIMENSIONID", String.class)); + borrowJA.add(borrowJO); + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", borrowJA); + dataJson.put("totalRecords", borrowService.totalRecords); + dataJson.put("curPage", curPage); + dataJson.put("rowsPerPage", rowsPerPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 知识中心-个人-发布待审-查询列表 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return JSON + * @author wangshibao + */ + public String getPublishExamineListJson(int curPage, int rowsPerPage) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + Connection conn = null; + try { + conn = DBSql.open(); + JSONArray publishExamineJA = new JSONArray(); + PublishService publishService = new PublishService(); + List bos = publishService.queryMyPublishExamine(conn, super.getContext().getUID(), curPage, rowsPerPage); + for (BO bo : bos) { + String cardIds = bo.get("CARDIDS", String.class); + JSONArray cardIdJA = JSONArray.parseArray(cardIds); + for (int i = 0; i < cardIdJA.size(); i++) { + JSONObject publishExamineO = new JSONObject(); + publishExamineO.put("ISEND", bo.get(BOEngineInterface.ISEND, Integer.class)); + publishExamineO.put("CARDID", cardIdJA.getString(i)); + publishExamineO.put("CARDNAME", CardCache.getCache().get(cardIdJA.getString(i)).getCardName()); + publishExamineO.put("DIMENSIONNAME", bo.get("DIMENSIONNAME", String.class)); + publishExamineO.put("STATUS", bo.get("STATUS", String.class)); + + publishExamineJA.add(publishExamineO); + } + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", publishExamineJA); + dataJson.put("totalRecords", publishService.totalRecordsPublishExamine); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + } finally { + DBSql.close(conn); + } + return responseObject.toString(); + } + + /** + * 知识中心-全部-获取维度树json + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionTreeJson(String parentId, boolean isDimensionKnwlPage) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + try { + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + if (isDimensionKnwlPage) {// 单个维度页面(独立部署) + DimensionModel dimensionModel = DimensionCache.getCache().get(parentId); + fillDimensionTree(dimensionService, dimensionJA, dimensionModel, isDimensionKnwlPage, isKnwlMgr); + } else { + List dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + fillDimensionTree(dimensionService, dimensionJA, dimensionModel, isDimensionKnwlPage, isKnwlMgr); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 知识中心-全部-获取维度树json + * + * @param key 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionByName(String key) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + try { + List dimensionModels = dimensionService.queryTreeAccessDimensionsByName(key); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + fillDimensionTree(dimensionService, dimensionJA, dimensionModel, false, false); + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + private void fillDimensionTree(DimensionService dimensionService, JSONArray dimensionJA, DimensionModel dimensionModel, boolean isDimensionKnwlPage, boolean isKnwlMgr) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("showType", dimensionModel.getShowType()); + if (!isDimensionKnwlPage && !UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + dimensionJO.put("name", dimensionModel.getDimensionName()); + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (dimensionService.isExistChildForQueryTreeAccessDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeHotspot-noPerm"); + } + } + + dimensionJA.add(dimensionJO); + } + } + + public boolean hasRepeatDimension(JSONArray dimensions, DimensionModel dimensionModel) { + for (int i = 0; i < dimensions.size(); i++) { + JSONObject dimensionJO = dimensions.getJSONObject(i); + if (dimensionModel.getId().equals(dimensionJO.getString("id"))) { + return true; + } + } + return false; + } + + /** + * 知识中心-个人-发布知识-获取维度树json + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getMeDimensionTreeJson(String parentId) { + DimensionService dimensionService = new DimensionService(); + String ACPublish = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "ACPUBLISH"); + JSONArray dimensionJA = new JSONArray(); + try { + List dimensionModels = new ArrayList(); + if ("0".equals(ACPublish)) { + dimensionModels = dimensionService.queryTreePublishDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + } else { + dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + } + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + // 知识管理员 + boolean hasKnwlMgrPerm = KMSUtil.isKnwlManager(getContext().getUID()); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) {// 不允许发布为知识 + dimensionJO.put("nocheck", true); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) {// 不允许发布为知识地图类型的维度 + dimensionJO.put("nocheck", true); + } + + dimensionJO.put("id", dimensionModel.getId()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + dimensionJO.put("name", dimensionModel.getDimensionName()); + + if (dimensionService.isExistChildForQueryTreeAccessDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), hasKnwlMgrPerm)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + putDimensionJO(hasKnwlMgrPerm, dimensionModel, dimensionJO); + + // 非管理员、设置了发布权限、当前人在发布权限内 + if (!hasKnwlMgrPerm && !KMSUtil.isDimensionManager(dimensionModel.getId(), getContext().getUID())) { + // 是否设置了权限 + boolean isSetPerm = SDK.getPermAPI().getACListByResource(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionModel.getId(), DimensionMgrACCM.PUBLISH.getType()).size() != 0; + if (isSetPerm) { + // 发布权限 + boolean hasPublishPerm = SDK.getPermAPI().havingACPermission(getContext().getUID(), KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionModel.getId(), DimensionMgrACCM.PUBLISH.getType()); + if ("0".equals(ACPublish)) { + if (!hasPublishPerm) { + dimensionJO.put("nocheck", true); + } + } else { + if (hasPublishPerm) {// 无需启动流程 + dimensionJO.put("publishPerm", "publish"); + putDimensionPublishJO(dimensionModel, dimensionJO); + } else { + if ("publish".equals(dimensionJO.get("publishPerm"))) {// 如果直接发布则不允许发布,如果是需要审批则允许发起审批流程 + dimensionJO.put("nocheck", true); + } + } + } + } + } + + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + private void putDimensionJO(boolean hasKnwlMgrPerm, DimensionModel dimensionModel, JSONObject dimensionJO) { + // 直接发布OR启动流程 + if (hasKnwlMgrPerm || KMSUtil.canPublishCard(dimensionModel.getId(), getContext().getUID())) { + dimensionJO.put("publishPerm", "publish"); + putDimensionPublishJO(dimensionModel, dimensionJO); + } else { + dimensionJO.put("publishPerm", "processPublish"); + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + dimensionJO.put("iconCls", "treeHotspot-noPerm"); + } + } + } + + private void putDimensionPublishJO(DimensionModel dimensionModel, JSONObject dimensionJO) { + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + dimensionJO.put("iconCls", "treeDimension"); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + dimensionJO.put("iconCls", "treeDimension"); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + dimensionJO.put("iconCls", "treeHotspot"); + } + } + + /** + * 知识中心-全部-移动复制-获取维度树json + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getMoveKnwlDimensionTreeJson(String parentId) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + try { + List dimensionModels = dimensionService.queryTreeMgrDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + // 知识管理员 + boolean hasKnwlMgrPerm = KMSUtil.isKnwlManager(getContext().getUID()); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) {// 不允许发布为知识地图类型的维度 + dimensionJO.put("nocheck", true); + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) {// 不允许发布为知识地图类型的维度 + dimensionJO.put("nocheck", true); + } + + dimensionJO.put("id", dimensionModel.getId()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + dimensionJO.put("name", dimensionModel.getDimensionName()); + + if (dimensionService.isExistChildForQueryTreeMgrDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), hasKnwlMgrPerm)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + putDimensionPublishJO(dimensionModel, dimensionJO); + + // 直接发布OR启动流程 + putDimensionJO(hasKnwlMgrPerm, dimensionModel, dimensionJO); + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 知识中心-全部-根据维度id查询知识列表 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @return JSON + * @author wangshibao + */ + public String getDimensionCardListJson(String dimensionId, int curPage, int rowsPerPage, String sortIndx, String sortDir, String filter) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray publishJA = new JSONArray(); + PublishService publishService = new PublishService(); + try { + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + filter = URLDecoder.decode(filter, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + List publishModels = publishService.queryPublishByDimensionId(getContext().getUID(), dimensionId, curPage, rowsPerPage, sortIndx, sortDir, filter); + CardService cardService = new CardService(); + for (PublishModel publishModel : publishModels) { + JSONObject publishJO = new JSONObject(); + publishJO.put("cardId", publishModel.getCardModel().getId()); + publishJO.put("cardName", publishModel.getCardModel().getCardName()); + publishJO.put("cardType", publishModel.getCardModel().getCardType()); + publishJO.put("readCount", publishModel.getCardModel().getReadCount()); + publishJO.put("onlineLevel", publishModel.getCardModel().getOnlineLevel()); + publishJO.put("securityLevel", publishModel.getCardModel().getSecurityLevel()); + publishJO.put("validDate", UtilDate.dateFormat(publishModel.getCardModel().getValidDate())); + publishJO.put("isComment", publishModel.getCardModel().getIsComment()); + publishJO.put("isRate", publishModel.getCardModel().getIsRate()); + publishJO.put("createUser", publishModel.getCardModel().getCreateUser()); + publishJO.put("uid", getContext().getUID()); + publishJO.put("publishId", publishModel.getId()); + UserModel publishUserModel = UserCache.getModel(publishModel.getPublishUser()); + publishJO.put("publishUsername", publishUserModel == null ? publishModel.getPublishUser() : publishUserModel.getUserName()); + publishJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + publishJO.put("dimensionId", publishModel.getDimensionId()); + publishJO.put("dimensionName", publishModel.getDimensionModel().getDimensionName()); + publishJO.put("showType", publishModel.getDimensionModel().getShowType()); + publishJO.put("rdoSL", publishModel.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModel.getCardModel().getSecurityLevel()) : ""); + String cardContext = publishModel.getCardModel().getCardContext(); + if (UtilString.isEmpty(cardContext) || publishModel.getCardModel().getId().equals(cardContext)) { + //查询正文 + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, publishModel.getCardModel().getCreateUser(), publishModel.getCardModel().getId(), publishModel.getCardModel().getId()); + cardContext = cardService.replaceSessionId(this.getContext(), cardService.getCardContent(dc)); + } else { + cardContext = cardService.replaceSessionId(this.getContext(), cardContext); + } + publishJO.put("cardContext", cardContext); + + publishJA.add(publishJO); + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", publishJA); + dataJson.put("totalRecords", publishService.totalRecordsPublish); + dataJson.put("curPage", curPage); + dataJson.put("rowsPerPage", rowsPerPage); + // 知识管理员 + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + dataJson.put("isNeedBorrow", !isKnwlMgr && KMSUtil.isNeedBorrow(dimensionId, getContext().getUID())); + dataJson.put("isDimensionManager", isKnwlMgr || KMSUtil.isDimensionManager(dimensionId, getContext().getUID())); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 知识中心-全部-根据维度id查询知识列表 + * + * @return JSON + * @author wangshibao + */ + public String getDimensionCardListAllJson(String dimensionId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray publishJA = new JSONArray(); + PublishService publishService = new PublishService(); + List publishModels = publishService.queryPublishAllByDimensionId(getContext().getUID(), dimensionId); + for (PublishModel publishModel : publishModels) { + JSONObject publishJO = new JSONObject(); + publishJO.put("cardId", publishModel.getCardModel().getId()); + publishJO.put("cardName", publishModel.getCardModel().getCardName()); + publishJO.put("cardType", publishModel.getCardModel().getCardType()); + publishJO.put("readCount", publishModel.getCardModel().getReadCount()); + publishJO.put("onlineLevel", publishModel.getCardModel().getOnlineLevel()); + publishJO.put("securityLevel", publishModel.getCardModel().getSecurityLevel()); + publishJO.put("validDate", UtilDate.dateFormat(publishModel.getCardModel().getValidDate())); + publishJO.put("isComment", publishModel.getCardModel().getIsComment()); + publishJO.put("createUser", publishModel.getCardModel().getCreateUser()); + publishJO.put("publishId", publishModel.getId()); + UserModel publishUserModel = UserCache.getModel(publishModel.getPublishUser()); + publishJO.put("publishUsername", publishUserModel == null ? publishModel.getPublishUser() : publishUserModel.getUserName()); + publishJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + publishJO.put("dimensionId", publishModel.getDimensionId()); + publishJO.put("dimensionName", publishModel.getDimensionModel().getDimensionName()); + publishJO.put("showType", publishModel.getDimensionModel().getShowType()); + publishJO.put("cardContext", publishModel.getCardModel().getCardContext()); + publishJA.add(publishJO); + } + responseObject.put("list", publishJA); + // 知识管理员 + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + responseObject.put("isNeedBorrow", !isKnwlMgr && KMSUtil.isNeedBorrow(dimensionId, getContext().getUID())); + responseObject.put("isDimensionManager", isKnwlMgr || KMSUtil.isDimensionManager(dimensionId, getContext().getUID())); + return responseObject.toString(); + } + + /** + * 删除文件 + * + * @param fileId 文件Id + * @return JSON + * @author wangshibao + */ + public String deleteFile(String cardId, String fileId) { + FileModel fileModel = FileCache.getCache().get(fileId); + String fileName = fileModel.getFileName(); + if (fileModel == null) { + throw new AWSObjectNotFindException("文件未找到,id:" + fileId); + } + CardModel cardModel = null; + if (fileModel.getCardId() != null) { + cardModel = CardCache.getCache().get(fileModel.getCardId()); + } + FileService fileService = new FileService(); + boolean result = fileService.deleteFile(cardId, fileId); + ResponseObject responseObject = null; + if (result) { + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel == null ? getContext().getUID() : cardModel.getCreateUser(), cardId, KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + dcContext.delete(); + responseObject = ResponseObject.newOkResponse("删除成功"); + // 删除全文检索 + try { + String sourceAppId = KMSConstant.APP_ID; + String aslp = "aslp://" + KMSConstant.APP_FULLSEARCH + "/deleteIndex"; + Map params = new HashMap(); + params.put("index", KMSConstant.APP_KMS_FULLSEARCH_INDEX); + params.put("type", KMSConstant.APP_KMS_FULLSEARCH_TYPE); + params.put("documentPath", dcContext.getPath() + dcContext.getSecurityFileName()); + AppAPI appAPI = SDK.getAppAPI(); + ResponseObject resultRO = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, params); + if (!resultRO.isOk()) { + // 输出错误日志到KMS应用 + AppsLogger.err(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "删除全文检索的索引失败,文件路径ID:" + dcContext.getFilePath() + ".错误信息:" + resultRO.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + // 输出错误日志到KMS应用 + AppsLogger.err(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "删除全文检索失败的索引,文件路径ID:" + dcContext.getFilePath() + ".错误信息:" + e.getMessage()); + } + } else { + responseObject = ResponseObject.newErrResponse("删除失败"); + } + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardId); + logModel.setFileId(null); + logModel.setLogInfo("删除附件:" + fileName); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_ACCESS_OTHER); + KMSLogUtil.log(logModel); + return responseObject.toString(); + } + + /** + * 新建知识 + * + * @param cardId 知识ID + * @param cardName 知识名称 + * @param validDate 有效期 + * @param onlineLevel 在线控制类型 + * @param securityLevel 保密级别 + * @param cardType 知识类型 + * @return JSON + * @author wangshibao + */ + public String insertCard(String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, boolean isComment, boolean isRate, String cardContext) { + ResponseObject responseObject = ResponseObject.newOkResponse("新建成功"); + CardService cardService = new CardService(); + if (UtilString.isEmpty(cardId)) { + cardId = "obj_" + UUIDGener.getUUID().replaceAll("-", ""); + } + cardService.insertCard(super.getContext().getUID(), cardId, cardName, validDate, onlineLevel, securityLevel, cardType, isComment == true ? 1 : 0, isRate == true ? 1 : 0, cardContext, "", ""); + responseObject.put("cardId", cardId); + return responseObject.toString(); + } + + /** + * 编辑知识 + * + * @param cardId 知识ID + * @param cardName 知识名称 + * @param validDate 有效期 + * @param onlineLevel 在线控制类型 + * @param securityLevel 保密级别 + * @param cardType 知识类型 + * @return JSON + * @author wangshibao + */ + public String updateCard(String cardId, String cardName, Date validDate, int onlineLevel, int securityLevel, int cardType, boolean isComment, boolean isRate, String cardContext) { + ResponseObject responseObject = ResponseObject.newOkResponse("编辑成功"); + CardService cardService = new CardService(); + cardService.updateCard(super.getContext().getUID(), cardId, cardName, validDate, onlineLevel, securityLevel, cardType, isComment == true ? 1 : 0, isRate == true ? 1 : 0, cardContext); + return responseObject.toString(); + } + + /** + * 删除知识 + * + * @param cardIds 知识ID,英文半角逗号分隔 + * @return JSON + * @author wangshibao + */ + public String deleteCards(String cardIds) { + if (UtilString.isEmpty(cardIds)) { + throw new AWSException("知识ID不能为空"); + } + String[] cardIdArr = cardIds.split(","); + ResponseObject responseObject = ResponseObject.newOkResponse("删除成功"); + CardService cardService = new CardService(); + cardService.deleteCard(super.getContext(), cardIdArr); + //删除时取消相应知识的收藏 + for (int i = 0; i < cardIdArr.length; i++) { + Map map = new HashMap<>(); + map.put("id", cardIdArr[i]); + SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), "aslp://com.actionsoft.apps.favorite/unfavorite", map); + } + return responseObject.toString(); + } + + /** + * 查询文件列表json + * + * @param cardId 知识ID + * @return JSON + * @author wangshibao + */ + public String getFileListJson(String cardId) { + if (UtilString.isEmpty(cardId)) { + throw new AWSException("知识ID不能为空"); + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + FileService fileService = new FileService(); + List fileModels = fileService.queryFiles(cardId); + CardCache cardCache = CardCache.getCache(); + CardModel cardModel = cardCache.get(cardId); + JSONArray fileJA = new JSONArray(); + for (FileModel fileModel : fileModels) { + JSONObject fileJO = new JSONObject(); + fileJO.put("id", fileModel.getId()); + if (fileModel.getFileState() == 2) { + JSONObject formJO = JSONObject.parseObject(fileModel.getFileName()); + String fileName = formJO.getString("formName"); + fileJO.put("fileName", fileName); + fileJO.put("fileVer", ""); + fileJO.put("fileSize", 0); + fileJO.put("fileSuffixIcon", KMSUtil.getFileIconName(fileName)); + } else { + String fileName = fileModel.getFileName(); + fileJO.put("fileName", fileName); + fileJO.put("fileVer", fileModel.getFileVer()); + fileJO.put("fileSize", fileModel.getFileSize()); + fileJO.put("fileSuffixIcon", KMSUtil.getFileIconName(fileName)); + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + dcContext.setFileNameShow(fileName); + fileJO.put("fileDownloadURL", dcContext.getDownloadURL()); + } + fileJO.put("fileState", fileModel.getFileState()); + fileJO.put("createUsername", UserCache.getModel(fileModel.getCreateUser()) == null ? fileModel.getCreateUser() : UserCache.getModel(fileModel.getCreateUser()).getUserName()); + fileJO.put("createTime", UtilDate.datetimeFormat(fileModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + fileJO.put("createUserPhoto", SDK.getPortalAPI().getUserPhoto(getContext(), fileModel.getCreateUser())); + fileJO.put("createUser", fileModel.getCreateUser()); + + fileJA.add(fileJO); + } + responseObject.setData(fileJA); + return responseObject.toString(); + } + + /** + * 查询元数据以及对应的属性(权限内的) + * + * @return Map> + * @author wangshibao + */ + public String getSchemaAttr() { + MetaSchemaService schemaService = new MetaSchemaService(); + ResponseObject responseObject = ResponseObject.newOkResponse(); + Map> schemaAttrMap = schemaService.querySchemaAttrPublished(getContext().getUID()); + + JSONObject schemaAttrJO = new JSONObject(true); + putSchemaAttrJO(schemaAttrMap, schemaAttrJO); + responseObject.setData(schemaAttrJO); + return responseObject.toString(); + } + + public static void putSchemaAttrJO(Map> schemaAttrMap, JSONObject schemaAttrJO) { + for (String schemaId : schemaAttrMap.keySet()) { + Map schemaMap = schemaAttrMap.get(schemaId); + JSONObject schemaJO = new JSONObject(); + schemaJO.put("schemaTitle", schemaMap.get("schemaTitle")); + schemaJO.put("showType", schemaMap.get("showType")); + schemaJO.put("isNullable", schemaMap.get("isNullable")); + schemaJO.put("schemaJO", schemaMap.get("schemaJO")); + + List attrModels = (List) schemaMap.get("attrList"); + JSONArray attrJA = new JSONArray(); + for (MetaAttrModel metaAttrModel : attrModels) { + JSONObject attrJO = new JSONObject(); + attrJO.put("schemaId", metaAttrModel.getSchemaId()); + attrJO.put("attrTitle", Html.htmlEscape(metaAttrModel.getAttrTitle())); + attrJO.put("id", metaAttrModel.getId()); + + attrJA.add(attrJO); + } + + schemaJO.put("attrList", attrJA); + schemaAttrJO.put(schemaId, schemaJO); + } + } + + /** + * 发布知识 + * + * @param publishCardIds 知识ID-JSON数组的字符串 + * @param publishDimensionIds 维度ID-JSON数组的字符串 + * @param schemaMetaData 元数据JSON数组的字符串 + * @param tags 标签 + * @param publishMemo 描述 + * @return + */ + public String publishCard(UserContext uc, String publishCardIds, String publishDimensionIds, String schemaMetaData, String tags, String publishMemo) { + ResponseObject responseObject = ResponseObject.newOkResponse("发布成功"); + try { + schemaMetaData = URLDecoder.decode(schemaMetaData, StandardCharsets.UTF_8.name()); + tags = URLDecoder.decode(tags, StandardCharsets.UTF_8.name()); + publishMemo = URLDecoder.decode(publishMemo, StandardCharsets.UTF_8.name()); + } catch (Exception e) { + throw new AWSException(e); + } + JSONArray publishCardJA = JSONArray.parseArray(publishCardIds); + JSONArray publishDimensionJA = JSONArray.parseArray(publishDimensionIds); + JSONObject schemaMetaDataJO = JSONObject.parseObject(schemaMetaData); + CardService cardService = new CardService(); + cardService.publishCard(super.getContext(), publishCardJA, publishDimensionJA, schemaMetaDataJO, tags, publishMemo); + + String points = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "pointOfPublish"); + int point = Integer.parseInt(points); + //判断是否安装了积分管理 + AppContext workcalebdarApp = SDK.getAppAPI().getAppContext(KMSConstant.POINTS_APPID); + if (workcalebdarApp != null && SDK.getAppAPI().isActive(workcalebdarApp.getId()) && point > 0) { + //调用addpoint方法 + this.addPoint(uc, publishCardIds, KMSConstant.POINT_PUBLSH, point); + } + + return responseObject.toString(); + } + + /** + * 给知识评分 + * + * @param rateId 评分模型的ID + * @param cardId 知识ID + * @param rateLevel 分数 + * @return JSON + * @author wangshibao + */ + public String rateCard(String rateId, String cardId, Integer rateLevel) { + String responseMsg = ""; + if (rateLevel != null) { + responseMsg = "评分成功"; + } else { + responseMsg = "删除评分成功"; + } + ResponseObject responseObject = ResponseObject.newOkResponse(responseMsg); + OptService optService = new OptService(); + String newRateId = optService.rateCard(super.getContext(), rateId, cardId, rateLevel); + responseObject.put("newRateId", newRateId); + return responseObject.toString(); + } + + /** + * 获取知识信息(浏览页面的整合信息) + * + * @param cardId 知识ID + * @return JSON + * @author wangshibao + */ + public String getBrowseCardInfo(UserContext uc, String cardId, boolean isBorrow, String boId, boolean isEdit, String dimensionId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + Connection conn = null; + try { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + throw new AWSException("知识不存在"); + } + // 判断密级控制和知识访问权限 + if (!KMSUtil.checkSecurity(getContext().getUID(), cardModel) || !KMSUtil.checkCardAC(cardId, getContext().getUID())) { + UserModel cardCreateUserModel = UserCache.getModel(cardModel.getCreateUser()); + throw new AWSException("您无权限阅读此文件,请联系文件发布人-" + (cardCreateUserModel == null ? cardModel.getCreateUser() : cardCreateUserModel.getUserName())); + } + // 判断是否需要编辑 + responseObject.put("canEdit", false); + if (isEdit) { + if (cardModel.getCreateUser().equals(getContext().getUID())) {// 创建人 + responseObject.put("canEdit", true); + } else { + if (UtilString.isEmpty(dimensionId)) { + // 知识管理员 + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + boolean isDimensionMgr = isKnwlMgr || KMSUtil.isDimensionManager(dimensionId, getContext().getUID()); + if (isDimensionMgr) {// 是否是维度管理员 + responseObject.put("canEdit", true); + } + } else { + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + if (isKnwlMgr) {// 是否知识管理员 + responseObject.put("canEdit", true); + } + } + } + } + boolean logFlag = true; + if (cardModel.getIsPublished() == 0 && cardModel.getCreateUser().equals(getContext().getUID())) {// 未发布的且自己浏览自己的知识不记录日志 + logFlag = false; + } + // if (!cardModel.getCreateUser().equals(getContext().getUID())) {// 自己浏览自己的知识不记录次数 + // 阅读次数加1 + cardModel.setReadCount(cardModel.getReadCount() + 1); + new CardDao().update(cardModel); + // } + conn = DBSql.open(); + if (!UtilString.isEmpty(boId)) {// 借阅的知识 阅读次数+1 + BO bo = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).detailById(boId); + String status = bo.getString("STATUS"); + if ("同意".equals(status)) { + if ("限制阅读次数".equals(bo.getString("CONTROLTYPE"))) { + int readTimes = bo.get("READTIMES", Integer.class).intValue(); + readTimes++; + DBSql.update("UPDATE " + KMSConstant.BO_ENTITY_NAME_BORROW + " SET READTIMES=? WHERE " + BOEngineInterface.ID + " = ?", new Object[] { readTimes, boId }); + } + } else { + throw new AWSException("无权阅读此知识"); + } + } + if (logFlag) { + {/* 记录访问知识的log */ + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardId); + logModel.setFileId(null); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_ACCESS_CARD); + KMSLogUtil.log(logModel); + } + } + // 评分信息 + OptService optService = new OptService(); + OptModel optModel = optService.getRate(cardId, super.getContext().getUID()); + String rateId = ""; + int rateLevel = 0; + if (optModel != null) { + rateId = optModel.getId(); + rateLevel = Integer.parseInt(optModel.getOptContent()); + } + + responseObject.put("rateId", rateId); + responseObject.put("rateLevel", rateLevel); + responseObject.put("rates", optService.getRates(cardId)); + // 文件信息 + FileService fileService = new FileService(); + JSONArray fileJA = new JSONArray(); + List fileModels = fileService.queryLatestFiles(cardId); + + // 批量查询下载次数 + List fileIdList = new ArrayList<>(); + for (FileModel fileModel : fileModels) { + fileIdList.add(fileModel.getId()); + } + Map fileDownloadMap = fileService.getFileDownloadCount(fileIdList); + + int i = 0; + for (FileModel fileModel : fileModels) { + if (i == 3) { + // break; + } + if (fileModel.getFileSize() < 0) { + continue; + } + i++; + JSONObject fileJO = new JSONObject(); + String fileName = fileModel.getFileName(); + + fileJO.put("id", fileModel.getId()); + + if (fileModel.getFileState() == 2) {//表单链接 + JSONObject formJO = JSONObject.parseObject(fileName); + fileJO.put("fileName", fileName); + fileJO.put("fileVersion", ""); + fileJO.put("fileNameNoVersion", formJO.getString("formName")); + fileJO.put("fileSize", 0); + } else { + fileJO.put("fileVersion", fileModel.getFileVer()); + fileJO.put("fileName", fileName + " v" + fileModel.getFileVer()); + fileJO.put("fileNameNoVersion", fileName); + fileJO.put("fileSize", fileModel.getFileSize()); + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + String downLoadUrl = dcContext.getDownloadURL(); + String downloadUrlHtml = ""; + if (getContext().isMobileClient()) { + if (!dcContext.isCloud()) { + String url = getFileUrlForMobile(fileName, super.getContext(), dcContext); + if (url != null) { + downLoadUrl = url; + } + } + try { + downloadUrlHtml = "" + fileName + ""; + } catch (Exception e) { + e.printStackTrace(System.err); + } + fileJO.put("downloadUrlHtml", downloadUrlHtml); + } + fileJO.put("downloadUrl", downLoadUrl); + } + + fileJO.put("fileState", fileModel.getFileState()); + fileJO.put("fileSuffixIcon", KMSUtil.getFileIconName(fileName)); + fileJO.put("createUsername", UserCache.getModel(fileModel.getCreateUser()) == null ? fileModel.getCreateUser() : UserCache.getModel(fileModel.getCreateUser()).getUserName()); + fileJO.put("createTime", UtilDate.datetimeFormat(fileModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + fileJO.put("downloadCount", fileDownloadMap.get(fileModel.getId()) == null ? 0 : fileDownloadMap.get(fileModel.getId()).intValue()); + fileJO.put("createUserPhoto", SDK.getPortalAPI().getUserPhoto(getContext(), fileModel.getCreateUser())); + fileJO.put("createUser", fileModel.getCreateUser()); + + fileJA.add(fileJO); + } + responseObject.put("files", fileJA); + // 评论信息 + List commentModels = optService.queryComments(cardId); + JSONArray commentJA = new JSONArray(); + PortalAPI portalAPI = SDK.getPortalAPI(); + for (OptModel commentModel : commentModels) { + JSONObject commentJO = new JSONObject(); + commentJO.put("commentUserPhoto", portalAPI.getUserPhoto(getContext(), commentModel.getOptUser())); + commentJO.put("commentUsername", UserCache.getModel(commentModel.getOptUser()) == null ? commentModel.getOptUser() : UserCache.getModel(commentModel.getOptUser()).getUserName()); + commentJO.put("commentContent", commentModel.getOptContent()); + commentJO.put("commentTime", UtilDate.datetimeFormat(commentModel.getOptTime(), "yyyy-MM-dd HH:mm")); + + commentJA.add(commentJO); + } + responseObject.put("currentUserPhoto", portalAPI.getUserPhoto(getContext(), getContext().getUID())); + responseObject.put("comments", commentJA); + responseObject.put("isComment", cardModel.getIsComment()); + responseObject.put("isRate", cardModel.getIsRate()); + CardService cardService = new CardService(); + String cardContext = cardModel.getCardContext(); + if (UtilString.isEmpty(cardContext) || cardModel.getId().equals(cardContext)) { + DCContext dc = new DCContext(null, DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_CARDCONTENT_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), cardModel.getId()); + cardContext = cardService.replaceSessionId(this.getContext(), cardService.getCardContent(dc)); + } else { + cardContext = cardService.replaceSessionId(this.getContext(), cardContext); + } + responseObject.put("cardContext", cardContext); + // 收藏信息 + CollectionService collectionService = new CollectionService(); + boolean isCollected = collectionService.isCollected(cardId);// 是否被我收藏 + responseObject.put("isCollected", isCollected); + + responseObject.put("isFavoriteAppActive", SDK.getAppAPI().isActive("com.actionsoft.apps.favorite")); + // 创建人信息 + responseObject.put("createUsername", UserCache.getModel(cardModel.getCreateUser()) == null ? cardModel.getCreateUser() : UserCache.getModel(cardModel.getCreateUser()).getUserName()); + DepartmentModel createUserDeptModel = SDK.getORGAPI().getDepartmentByUser(cardModel.getCreateUser()); + responseObject.put("createUserDept", createUserDeptModel == null ? "" : createUserDeptModel.getName()); + responseObject.put("createUserPhoto", portalAPI.getUserPhoto(getContext(), cardModel.getCreateUser())); + // 是否允许下载文件 + responseObject.put("onlineLevel", cardModel.getOnlineLevel()); + responseObject.put("cardName", cardModel.getCardName()); + JSONObject cardJO = new JSONObject(); + cardJO.put("cardName", cardModel.getCardName()); + cardJO.put("cardType", cardModel.getCardType()); + cardJO.put("createUser", cardModel.getCreateUser()); + cardJO.put("cardId", cardModel.getId()); + cardJO.put("isComment", cardModel.getIsComment()); + cardJO.put("isRate", cardModel.getIsRate()); + cardJO.put("isPublished", cardModel.getIsPublished()); + cardJO.put("cardContext", cardContext); + cardJO.put("onlineLevel", cardModel.getOnlineLevel()); + cardJO.put("readCount", cardModel.getReadCount()); + cardJO.put("commentCount", cardModel.getCommentCount()); + cardJO.put("securityLevel", cardModel.getSecurityLevel()); + cardJO.put("validDate", UtilDate.dateFormat(cardModel.getValidDate())); + cardJO.put("externalUrl", cardModel.getExternalUrl()); + responseObject.put("card", cardJO); + //responseObject.put("isSupportSideBarVision", compareServerVision("6.2.11")); + responseObject.put("isSupportSideBarVision", -1); + boolean showFavorite = false; + String appId = "com.actionsoft.apps.favorite"; + AppContext hwsignatureContext = SDK.getAppAPI().getAppContext(appId); + if (hwsignatureContext != null && SDK.getAppAPI().isActive(hwsignatureContext)) { + showFavorite = true; + } + responseObject.put("showFavorite", showFavorite); + String points = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "pointOfOpenCard"); + int point = Integer.parseInt(points); + //判断是否安装了积分管理 + AppContext workcalebdarApp = SDK.getAppAPI().getAppContext(KMSConstant.POINTS_APPID); + if (workcalebdarApp != null && SDK.getAppAPI().isActive(workcalebdarApp.getId()) && 1 == cardModel.getIsPublished() && point > 0) { + //调用addpoint方法 + this.addPoint(uc, cardId, KMSConstant.POINT_LOOK_ATCART, point); + } + return responseObject.toString(); + } finally { + DBSql.close(conn); + } + } + + public static int compareServerVision(String envVersion) { + String serverVersion = AWSServerConf.getVersion(); + String[] versionArr = envVersion.split("\\.", 4); + String[] nowVersionArr = serverVersion.split("\\.", 4); + if (versionArr.length < 3) { + return 1; + } + if (nowVersionArr.length == 4) { + serverVersion = serverVersion.substring(0, serverVersion.lastIndexOf(".")); + } + if (nowVersionArr.length < 3) { + return 1; + } + try { + //拆分app版本号,以及平台版本号 + int dependVerMajor = Integer.parseInt(versionArr[0]); + int dependVerMinor = Integer.parseInt(versionArr[1]); + int dependVerBuild = 0; + String sDependBuild = versionArr[2]; + + int serverVerMajor = Integer.parseInt(nowVersionArr[0]); + int serverVerMinor = Integer.parseInt(nowVersionArr[1]); + int serverVerBuild = 0; + String sServerBuild = nowVersionArr[2]; + + if (envVersion.matches(versionMatchRuleMonth)) { + dependVerBuild = Integer.parseInt(versionArr[2]); + } else if (envVersion.matches(versionMatchRuleRC)) { + dependVerBuild = Integer.parseInt(sDependBuild.substring(2)); + } + if (serverVersion.matches(versionMatchRuleMonth)) { + serverVerBuild = Integer.parseInt(nowVersionArr[2]); + } else if (serverVersion.matches(versionMatchRuleRC)) { + serverVerBuild = Integer.parseInt(sServerBuild.substring(2)); + } + if (serverVerMajor >= dependVerMajor) { + if (serverVerMinor > dependVerMinor) { + return 1; + } else if (serverVerMinor == dependVerMinor) { + if (serverVerBuild >= dependVerBuild) { + return 1; + } else { + //server=xx, depend=GA serverdepend 需要返回true + if (sServerBuild.contains("GA") && UtilNumber.isNumeric(sDependBuild)) { + return 1; + } + return 1; + } + } else { + // 第二位版本号小于依赖版本号 + return -1; + } + } + } catch (NumberFormatException e) { + return 1; + } + return -1; + } + + /** + * 下载文件 + * + * @param fileId + * @return + * @author wangshibao + */ + public String downloadFile(UserContext uc, String fileId) { + try { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel == null) { + throw new AWSException("文件不存在"); + } + CardModel cardModel = CardCache.getCache().get(fileModel.getCardId()); + if (cardModel == null) { + throw new AWSException("知识不存在"); + } + // 是否允许下载 + if (cardModel.getOnlineLevel() == 0) { + throw new AWSException("文件不允许下载"); + } + {// 记录日志 + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardModel.getId()); + logModel.setFileId(fileId); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_DOWNLOAD_FILE); + KMSLogUtil.log(logModel); + } + + String fileName = fileModel.getFileName(); + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileName, fileModel.getFileVer())); + dcContext.setFileNameShow(fileName); + ResponseObject responseObject = ResponseObject.newOkResponse(); + responseObject.put("downloadURL", dcContext.getDownloadURL()); + + String points = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "pointOfDownFile"); + int point = Integer.parseInt(points); + + AppContext workcalebdarApp = SDK.getAppAPI().getAppContext(KMSConstant.POINTS_APPID); + if (workcalebdarApp != null && SDK.getAppAPI().isActive(workcalebdarApp.getId()) && 1 == cardModel.getIsPublished() && point > 0) { + ; + this.addPoint(uc, fileId, KMSConstant.POINT_DOWN_LOAD, point); + } + + return responseObject.toString(); + } catch (Exception e) { + return ResponseObject.newErrResponse(e.getMessage()).toString(); + } + } + + /** + * 新建评论 + * + * @param cardId 知识ID + * @param commentContent 评论内容 + * @return JSON + */ + public String insertComment(String cardId, String commentContent) { + OptService commentService = new OptService(); + String commentId = commentService.insertComment(super.getContext(), cardId, commentContent); + ResponseObject responseObject = ResponseObject.newOkResponse(); + OptModel optModel = OptCache.getCache().get(commentId); + JSONObject commentJO = new JSONObject(); + commentJO.put("commentUserPhoto", SDK.getPortalAPI().getUserPhoto(getContext(), optModel.getOptUser())); + commentJO.put("commentUsername", UserCache.getModel(optModel.getOptUser()) == null ? optModel.getOptUser() : UserCache.getModel(optModel.getOptUser()).getUserName()); + commentJO.put("commentContent", optModel.getOptContent()); + commentJO.put("commentTime", UtilDate.datetimeFormat(optModel.getOptTime(), "yyyy-MM-dd HH:mm")); + responseObject.put("comment", commentJO); + return responseObject.toString(); + } + + /** + * 统计知识和文件 + * + * @return JSON + */ + public String statCardFile() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + CardService cardService = new CardService(); + Map> statMap = cardService.statCardFileByUser(); + List createUsernameList = new ArrayList(); + List cardList = new ArrayList(); + List fileList = new ArrayList(); + for (String createUser : statMap.keySet()) { + Map userMap = statMap.get(createUser); + createUsernameList.add(userMap.get("createUsername")); + cardList.add(Integer.parseInt(userMap.get("card"))); + fileList.add(Integer.parseInt(userMap.get("file"))); + } + responseObject.put("createUserList", JSONArray.parseArray(JSONArray.toJSONString(createUsernameList))); + responseObject.put("cardList", JSONArray.parseArray(JSONArray.toJSONString(cardList))); + responseObject.put("fileList", JSONArray.parseArray(JSONArray.toJSONString(fileList))); + return responseObject.toString(); + } + + public String startBorrowProcessType(String cardId, String dimensionId) { + return startBorrowProcess(cardId, dimensionId, "pc"); + } + + /** + * 启动借阅流程 + * + * @param cardId 知识Id + * @param dimensionId 维度Id + * @return 任务办理页面 + * @author wangshibao + */ + public String startBorrowProcess(String cardId, String dimensionId, String type) { + ResponseObject rs = ResponseObject.newOkResponse(); + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + throw new AWSObjectNotFindException("知识不存在"); + } + // 判断流程启动权限 + if (!SDK.getPermAPI().havingStartProcessPermission(getContext().getUID(), KMSConstant.BORROW_PROCESS_DEF_ID)) { + throw new AWSException(APIErrorCode.getTitle(APIErrorCode.ERR_401) + ",请检查流程启动权限"); + } + ProcessDefinition processDef = ProcessDefCache.getInstance().getModel(KMSConstant.BORROW_PROCESS_DEF_ID); + if (processDef == null) { + throw new AWSObjectNotFindException("流程定义模型不存在:" + KMSConstant.BORROW_PROCESS_DEF_ID); + } + + // 判断是否重复申请(1、同一个知识在同一个维度下存在借阅成功流程 2、同一个知识在同一个维度下存在已结束的流程,而且知识还可以阅读) + long borrowBOSize = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).addQuery("APPLYUSER=", getContext().getUID()).addQuery("DIMENSIONID=", dimensionId).addQuery("CARDID =", cardId).unfinished().count(); + if (borrowBOSize > 0) { + if ("mobile".equals(type)) { + rs.err("知识[" + cardModel.getCardName() + "]的借阅流程已经启动,不能重复启动借阅流程"); + return rs.toString(); + } else { + return AlertWindow.getPage("提示", "知识[" + cardModel.getCardName() + "]的借阅流程已经启动,不能重复启动借阅流程","warning"); + } + } + List borrowBOList = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_BORROW).addQuery("APPLYUSER=", getContext().getUID()).addQuery("DIMENSIONID=", dimensionId).addQuery("CARDID =", cardId).addQuery("STATUS =", "同意").finished().list(); + if (borrowBOList != null) { + for (BO borrowBO : borrowBOList) { + String controlType = borrowBO.getString("CONTROLTYPE"); + if ("限制阅读次数".equals(controlType)) { + int times = borrowBO.get("TIMES", Integer.class); + int readTimes = borrowBO.get("READTIMES", Integer.class); + if (readTimes < times) { + if ("mobile".equals(type)) { + rs.err("知识[" + cardModel.getCardName() + "]已经借阅过并且可以阅读"); + return rs.toString(); + } else { + return AlertWindow.getPage("提示", "知识[" + cardModel.getCardName() + "]已经借阅过并且可以阅读","warning"); + } + + } + } else if ("限制有效日期".equals(controlType)) { + Date endDate = borrowBO.get("ENDDATE", Date.class); + long endDateMills = UtilDate.parse(UtilDate.dateFormat(endDate)).getTime() + 24 * 60 * 60 * 1000; + if (endDateMills > System.currentTimeMillis()) { + if ("mobile".equals(type)) { + rs.err("知识[" + cardModel.getCardName() + "]已经借阅过并且可以阅读"); + return rs.toString(); + } else { + + return AlertWindow.getPage("提示", "知识[" + cardModel.getCardName() + "]已经借阅过并且可以阅读","warning"); + } + } + } else { + throw new AWSException("控制类型数据错误"); + } + } + } + + // 计算流程标题 + String processTitle = getContext().getUserName() + "发起的知识[" + cardModel.getCardName() + "]借阅流程"; + if (processDef.isQuickStart()) { + if (!"".equals(processDef.getDefaultInstanceTitle())) { + processTitle = SDK.getRuleAPI().executeAtScript(processDef.getDefaultInstanceTitle(), getContext()); + } + } + // 启动流程 + ProcessInstance processInst = SDK.getProcessAPI().createProcessInstance(KMSConstant.BORROW_PROCESS_DEF_ID, null, this.getContext().getUID(), "", "", processTitle, null); + + List tracks = SDK.getProcessAPI().start(processInst, KMSConstant.BORROW_START_EVENT_ID).fetch(); + TaskInstance userTaskInst = null; + for (ProcessExecutionTrack track : tracks) { + if (track.getObjectList() != null) { + List taskList = track.getObjectList(); + for (Object o : taskList) { + if (o instanceof TaskInstance) { + TaskInstance taskInst = (TaskInstance) o; + if (taskInst.getActivityType().equals(TaskRuntimeConst.ACTIVITY_TYPE_USERTASK)) { + if (taskInst.getTarget().equals(getContext().getUID())) { + userTaskInst = taskInst; + break;// 如果是多例的人工任务,只拿第1个给当前人打开表单 + } + } + } + } + } + } + if (userTaskInst == null) { + throw new AWSException("节点参与者配置错误,仅允许自己给自己借阅"); + } else { + // 创建BO数据 + BO recordData = new BO(); + recordData.set("APPLYUSER", getContext().getUID()); + recordData.set("CARDID", cardId); + recordData.set("STATUS", "申请中"); + recordData.set("CARDNAME", cardModel.getCardName()); + recordData.set("DIMENSIONID", dimensionId); + SDK.getBOAPI().create(KMSConstant.BO_ENTITY_NAME_BORROW, recordData, processInst, getContext()); + if ("mobile".equals(type)) { + String url = SDK.getFormAPI().getFormURL(SDK.getPlatformAPI().getPortalUrl(), getContext().getSessionId(), processInst.getId(), userTaskInst.getId(), SDK.getTaskAPI().getTaskInstance(userTaskInst.getId()).getState(), "", "", ""); + rs.put("url", url); + return rs.toString(); + } else { + return FormAPIManager.getInstance().getFormPage(getContext(), processInst, userTaskInst, UserTaskRuntimeConst.STATE_TYPE_TRANSACT, 1); + } + + } + } + + public String startPublishProcessType(String cardIds, String dimensionId, String schemaMetaData, String tags, String publishMemo) { + return startPublishProcess(cardIds, dimensionId, schemaMetaData, tags, publishMemo, "pc"); + } + + /** + * 启动发布流程 + * + * @param cardIds 知识Id数组 + * @param dimensionId 维度Id + * @return 任务办理页面 + * @author wangshibao + */ + public String startPublishProcess(String cardIds, String dimensionId, String schemaMetaData, String tags, String publishMemo, String type) { + ResponseObject rs = ResponseObject.newOkResponse(); + // 判断流程启动权限 + if (!SDK.getPermAPI().havingStartProcessPermission(getContext().getUID(), KMSConstant.PUBLISH_PROCESS_DEF_ID)) { + throw new AWSException(APIErrorCode.getTitle(APIErrorCode.ERR_401) + ",请检查流程启动权限"); + } + ProcessDefinition processDef = ProcessDefCache.getInstance().getModel(KMSConstant.PUBLISH_PROCESS_DEF_ID); + if (processDef == null) { + throw new AWSObjectNotFindException("流程定义模型不存在:" + KMSConstant.PUBLISH_PROCESS_DEF_ID); + } + + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + throw new AWSObjectNotFindException("维度不存在"); + } + + List cardIdList = JSONArray.parseArray(cardIds, String.class); + for (int i = 0; i < cardIdList.size(); i++) { + CardModel cardModel = CardCache.getCache().get(cardIdList.get(i)); + if (cardModel == null) { + throw new AWSObjectNotFindException("知识不存在"); + } + } + // 判断是否重复申请(1、同一个知识在同一个维度下已发布 2、同一个知识在同一个维度下存在未结束的流程) + Iterator publishIterator = PublishCache.getCache().iterator(); + while (publishIterator.hasNext()) { + PublishModel publishModel = publishIterator.next(); + if (publishModel.getDimensionId().equals(dimensionId) && cardIdList.contains(publishModel.getCardId())) { + CardModel cardModel = CardCache.getCache().get(publishModel.getCardId()); + if ("mobile".equals(type)) { + rs.err("知识[" + cardModel.getCardName() + "]在知识分类[" + dimensionModel.getDimensionName() + "]下已经存在,不能重复发布"); + return rs.toString(); + } else { + + return AlertWindow.getPage("提示", "知识[" + cardModel.getCardName() + "]在知识分类[" + dimensionModel.getDimensionName() + "]下已经存在,不能重复发布", "error"); + } + } + } + for (String cardId : cardIdList) { + long publishBOSize = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_PUBLISH).addQuery("DIMENSIONID=", dimensionId).addQuery("(CARDIDS LIKE '% " + cardId + " %' )", null).unfinished().count(); + if (publishBOSize > 0) { + CardModel cardModel = CardCache.getCache().get(cardId); + + if ("mobile".equals(type)) { + rs.err("知识[" + cardModel.getCardName() + "]发布在知识分类[" + dimensionModel.getDimensionName() + "]下的流程已经启动,不能重复启动发布流程"); + return rs.toString(); + } else { + return AlertWindow.getPage("提示", "知识[" + cardModel.getCardName() + "]发布在知识分类[" + dimensionModel.getDimensionName() + "]下的流程已经启动,不能重复启动发布流程"); + } + + } + } + // 计算流程标题 + String processTitle; + if (processDef.isQuickStart() && !"".equals(processDef.getDefaultInstanceTitle())) { + processTitle = SDK.getRuleAPI().executeAtScript(processDef.getDefaultInstanceTitle(), getContext()); + } else { + processTitle = getContext().getUserName() + "发起的知识"; + for (int i = 0; i < cardIdList.size(); i++) { + if (i == 3) {// 最多取3个知识名称,防止页面放不开 + processTitle += "..."; + break; + } + CardModel cardModel = CardCache.getCache().get(cardIdList.get(i)); + processTitle += "[" + cardModel.getCardName() + "]"; + } + + processTitle += "发布流程"; + } + // 启动流程 + ProcessInstance processInst = SDK.getProcessAPI().createProcessInstance(KMSConstant.PUBLISH_PROCESS_DEF_ID, null, this.getContext().getUID(), "", "", processTitle, null); + + List tracks = SDK.getProcessAPI().start(processInst, KMSConstant.PUBLISH_START_EVENT_ID).fetch(); + TaskInstance userTaskInst = null; + for (ProcessExecutionTrack track : tracks) { + if (track.getObjectList() != null) { + List taskList = track.getObjectList(); + for (Object o : taskList) { + if (o instanceof TaskInstance) { + TaskInstance taskInst = (TaskInstance) o; + if (taskInst.getActivityType().equals(TaskRuntimeConst.ACTIVITY_TYPE_USERTASK)) { + if (taskInst.getTarget().equals(getContext().getUID())) { + userTaskInst = taskInst; + break;// 如果是多例的人工任务,只拿第1个给当前人打开表单 + } + } + } + } + } + } + if (userTaskInst == null) { + throw new AWSException("节点参与者配置错误,仅允许发布自己的知识"); + } else { + // 插入publish表临时数据(EXAMINEINFO不为空)(不包含TAG和MEMO以及元数据等信息)(方便在"我发布的"中管理),审批过后修改相应状态以便跟踪,再插入真正的发布信息 + PublishDao publishDao = new PublishDao(); + JSONArray publishJA = new JSONArray();// 存入BO表,用于作废时删除Publish表的临时信息 + for (String cardId : cardIdList) { + PublishModel publishModel = new PublishModel(); + publishModel.setCardId(cardId); + publishModel.setDimensionId(dimensionId); + String publishId = UUIDGener.getObjectId(); + publishModel.setId(publishId); + publishJA.add(publishId); + publishModel.setMemo(""); + publishModel.setPublishTime(new Timestamp(System.currentTimeMillis())); + publishModel.setPublishUser(getContext().getUID()); + publishModel.setTag(""); + JSONObject examineInfoJO = new JSONObject(); + examineInfoJO.put("processInstId", processInst.getId()); + examineInfoJO.put("status", "申请中"); + publishModel.setExamineInfo(examineInfoJO.toString()); + + publishDao.insert(publishModel); + } + + // 创建BO数据 + BO recordData = new BO(); + recordData.set("CARDIDS", cardIds); + recordData.set("APPLYUSER", getContext().getUID()); + recordData.set("STATUS", "申请中"); + recordData.set("DIMENSIONID", dimensionId); + recordData.set("PUBLISHIDS", publishJA.toString()); + + try { + schemaMetaData = URLDecoder.decode(schemaMetaData, StandardCharsets.UTF_8.name()); + tags = URLDecoder.decode(tags, StandardCharsets.UTF_8.name()); + publishMemo = URLDecoder.decode(publishMemo, StandardCharsets.UTF_8.name()); + } catch (Exception e) { + throw new AWSException(e); + } + recordData.set("SCHEMAMETADATA", schemaMetaData); + recordData.set("TAGS", tags); + recordData.set("PUBLISHMEMO", publishMemo); + + SDK.getBOAPI().create(KMSConstant.BO_ENTITY_NAME_PUBLISH, recordData, processInst, getContext()); + if ("mobile".equals(type)) { + String url = SDK.getFormAPI().getFormURL(SDK.getPlatformAPI().getPortalUrl(), getContext().getSessionId(), processInst.getId(), userTaskInst.getId(), SDK.getTaskAPI().getTaskInstance(userTaskInst.getId()).getState(), "", "", ""); + rs.put("url", url); + return rs.toString(); + } else { + return FormAPIManager.getInstance().getFormPage(getContext(), processInst, userTaskInst, UserTaskRuntimeConst.STATE_TYPE_TRANSACT, 1); + } + + } + } + + /** + * 取消发布知识 + * + * @param publishId 发布模型的ID + * @return JSON + * @author wangshibao + */ + public String cancelPublishCard(String publishId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + + PublishService publishService = new PublishService(); + PublishModel publishModel = publishService.queryPublishById(publishId); + + JSONObject resultJO = new JSONObject(); + // 知识管理员 + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + // 检查当前维度-直接取消发布/启动取消发布流程 + if (isKnwlMgr || KMSUtil.canCancelPublishCard(publishModel.getDimensionId(), getContext().getUID())) {// 直接取消 + try { + LocalTxManager.getInstance().begin(); + boolean deleteResult = publishService.delete(publishId); + if (deleteResult) { + // 判断并修改知识的发布状态 + CardService cardService = new CardService(); + cardService.updateCardIsPublishedStatus(publishModel.getCardId()); + // 判断并删除全文检索 + publishService.deleteFullSearch(publishModel.getCardId()); + resultJO.put("result", "success"); + } else { + resultJO.put("result", "failure"); + } + LocalTxManager.getInstance().commit(); + } catch (Exception e) { + LocalTxManager.getInstance().rollback(); + e.printStackTrace(); + throw e; + } + } else {// 启动取消发布流程 + resultJO.put("result", "process"); + } + responseObject.put("resultJO", resultJO); + return responseObject.toString(); + } + + /** + * 启动取消发布流程 + * + * @param publishId + * @return + * @author wangshibao + */ + public String startCancelPublishProcess(String publishId) { + PublishModel publishModel = PublishCache.getCache().get(publishId); + String htmlContent = ""; + // 判断流程启动权限 + if (!SDK.getPermAPI().havingStartProcessPermission(getContext().getUID(), KMSConstant.CANCEL_PUBLISH_PROCESS_DEF_ID)) { + throw new AWSException(APIErrorCode.getTitle(APIErrorCode.ERR_401) + ",请检查流程启动权限"); + } + try { + // 判断是否重复申请(存在相同publishId的未完成流程) + long publishBOSize = SDK.getBOAPI().query(KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH).addQuery("PUBLISHID=", publishId).unfinished().count(); + if (publishBOSize > 0) { + return AlertWindow.getPage("提示", "不能重复启动取消发布流程"); + } + + ProcessDefinition processDef = ProcessDefCache.getInstance().getModel(KMSConstant.CANCEL_PUBLISH_PROCESS_DEF_ID); + if (processDef == null) { + throw new AWSException("流程定义模型不存在:" + KMSConstant.CANCEL_PUBLISH_PROCESS_DEF_ID); + } + + // 计算流程标题 + String processTitle = getContext().getUserName() + "发起的知识[" + publishModel.getCardModel().getCardName() + "]取消发布流程"; + if (processDef.isQuickStart()) { + if (!"".equals(processDef.getDefaultInstanceTitle())) { + processTitle = SDK.getRuleAPI().executeAtScript(processDef.getDefaultInstanceTitle(), getContext()); + } + } + // 启动流程 + ProcessInstance processInst = SDK.getProcessAPI().createProcessInstance(KMSConstant.CANCEL_PUBLISH_PROCESS_DEF_ID, null, this.getContext().getUID(), "", "", processTitle, null); + + List tracks = SDK.getProcessAPI().start(processInst, KMSConstant.CANCEL_PUBLISH_START_EVENT_ID).fetch(); + TaskInstance userTaskInst = null; + for (ProcessExecutionTrack track : tracks) { + if (track.getObjectList() != null) { + List taskList = track.getObjectList(); + for (Object o : taskList) { + if (o instanceof TaskInstance) { + TaskInstance taskInst = (TaskInstance) o; + if (taskInst.getActivityType().equals(TaskRuntimeConst.ACTIVITY_TYPE_USERTASK)) { + if (taskInst.getTarget().equals(getContext().getUID())) { + userTaskInst = taskInst; + break;// 如果是多例的人工任务,只拿第1个给当前人打开表单 + } + } + } + } + } + } + if (userTaskInst == null) { + throw new AWSException("节点参与者配置错误,仅允许取消发布自己的知识"); + } else { + // 创建BO数据 + BO recordData = new BO(); + recordData.set("PUBLISHID", publishId); + recordData.set("CARDID", publishModel.getCardId()); + recordData.set("CARDNAME", publishModel.getCardModel().getCardName()); + recordData.set("APPLYUSER", getContext().getUID()); + recordData.set("STATUS", "申请中"); + recordData.set("DIMENSIONID", publishModel.getDimensionId()); + + SDK.getBOAPI().create(KMSConstant.BO_ENTITY_NAME_CANCEL_PUBLISH, recordData, processInst, getContext()); + htmlContent = FormAPIManager.getInstance().getFormPage(getContext(), processInst, userTaskInst, UserTaskRuntimeConst.STATE_TYPE_TRANSACT, 1); + } + + } catch (AWSException e) { + e.printStackTrace(); + htmlContent = AlertWindow.getPage(APIErrorCode.getTitle(APIErrorCode.ERR_500), e.getMessage(), AlertWindow.ICON_ERROR); + } catch (Exception e) { + e.printStackTrace(); + htmlContent = AlertWindow.getPage(APIErrorCode.getTitle(APIErrorCode.ERR_500), "请联系管理员", AlertWindow.ICON_ERROR); + } + return htmlContent; + } + + /** + * 查询某维度的tree路径 + * + * @param dimensionId + * @return 一个从root到dimensionId的数组 + * @author wangshibao + */ + public String getDimensionPath(String dimensionId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + List dimensionIdList = new DimensionService().getDimensionPathList(dimensionId); + responseObject.put("dimensionIdList", dimensionIdList.toArray(new String[0])); + return responseObject.toString(); + } + + /** + * 打包下载文件 + * + * @param cardId 知识ID + * @return + * @throws IOException + * @author wangshibao + */ + public String packageFiels(String cardId) { + try { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + throw new AWSException("知识不存在"); + } + // 是否允许下载 + if (cardModel.getOnlineLevel() == 0) { + throw new AWSException("文件不允许下载"); + } + long times = System.currentTimeMillis(); + final String zipName = "批量下载" + times + ".zip"; + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp/grouppackage/zip" + times + "/"; + File targetFileDir = new File(targetDir); + if (!targetFileDir.exists()) { + targetFileDir.mkdirs(); + } + // 将加密文件解密后逐个放入tmp文件夹 + FileService fileService = new FileService(); + List fileModels = fileService.queryLatestFiles(cardId); + {// 记录日志 + List logModelList = new ArrayList<>(); + Timestamp accessTime = new Timestamp(System.currentTimeMillis());// 因为单条存储,所以访问时间使用一个,以便查询出批量下载 + for (FileModel fileModel : fileModels) { + if (fileModel.getFileState() == 2) {//打包下载时,表单不计入下载日志 + continue; + } + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(accessTime); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardId); + logModel.setFileId(fileModel.getId()); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_DOWNLOAD_FILE); + logModelList.add(logModel); + } + + KMSLogUtil.log(logModelList.toArray(new LogModel[0])); + } + int fileCount = 0; + for (FileModel fileModel : fileModels) { + if (fileModel.getFileState() == 2) { + continue; + } + fileCount++; + break; + } + if (fileCount == 0) { + throw new AWSException("没有可以打包的文件"); + } + for (FileModel fileModel : fileModels) { + if (fileModel.getFileState() == 2) { + continue; + } + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardId, KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + File targetFile = new File(targetDir + fileModel.getFileName());// 名字不带版本号 + if (!targetFile.exists()) { + targetFile.createNewFile(); + } + OutputStream out = new FileOutputStream(targetFile); + InputStream in = DCUtil.decryptFile(dcContext); + if (in == null) { + String msg = "文件" + dcContext.getFileName() + "不存在"; + if (dcContext.getDCMessage() != null) { + msg = dcContext.getDCMessage().getMessage(); + } + return ResponseObject.newErrResponse(msg).toString(); + } + try { + IOUtils.copy(in, out); + in.close(); + out.close(); + } finally { + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(out); + } + } + UtilFile.zipCompress(targetDir, new File(targetDir + zipName)); + // 删除未加密的tmp文件(zip文件除外) + File[] files = targetFileDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + if (name.equals(zipName)) { + return false; + } + return true; + } + }); + for (File file : files) { + try { + file.delete(); + } catch (Exception e) {// 进入异常继续删除其他文件 + } + } + // 返回下载url到客户端 + DCContext zipDcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, "tmp"), KMSConstant.APP_ID, "grouppackage", "zip" + times, zipName); + return ResponseObject.newOkResponse(zipDcContext.getDownloadURL()).toString(); + } catch (Exception e) { + e.printStackTrace(); + return ResponseObject.newErrResponse(e.getMessage() == null ? e.getCause().getMessage() : e.getMessage()).toString(); + } + } + + /** + * 收藏/取消收藏知识 + * + * @param cardId + * @return + * @author wangshibao + */ + public String collectCard(String cardId) { + boolean result = new CollectionService().toogleCollection(cardId, getContext().getSessionId()); + if (result) { + return ResponseObject.newOkResponse("收藏成功").toString(); + } else { + return ResponseObject.newWarnResponse("取消收藏成功").toString(); + } + } + + /** + * 新建知识,未保存时,删除上传的文件 + * + * @param cardId + * @return + * @author wangshibao + */ + public String deleteUnsavedFiles(String cardId) { + try { + // 删除知识关联的文件 + DBSql.update("DELETE FROM " + KMSConstant.ENTITY_NAME_FILE + " WHERE " + FileModel.CARDID + " = ? ", new Object[] { cardId }); + // 删除缓存 + new FileService().removeCacheByCardIds(new ArrayList<>(Arrays.asList(cardId))); + // 删除物理文件 + DCContext dcContext = new DCContext(getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, getContext().getUID(), cardId); + String fileValuePath = dcContext.getPath();// fileValue文件夹path + File fileValueDir = new File(fileValuePath); + UtilFile.removeFile(fileValueDir); + File parentFileValueDir = fileValueDir.getParentFile();// 四级存储,获取名称为后三位的父文件夹 + if (parentFileValueDir.list().length == 0) { + UtilFile.removeFile(parentFileValueDir); + } + } catch (Exception e) { + e.printStackTrace(); + } + return ResponseObject.newOkResponse().toString(); + } + + /** + * 反馈 + * + * @param cardId + * @param reportContent + * @return + * @author wangshibao + */ + public String reportCard(String cardId, String dimensionId, String reportContent) { + new CardService().reportCard(cardId, dimensionId, reportContent, getContext().getUID()); + return ResponseObject.newOkResponse().toString(); + } + + /** + * 预览 + * + * @param fileId + * @return + * @author wangshibao + */ + public String previewFile(UserContext uc, String fileId, boolean isDownload, boolean isCopy) { + FileModel fileModel = FileCache.getCache().get(fileId); + CardModel cardModel = CardCache.getCache().get(fileModel.getCardId()); + if (cardModel == null) { + return ResponseObject.newWarnResponse("知识未保存,不允许预览文件").toString(); + } + {// 记录日志 + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardModel.getId()); + logModel.setFileId(fileId); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_ACCESS_FILE); + KMSLogUtil.log(logModel); + } + // 解密文件到tmp 注:替换为onlinedoc之后无需解密 + DCContext dcContext = new DCContext(getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel.getCreateUser(), cardModel.getId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + // String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + KMSConstant.ONLINEDOC_REPOSITORY_NAME + "/" + cardModel.getId() + "/" + fileModel.getId() + "/";// groupValue为cardId fileValue为fileId(在搜索全文检索时使用) + // File targetFileDir = new File(targetDir); + // if (!targetFileDir.exists()) { + // targetFileDir.mkdirs(); + // } + // File targetFile = null; + // try { + // targetFile = new File(targetDir + KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + // if (!targetFile.exists()) { + // targetFile.createNewFile(); + // } + // OutputStream out = new FileOutputStream(targetFile); + // InputStream in = DCUtil.decryptFile(dcContext); + // try { + // IOUtils.copy(in, out); + // in.close(); + // out.close(); + // } finally { + // IOUtils.closeQuietly(in); + // IOUtils.closeQuietly(out); + // } + // } catch (Exception e) { + // e.printStackTrace(); + // } + // 将文件转换为图片 + ResponseObject result = ResponseObject.newOkResponse(); + if (SDK.getAppAPI().isActive("com.actionsoft.apps.addons.wpsonline")) { + AppAPI appAPI = SDK.getAppAPI(); + + String fileName = KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer()); + String fileNamePre = fileName.substring(0, fileName.lastIndexOf(".")); + + Map params = new HashMap(); + params.put("sid", dcContext.getSession().getSessionId()); + params.put("fileNameOriginal", fileName); + params.put("sourceDc", dcContext); + params.put("isShowDefaultToolbar", true); + params.put("isCopy", isCopy); + params.put("isPrint", false); + params.put("isDownload", false); + params.put("isEncrypt", true); + //文件预览修改位置+++++++++ + result = ResponseObject.parse(UtilDoc.filePreview(uc, dcContext, true, params)); + } else { + result = ResponseObject.newErrResponse("文档预览服务不可用,请联系管理员"); + } + // 删除临时文件 + // if (targetFile != null && targetFile.exists()) { + // targetFile.delete(); + // } + + String points = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "pointOfViewFile"); + int point = Integer.parseInt(points); + //判断是否安装了积分管理 + AppContext workcalebdarApp = SDK.getAppAPI().getAppContext(KMSConstant.POINTS_APPID); + if (workcalebdarApp != null && SDK.getAppAPI().isActive(workcalebdarApp.getId()) && 1 == cardModel.getIsPublished() && point > 0) { + ; + this.addPoint(uc, fileId, KMSConstant.POINT_LOOK_ATFILE, point); + } + return result.toString(); + } + + /** + * 查询日志列表json + * + * @param curPage + * @param rowsPerPage + * @param cardId + * @return + * @author wangshibao + */ + public String getLogListJson(int curPage, int rowsPerPage, String cardId, String sortIndx, String sortDir) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray logJA = new JSONArray(); + LogService logService = new LogService(); + List logModels = logService.queryCardLogs(curPage, rowsPerPage, cardId, sortIndx, sortDir); + FileCache fileCache = FileCache.getCache(); + for (LogModel logModel : logModels) { + JSONObject logJO = new JSONObject(); + + if (logModel.getLogType() == KMSConstant.LOG_ACCESS_CARD) { + logJO.put("logContent", "浏览知识"); + } else if (logModel.getLogType() == KMSConstant.LOG_ACCESS_OTHER) { + logJO.put("logContent", logModel.getLogInfo()); + } else if (logModel.getLogType() == KMSConstant.LOG_DOWNLOAD_FILE) { + FileModel fileModel = fileCache.get(logModel.getFileId()); + if (fileModel != null) { + logJO.put("logContent", "下载文件" + (fileModel == null ? "" : ":" + KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer()))); + } + } else if (logModel.getLogType() == KMSConstant.LOG_ACCESS_FILE) { + FileModel fileModel = fileCache.get(logModel.getFileId()); + if (fileModel != null) { + if (fileModel.getFileState() == 2) { + JSONObject formJO = JSONObject.parseObject(fileModel.getFileName()); + String fileName = formJO.getString("formName"); + logJO.put("logContent", "浏览表单" + (fileModel == null ? "" : ":" + fileName)); + } else { + logJO.put("logContent", "浏览文件" + (fileModel == null ? "" : ":" + KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer()))); + } + } + } + logJO.put("accessUsername", UserCache.getModel(logModel.getAccessUser()) == null ? logModel.getAccessUser() : UserCache.getModel(logModel.getAccessUser()).getUserName()); + logJO.put("accessTime", UtilDate.datetimeFormat(logModel.getAccessTime(), "yyyy-MM-dd HH:mm")); + + logJA.add(logJO); + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", logJA); + dataJson.put("totalRecords", logService.totalRecords); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 展示最新评论 + * + * @return + * @author wangshibao + */ + public String getLatestComment() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + List optModels = new OptService().getLatestComment(getContext().getUID()); + CardCache cardCache = CardCache.getCache(); + JSONArray optJA = new JSONArray(); + PortalAPI portalAPI = SDK.getPortalAPI(); + for (OptModel optModel : optModels) { + JSONObject optJO = new JSONObject(); + optJO.put("cardId", optModel.getCardId()); + optJO.put("cardName", cardCache.get(optModel.getCardId()).getCardName()); + optJO.put("optUser", UserCache.getModel(optModel.getOptUser()) == null ? optModel.getOptUser() : UserCache.getModel(optModel.getOptUser()).getUserName()); + optJO.put("optUserPhoto", portalAPI.getUserPhoto(getContext(), optModel.getOptUser())); + optJO.put("optTime", UtilDate.datetimeFormat(optModel.getOptTime(), "yyyy-MM-dd HH:mm")); + optJO.put("optContent", optModel.getOptContent()); + optJA.add(optJO); + } + responseObject.put("optJA", optJA); + return responseObject.toString(); + } + + /** + * 发送阅读邀请(依赖通知应用) + * + * @return + * @author wangshibao + */ + public String sendBrowseInvitation(String dimensionId,String cardId, String targetUsers) { + ResponseObject responseObject = null; + AppContext notificationApp = SDK.getAppAPI().getAppContext("com.actionsoft.apps.notification"); + if (SDK.getAppAPI().isActive(notificationApp)) { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + responseObject = ResponseObject.newErrResponse("知识不存在"); + return responseObject.toString(); + } + // 服务地址 + String aslp = "aslp://com.actionsoft.apps.notification/sendMessage"; + Map params = new HashMap(); + try { + targetUsers = URLDecoder.decode(targetUsers, StandardCharsets.UTF_8.name()); + targetUsers = SDK.getORGAPI().getUserIds(targetUsers); + params.put("sender", getContext().getUID()); + params.put("targetIds", targetUsers); + params.put("sourceId", cardId); + JSONObject json = new JSONObject(); + json.put("cardId", cardId); + json.put("dimensionId", dimensionId); + json.put("inviteUser", getContext().getUserName()); + json.put("cardName", cardModel.getCardName()); + params.put("content", json.toString()); + params.put("level", "info"); + params.put("systemName", KMSConstant.NOTIFICATION_SYSTEM_NAME); + /*// 开发者的应用没有申请开通通知服务 + NotificationAppProfile profile = NotificationAppManager.getProfile(KMSConstant.APP_ID, KMSConstant.NOTIFICATION_SYSTEM_NAME); + if (profile == null) { + return ResponseObject.newErrResponse().err("未找到注册信息").toString(); + }*/ + /*// 是否由管理员暂时关闭了该项服务,不接收了(默认为开启) + NotificationCfgModel cfg = NotificationCfgCache.getModel(profile.getId()); + if (cfg != null && cfg.isClose()) { + return ResponseObject.newWarnResponse().warn("消息通知服务已暂停").toString(); + }*/ + //异步发送避免人数太多慢 + new Thread(new Runnable() { + @Override + public void run() { + ResponseObject result = SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext(KMSConstant.APP_ID), aslp, params); + if (!result.isOk()) { + throw new AWSException(result.getMsg()); + } + } + }).start(); + responseObject = ResponseObject.newOkResponse().msg("发送邀请成功"); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + responseObject = ResponseObject.newErrResponse("通知中心应用不可用,无法发送阅读邀请"); + } + return responseObject.toString(); + } + + /** + * 工作网络树页面 + * + * @return + */ + public String getNetWorkPage(String cardId) { + String pagename = "com.actionsoft.apps.kms.network.html"; + Map result = new HashMap(); + result.put("sid", super.getSIDFlag()); + result.put("cardId", cardId); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, pagename, result); + } + + /** + * 获工作网络数据 + * + * @return + */ + public String getNetworkTree() { + JSONArray networkList = new JSONArray(); + AppAPI appAPI = SDK.getAppAPI(); + String sid = this.getContext().getSessionId(); + String aslp = "aslp://com.actionsoft.apps.network/queryNetworks"; + Map params = new HashMap(); + params.put("sid", sid); + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + if (ro.toJsonObject().get("data") != null) { + JSONArray networks = JSONObject.parseObject(ro.toDataString()).getJSONArray("networks"); + + for (int i = 0; i < networks.size(); i++) { + JSONObject network = networks.getJSONObject(i); + JSONObject object = new JSONObject(); + String networkid = network.getString("id"); + object.put("id", networkid); + object.put("name", network.getString("networkName")); + object.put("nodetype", "0"); + object.put("open", true); + object.put("icon", "../apps/com.actionsoft.apps.network/img/icon16.png"); + networkList.add(object); + + // 服务地址 + Map params1 = new HashMap(); + String aslp1 = "aslp://com.actionsoft.apps.network/queryTeams"; + params1.put("networkId", networkid); + params1.put("sid", sid); + params1.put("join", true); + ResponseObject ro1 = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp1, params1); + if (ro1.toJsonObject().get("data") != null) { + JSONArray teams = JSONObject.parseObject(ro1.toDataString()).getJSONArray("teams"); + if (teams != null && teams.size() > 0) { + for (int j = 0; j < teams.size(); j++) { + JSONObject team = teams.getJSONObject(j); + JSONObject object1 = new JSONObject(); + object1.put("id", team.getString("id")); + object1.put("pid", networkid); + object1.put("name", team.getString("teamName")); + object1.put("nodetype", "1"); + object1.put("icon", "../apps/com.actionsoft.apps.cms/img/system/networkteam.png"); + + networkList.add(object1); + } + } + + } + } + } + return networkList.toString(); + } + + /** + * 分享到工作网络 + * + * @param cardId + * @param teamId + * @param networkId + * @return + * @author wangshibao + */ + public String shareToNetwork(String cardId, String teamId, String networkId) { + AppAPI appAPI = SDK.getAppAPI(); + ResponseObject result = ResponseObject.newOkResponse("分享成功"); + try { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + result.err("知识不存在"); + return result.toString(); + } + // aslp服务地址 + String aslp = "aslp://com.actionsoft.apps.network/createStream"; + // 参数定义列表 + Map params = new HashMap(); + params.put("sid", getContext().getSessionId()); + // 消息内容,必填 + params.put("message", "我分享了一个知识:" + cardModel.getCardName()); + // 链接,非必填 + params.put("link", "@portalUrl/r/w?sid=@sid&cmd=com.actionsoft.apps.kms_knwl_center_browse_card_page&cardId=" + cardId); + // 小组ID,非必填 + params.put("teamId", teamId); + // 工作网络ID,非必填 + params.put("networkId", networkId); + // 信息流来自,如_bpm.coe,非必填 + params.put("sourceAppId", KMSConstant.APP_ID); + // 信息流来源,如CoE.PAL.Designer、CoE.BPA,非必填 + params.put("sourceType", "KMS.CARD"); + // 来源ID,如知识地图Id并支持@公式,非必填 + params.put("sourceId", cardId); + // 向工作网络创建一条新信息流 + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(KMSConstant.APP_ID), aslp, params); + if (!ro.isOk()) { + ro.msg("分享失败:" + ro.getMsg()); + return ro.toString(); + } + } catch (Exception e) { + e.printStackTrace(); + result.err("分享失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 移动知识 + * + * @param cardIds + * @param dimensionIds 目标维度 + * @param currDimensionId 知识当前所在维度 + * @return + * @author wangshibao + */ + public String moveCard(String cardIds, String dimensionIds, String currDimensionId) { + JSONArray cardJA = JSONArray.parseArray(cardIds); + JSONArray dimensionJA = JSONArray.parseArray(dimensionIds); + new PublishService().moveCard(Arrays.asList(cardJA.toArray(new String[0])), Arrays.asList(dimensionJA.toArray(new String[0])), currDimensionId, getContext().getUID()); + return ResponseObject.newOkResponse("移动成功").toString(); + } + + /** + * 复制知识 + * + * @param cardIds + * @param dimensionIds 目标维度 + * @param currDimensionId 知识当前所在维度 + * @return + * @author wangshibao + */ + public String copyCard(String cardIds, String dimensionIds, String currDimensionId) { + JSONArray cardJA = JSONArray.parseArray(cardIds); + JSONArray dimensionJA = JSONArray.parseArray(dimensionIds); + new PublishService().copyCard(Arrays.asList(cardJA.toArray(new String[0])), Arrays.asList(dimensionJA.toArray(new String[0])), currDimensionId, getContext().getUID()); + return ResponseObject.newOkResponse("复制成功").toString(); + } + + /** + * 移交知识 + * + * @param cardIds 知识id + * @param handoverCardUser 移交人 + * @return + * @author wangshibao + */ + public String changeCardUser(String cardIds, String handoverCardUser) { + JSONArray cardJA = JSONArray.parseArray(cardIds); + new PublishService().changeCardUser(Arrays.asList(cardJA.toArray(new String[0])), handoverCardUser); + return ResponseObject.newOkResponse("移交成功").toString(); + } + + /** + * 检查知识下是否存在文件 + * + * @param cardIds + * @return + * @author wangshibao + */ + public String checkCardHasFile(String cardIds) { + CardService cardService = new CardService(); + String cardId = cardService.checkCardHasFile(JSONArray.parseArray(cardIds, String.class)); + if (cardId == null) { + return ResponseObject.newOkResponse().toString(); + } else { + return ResponseObject.newErrResponse("知识[" + CardCache.getCache().get(cardId).getCardName() + "]没有文件或知识内容,不允许发布该知识").toString(); + } + } + + /** + * 浏览器预览(区别于onlinedoc) + * + * @param fileId + * @return + * @author wangshibao + */ + public String browserPreview(String fileId) { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel == null) { + throw new AWSException("文件不存在"); + } + {// 记录日志 + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(fileModel.getCardId()); + logModel.setFileId(fileId); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_ACCESS_FILE); + KMSLogUtil.log(logModel); + } + if (fileModel.getFileState() != 2) {//非表单链接 + CardModel cardModel = CardCache.getCache().get(fileModel.getCardId()); + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel == null ? getContext().getUID() : cardModel.getCreateUser(), fileModel.getCardId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + String url = dcContext.getDownloadURL(); + String fileType = KMSUtil.getFileSuffix(fileModel.getFileName()).toUpperCase(); + List imageSuffix = Arrays.asList(new String[] { "BMP", "JPG", "JPEG", "PNG", "GIF", "ICO" }); + return ResponseObject.newOkResponse().put("isImg", imageSuffix.contains(fileType)).put("url", url).toString(); + } else {//表单链接 + String url = "./w?sid=" + getContext().getSessionId() + "&cmd=com.actionsoft.apps.kms_knwl_browser_preview_form&fileId=" + fileId; + //5平台导入的链接 + try { + JSONObject formJO = JSONObject.parseObject(fileModel.getFileName()); + if (formJO.containsKey("linkUrl")) { + url = SDK.getRuleAPI().executeAtScript("@AWS5WebURL(" + formJO.getString("linkUrl") + ")", this.getContext()); + } + } catch (Exception e) { + + } + return ResponseObject.newOkResponse().put("isImg", false).put("url", url).toString(); + } + + } + + /** + * 浏览器预览图片 + * + * @param fileId + * @return + * @author wangshibao + */ + public String browserPreviewImg(String fileId) { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel == null) { + throw new AWSException("文件不存在"); + } + CardModel cardModel = CardCache.getCache().get(fileModel.getCardId()); + DCContext dcContext = new DCContext(super.getContext(), DCProfileManager.getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_NAME), KMSConstant.APP_ID, cardModel == null ? getContext().getUID() : cardModel.getCreateUser(), fileModel.getCardId(), KMSUtil.getFileNameOfVersion(fileModel.getFileName(), fileModel.getFileVer())); + String url = dcContext.getDownloadURL(); + Map macroLibraries = new HashMap(); + macroLibraries.put("url", url); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.browserPreview.htm", macroLibraries); + } + + /** + * 预览表单 + * + * @param fileId + * @return + */ + public String browserPreviewForm(String fileId) { + FileModel fileModel = FileCache.getCache().get(fileId); + if (fileModel == null) { + throw new AWSException("文件不存在"); + } + JSONObject formJO = JSONObject.parseObject(fileModel.getFileName()); + String processInstId = formJO.getString("processInstId"); + String taskInstId = formJO.getString("taskInstId"); + return SDK.getFormAPI().getFormPage(getContext(), processInstId, taskInstId, UserTaskRuntimeConst.STATE_TYPE_CC, 1, null, null); + } + + /** + * 加载公共维度知识列表html + * + * @return + * @author wangshibao + */ + public String dimensionGridHtml() { + + KMSUtil kmsUtil=new KMSUtil(); + String userSecurity = kmsUtil.getUserSecurityLevelLabel(getContext()); + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("userSecurity", userSecurity); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + if ("1".equals(hasOnlineLevel)) { + macroLibraries.put("hasOnlineLevel", ""); + } else { + macroLibraries.put("hasOnlineLevel", "none"); + } + String html = HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.dimensiongrid.html", macroLibraries); + return ResponseObject.newOkResponse().put("html", html).toString(); + } + + /** + * 独立知识展示页面iframe + * + * @param dimensionId + * @return + * @author wangshibao + */ + public String dimensionGridPageIframe(String dimensionId) { + // 判断权限 + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + throw new AWSException("知识分类不存在"); + } + boolean canAccessDimension = KMSUtil.isKnwlManager(getContext().getUID()) || KMSUtil.canAccessDimension(dimensionId, getContext().getUID()); + if (!canAccessDimension) { + throw new AWSException("没有该知识分类的访问权限"); + } + + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("uid", getContext().getUID()); + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + + macroLibraries.put("showType", dimensionModel.getShowType()); + macroLibraries.put("dimensionId", dimensionId); + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.dimensiongridPageIframe.html", macroLibraries); + } + + /** + * 独立知识展示页面 + * + * @param dimensionId + * @return + * @author wangshibao + */ + public String dimensionGridPage(String dimensionId) { + // 判断权限 + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + throw new AWSException("知识分类不存在"); + } + boolean canAccessDimension = KMSUtil.isKnwlManager(getContext().getUID()) || (KMSUtil.canAccessDimension(dimensionId, getContext().getUID())); + if (!canAccessDimension) { + throw new AWSException("没有该知识分类的访问权限"); + } + + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("uid", getContext().getUID()); + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + + macroLibraries.put("showType", dimensionModel.getShowType()); + macroLibraries.put("dimensionId", dimensionId); + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.dimensiongridPage.html", macroLibraries); + } + + /* + * 加积分(发布知识,下载,预览知识卡片,预览文件) + */ + public String addPoint(UserContext uc, String sourceId, String pointType, int point) throws AWSAPIException { + //调用增加积分aslp + ResponseObject ro = null; + // if(SDK.getAppAPI().getProperty("com.actionsoft.apps.points", "POINT_TYPE").equals(KMSConstant.POINT_ISADD_POINT)) { + String aslp = "aslp://com.actionsoft.apps.points/createPonit"; + Map maps = new HashMap(); + Map params = new HashMap(); + JSONArray array = new JSONArray(); + JSONArray sourceIdArr = new JSONArray(); + String runWaterDesc = null; + if (KMSConstant.POINT_DOWN_LOAD.equals(pointType)) { + FileDao fileDao = new FileDao(); + FileModel fileModel = fileDao.queryById(sourceId); + maps.put("pointType", KMSConstant.POINT_DOWN_LOAD); + maps.put("sourceId", sourceId); + runWaterDesc = "下载了《" + fileModel.getFileName() + "》"; + maps.put("desc", runWaterDesc); + array.add(maps); + } else if (KMSConstant.POINT_LOOK_ATFILE.equals(pointType)) { + FileDao fileDao = new FileDao(); + FileModel fileModel = fileDao.queryById(sourceId); + maps.put("pointType", KMSConstant.POINT_LOOK_ATFILE); + maps.put("sourceId", sourceId); + runWaterDesc = "预览了《" + fileModel.getFileName() + "》"; + maps.put("desc", runWaterDesc); + array.add(maps); + } else if (KMSConstant.POINT_LOOK_ATCART.equals(pointType)) { + CardDao cardDao = new CardDao(); + CardModel cardModel = cardDao.queryById(sourceId); + maps.put("pointType", KMSConstant.POINT_LOOK_ATCART); + maps.put("sourceId", sourceId); + runWaterDesc = "阅读了知识卡片《" + cardModel.getCardName() + "》"; + maps.put("desc", runWaterDesc); + array.add(maps); + } else { + CardDao cardDao = new CardDao(); + sourceIdArr = JSONArray.parseArray(sourceId); + for (int i = 0; i < sourceIdArr.size(); i++) { + String cardId = String.valueOf(sourceIdArr.get(i)); + CardModel cardModel = cardDao.queryById(cardId); + runWaterDesc = "发布知识《" + cardModel.getCardName() + "》"; + maps.put("desc", runWaterDesc); + maps.put("sourceId", cardId); + maps.put("pointType", KMSConstant.POINT_PUBLSH); + array.add(maps); + maps = new HashMap(); + runWaterDesc = null; + } + } + params.put("point", point);//积分数量 + params.put("uid", uc.getUID());//用户Uid + params.put("array", array); + SDK.getAppAPI().asynCallASLP(SDK.getAppAPI().getAppContext("com.actionsoft.apps.points"), aslp, params); + ro = ResponseObject.newOkResponse("调用增加积分aslp"); + // }else { + // ro = ResponseObject.newWarnResponse("未调用增加积分aslp"); + // } + return ro.toString(); + } + + private String getFilePreviewJs(UserContext me, String fileName, String downLoadUrl) throws UnsupportedEncodingException { + StringBuilder js = new StringBuilder("mobileOpenUrl("); + String openType = "window"; + String url = downLoadUrl; + if (downLoadUrl.contains("&openNewWebview=true")) { + openType = "awsWebview"; + url = downLoadUrl; + } else { + if (!SDK.getAppAPI().isActive("com.actionsoft.apps.addons.wpsonline") && isImage(fileName)) { + if (getContext().isMobileClient()) { + url = "./w?sid=" + me.getSessionId() + "&cmd=CLIENT_MOBILE_VIEW_IMG&url=" + URLEncoder.encode(downLoadUrl, "UTF-8"); + } else { + openType = "awsWebview"; + url = SDK.getConfAPI().getMobileUrl() + "/r/w?sid=" + me.getSessionId() + "&cmd=CLIENT_MOBILE_VIEW_IMG&url=" + URLEncoder.encode(downLoadUrl, "UTF-8"); + } + } + + } + js.append("'" + openType + "','" + url + "');"); + return js.toString(); + } + + protected String getFileUrlForMobile(String fileName, UserContext me, DCContext dcContext) { + + if (SDK.getAppAPI().isActive("com.actionsoft.apps.addons.wpsonline")) { + if (matchExt(fileName)) { + AppAPI appAPI = SDK.getAppAPI(); + String sourceAppId = "_bpm.platform"; + //判断是否是加密文件 + boolean isEncrypt = true; + Map params = new HashMap(); + params.put("sid", me.getSessionId()); + params.put("fileNameOriginal", fileName); + params.put("sourceDc", dcContext); + params.put("isCopy", true);//20180919 移动端表单预览附件改为pdf格式预览 + params.put("isPrint", false); + params.put("isEncrypt", isEncrypt); + params.put("isDownload", false); + params.put("isShowDefaultToolbar", false); + // long start = System.currentTimeMillis(); + ResponseObject responseObject = appAPI.callASLP(appAPI.getAppContext(sourceAppId), "aslp://com.actionsoft.apps.addons.wpsonline/filePreviewUrl", params); + // long end = System.currentTimeMillis(); + // System.out.println(fileName+"-------用时:"+(end-start)); + if (responseObject != null) { + if (responseObject.isOk()) { + String url = responseObject.get("url").toString(); + if (!UtilString.isEmpty(url)) { + if (url.startsWith("./w")) { + url = SDK.getConfAPI().getMobileUrl() + "/r" + url.substring(1); + } + return url + (!getContext().isMobileClient() ? "&openNewWebview=true" : ""); + } + } else { + // TODO ? + } + } + } + + } else if (SDK.getAppAPI().isActive("com.actionsoft.apps.poi.converter")) { + if (fileName.endsWith(".doc") || fileName.endsWith(".docx") || fileName.endsWith(".ppt") || fileName.endsWith(".pptx") || fileName.endsWith(".xls") || fileName.endsWith(".xlsx") || fileName.endsWith(".pdf")) { + String aslp = "aslp://com.actionsoft.apps.poi.converter/fileToHTML"; + // 参数定义列表 + Map params = new HashMap(); + // 要发送的消息,参数必须 + params.put("dcContext", dcContext.toJson()); + // 企业号CorpId,参数必须 + params.put("sid", me.getSessionId()); + // 执行API + ResponseObject ro = SDK.getAppAPI().callASLP(SDK.getAppAPI().getAppContext("com.actionsoft.apps.poi.converter"), aslp, params); + if (ro.isOk()) { + String url = (String) ro.get("url"); + if (!UtilString.isEmpty(url)) { + if (url.startsWith("./w")) { + url = SDK.getConfAPI().getMobileUrl() + "/r" + url.substring(1); + } + return url + (!getContext().isMobileClient() ? "&openNewWebview=true" : ""); + } + } else { + // TODO ? + } + } + } + return dcContext.getDownloadURL() + (isImage(fileName) ? "" : "&mobileAttachment=true"); + } + + protected boolean isImage(String fileName) { + return (fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".png") || fileName.toLowerCase().endsWith(".bmp") || fileName.toLowerCase().endsWith(".gif") || fileName.toLowerCase().endsWith(".jpeg")); + } + + private boolean matchExt(String fileName) { + for (String ext : exts) { + if (fileName.toLowerCase().endsWith(ext)) { + return true; + } + } + return false; + } + + public String dimensionWriteLog(String fileId, String cardId) { + LogModel logModel = new LogModel();// ID在log方法内设置,提高性能 + logModel.setAccessTime(new Timestamp(System.currentTimeMillis())); + logModel.setAccessUser(getContext().getUID()); + logModel.setCardId(cardId); + logModel.setFileId(null); + logModel.setLogInfo("上传附件:" + fileId); + logModel.setIpAddress(DispatcherRequest.getContext().getIp()); + logModel.setLogType(KMSConstant.LOG_ACCESS_OTHER); + KMSLogUtil.log(logModel); + return ""; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMgrWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMgrWeb.java new file mode 100644 index 00000000..bc7ff525 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMgrWeb.java @@ -0,0 +1,1200 @@ +package com.actionsoft.apps.kms.web; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.AppsConst; +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.DimensionMgrACCM; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.apps.kms.model.MetaSchemaModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.kms.service.MetaAttrService; +import com.actionsoft.apps.kms.service.MetaSchemaService; +import com.actionsoft.apps.kms.service.PublishService; +import com.actionsoft.bpms.commons.database.LocalTxManager; +import com.actionsoft.bpms.commons.htmlframework.AlertWindow; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.security.ac.cache.AccessControlCache; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.commons.security.high.constant.SecurityLevelConst; +import com.actionsoft.bpms.org.cache.CompanyCache; +import com.actionsoft.bpms.org.cache.DepartmentCache; +import com.actionsoft.bpms.org.cache.RoleCache; +import com.actionsoft.bpms.org.cache.TeamCache; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.CompanyModel; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.RoleModel; +import com.actionsoft.bpms.org.model.TeamModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.Html; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.exception.AWSForbiddenException; +import com.actionsoft.exception.AWSObjectNotFindException; +import com.actionsoft.i18n.I18nRes; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 知识维护(KMS后台)web类 + * + * @author wangshibao + */ +public class KnwlMgrWeb extends ActionWeb { + public KnwlMgrWeb(UserContext me) { + super(me); + } + + /** + * 知识维护和系统维护的home页 + * + * @param page + * @return + * @author wangshibao + */ + public String getMgrHome(String page, String tab) { + Map macroLibraries = new HashMap(); + boolean hasDimensionPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_DIMENSION_MGR); + boolean hasMetaPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_META_MGR); + boolean hasValidDatePerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_VALIDDATE_MGR); + boolean hasSystemMgrPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_SYSTEM_MGR); + if (!hasDimensionPerm && !hasMetaPerm && !hasValidDatePerm && !hasSystemMgrPerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + macroLibraries.put("hasKnwlMgrNavPerm", hasDimensionPerm || hasMetaPerm || hasValidDatePerm); + macroLibraries.put("hasSystemMgrPerm", hasSystemMgrPerm); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("page", page); + macroLibraries.put("tab", tab); + + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + macroLibraries.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + macroLibraries.put("blackFileList", systemParamJO.getString("blackFileList")); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + String label1 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_0_TEXT); + String label2 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_1_TEXT); + String label3 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_2_TEXT); + String label4 = I18nRes.findValue(AppsConst.SYS_APP_PORTAL, SecurityLevelConst.LAYER_3_TEXT); + macroLibraries.put("label1", label1); + macroLibraries.put("label2", label2); + macroLibraries.put("label3", label3); + macroLibraries.put("label4", label4); + String hasOnlineLevel = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "hasOnlineLevel"); + macroLibraries.put("hasOnlineLevel", hasOnlineLevel); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mgr.iframe.htm", macroLibraries); + } + + /** + * 知识维护home页 + * + * @return html + * @author wangshibao + */ + public String getKnwlMgrHome() { + // 判断菜单权限 + boolean hasDimensionPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_DIMENSION_MGR); + boolean hasMetaPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_META_MGR); + boolean hasValidDatePerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_VALIDDATE_MGR); + if (!hasDimensionPerm && !hasMetaPerm && !hasValidDatePerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + boolean isSysAdmin = SDK.getPermAPI().isSystemAdministrator(getContext().getUID()); + macroLibraries.put("isSysAdmin", isSysAdmin); + + macroLibraries.put("isKnwlMgr", KMSUtil.isKnwlManager(getContext().getUID())); + + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + macroLibraries.put("hasDimensionPerm", hasDimensionPerm); + macroLibraries.put("hasMetaPerm", hasMetaPerm); + macroLibraries.put("hasValidDatePerm", hasValidDatePerm); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_mgr.htm", macroLibraries); + } + + /** + * 获取维度树json数据 + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionTreeJson(String parentId) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + if (UtilString.isEmpty(parentId)) { + JSONObject rootDimensionJO = new JSONObject(); + rootDimensionJO.put("id", "root"); + rootDimensionJO.put("name", "维度结构"); + if (dimensionService.isExistChildForQueryTreeMgrDimensionsByParentId("", getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID()))) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + rootDimensionJO.put("open", true); + } + rootDimensionJO.put("iconCls", "treeRoot"); + // 知识管理员能新建第一层维度 + rootDimensionJO.put("hasPerm", isKnwlMgr); + dimensionJA.add(rootDimensionJO); + } + if ("root".equals(parentId)) { + parentId = ""; + } + try { + List dimensionModels = dimensionService.queryTreeMgrDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", Html.htmlEscape(dimensionModel.getDimensionName())); + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } else { + dimensionJO.put("pid", "root"); + } + + if (dimensionService.isExistChildForQueryTreeMgrDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + public boolean hasRepeatDimension(JSONArray dimensions, DimensionModel dimensionModel) { + for (int i = 0; i < dimensions.size(); i++) { + JSONObject dimensionJO = dimensions.getJSONObject(i); + if (dimensionModel.getId().equals(dimensionJO.getString("id"))) { + return true; + } + } + return false; + } + /** + * 获取设置知识地图的json数据(无root维度) + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionBindHotspotTreeJson(String parentId) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + try { + List dimensionModels = dimensionService.queryTreeEnabledDimensionsByParentId(parentId); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForTreeEnabledDimensionsByParentId(dimensionModel.getId())) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + dimensionJO.put("showType", dimensionModel.getShowType()); + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 获取维度树json数据 + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionValiddateTreeJson(String parentId) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + if ("root".equals(parentId)) { + parentId = ""; + } + try { + List dimensionModels = dimensionService.queryTreeMgrDimensionsByParentId(parentId, getContext().getUID(), KMSUtil.isKnwlManager(getContext().getUID())); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + if (!dimensionModel.isHasPerm()) { + dimensionJO.put("nocheck", true); + } + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForQueryTreeMgrDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeHotspot-noPerm"); + } + } + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 获取维度树json数据-全部数据 + * + * 限于树的功能不完整,此处采用全部加载数据,用来达到选中父节点级联查出所有后代节点的效果 + * + * @return JSON + * @author wangshibao + */ + public String getDimensionValiddateTreeAllJson() { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + String parentId = ""; + try { + fillDimensionValiddateTreeData(dimensionService, dimensionJA, parentId, KMSUtil.isKnwlManager(getContext().getUID())); + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 递归查询所有维度-有效期查询 + * + * @param dimensionService + * @param dimensionJA + * @param parentId + * @author wangshibao + */ + private void fillDimensionValiddateTreeData(DimensionService dimensionService, JSONArray dimensionJA, String parentId, boolean isKnwlMgr) { + List dimensionModels = dimensionService.queryTreeMgrDimensionsByParentId(parentId, getContext().getUID(), isKnwlMgr); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + if (!dimensionModel.isHasPerm()) { + dimensionJO.put("nocheck", true); + } + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForQueryTreeMgrDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeHotspot-noPerm"); + } + } + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + dimensionJA.add(dimensionJO); + } + fillDimensionValiddateTreeData(dimensionService, dimensionJA, dimensionModel.getId(), isKnwlMgr); + } + } + + /** + * 获取维度列表json数据 + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getDimensionListJson(String parentId) { + if ("root".equals(parentId)) { + parentId = ""; + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + try { + JSONArray dimensionJA = new JSONArray(); + DimensionService dimensionService = new DimensionService(); + List dimensionModels = dimensionService.queryListMgrDimensionsByParentId(parentId, getContext().getUID()); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("dimensionName",Html.htmlEscape(dimensionModel.getDimensionName()) ); + dimensionJO.put("showType", dimensionModel.getShowType()); + dimensionJO.put("isExamine", dimensionModel.getIsExamine()); + dimensionJO.put("memo", dimensionModel.getMemo()); + dimensionJO.put("createUsername", UserCache.getModel(dimensionModel.getCreateUser()) == null ? dimensionModel.getCreateUser() : UserCache.getModel(dimensionModel.getCreateUser()).getUserName()); + dimensionJO.put("createTime", UtilDate.datetimeFormat(dimensionModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + dimensionJO.put("isEnabled", dimensionModel.getIsEnabled()); + dimensionJO.put("showtype", dimensionModel.getShowType()); + dimensionJO.put("hotspotDefId", dimensionModel.getHotspotDefId()); + dimensionJO.put("orderIndex", dimensionModel.getOrderIndex()); + + dimensionJA.add(dimensionJO); + } + } + responseObject.setData(dimensionJA); + } catch (Exception e) { + throw new AWSException(e); + } + return responseObject.toString(); + } + + /** + * 新建维度 + * + * @param dimensionNames 维度名称 + * @param parentId 父维度id + * @param showtype 展示类型 + * @param isExamine 发布前是否需要审批 + * @param memo 描述 + * @param hotspotName 知识地图名称 + * @param isEnabled 是否启用 + * @return JSON + * @author wangshibao + */ + public String createDimension(String dimensionNames, String parentId, boolean showtype, boolean isPublishKnwl, boolean isExamine, String memo, String hotspotName, boolean isEnabled) { + if ("root".equals(parentId)) { + parentId = ""; + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + try { + + // 根据showtype(普通维度或者热点图)和isPublishKnwl(普通维度时:允许发布知识或者不允许发布知识)计算出真正的showtype + int evaluatedShowType = KMSConstant.SHOWTYPE_DIMENSION; + if (showtype) {// 知识地图 + evaluatedShowType = KMSConstant.SHOWTYPE_HOTSPOT; + } else {// 非知识地图 + if (isPublishKnwl) {// 允许发布知识 + evaluatedShowType = KMSConstant.SHOWTYPE_DIMENSION; + } else {// 不允许发布知识 + evaluatedShowType = KMSConstant.SHOWTYPE_CATEGORY; + } + } + + DimensionService dimensionService = new DimensionService(); + List dimensionNameList = JSONArray.parseArray(dimensionNames, String.class); + for (String dimensionName : dimensionNameList) { + dimensionService.createDimension(dimensionName, parentId, evaluatedShowType, isExamine, memo, super.getContext().getUID(), hotspotName, isEnabled); + } + } catch (Exception e) { + throw new AWSException(e); + } + return responseObject.toString(); + } + + /** + * 修改维度 + * + * @param id 维度id + * @param dimensionName 维度名称 + * @param showtype 展示类型 + * @param isExamine 发布前是否需要审批 + * @param memo 描述 + * @param hotspotName 知识地图名称 + * @param isEnabled 是否启用 + * @return JSON + * @author wangshibao + */ + public String updateDimension(String id, String dimensionName, boolean showtype, boolean isPublishKnwl, boolean isExamine, String memo, String hotspotName, boolean isEnabled) { + ResponseObject responseObject = null; + try { + DimensionService dimensionService = new DimensionService();// 根据showtype(普通维度或者热点图)和isPublishKnwl(普通维度时:允许发布知识或者不允许发布知识)计算出真正的showtype + int evaluatedShowType = KMSConstant.SHOWTYPE_DIMENSION; + if (showtype) {// 知识地图 + evaluatedShowType = KMSConstant.SHOWTYPE_HOTSPOT; + } else {// 非知识地图 + if (isPublishKnwl) {// 允许发布知识 + evaluatedShowType = KMSConstant.SHOWTYPE_DIMENSION; + } else {// 不允许发布知识 + evaluatedShowType = KMSConstant.SHOWTYPE_CATEGORY; + } + } + int result = dimensionService.updateDimension(id, dimensionName, evaluatedShowType, isExamine, memo, hotspotName, isEnabled); + if (result == 1) { + responseObject = ResponseObject.newOkResponse(); + } else if (result == 0) { + responseObject = ResponseObject.newErrResponse("修改失败"); + } else { + throw new AWSException("修改结果非预期的:" + result); + } + } catch (Exception e) { + throw new AWSException(e); + } + return responseObject.toString(); + } + + /** + * 删除维度以及后代维度 + * + * @param ids 维度id + * @return JSON + * @author wangshibao + */ + public String deleteDimension(String ids) { + ResponseObject responseObject = null; + try { + DimensionService dimensionService = new DimensionService(); + int result = dimensionService.delete(ids); + responseObject = ResponseObject.newOkResponse("共删除" + result + "条维度"); + } catch (Exception e) { + throw new AWSException(e); + } + return responseObject.toString(); + } + + /** + * 知识维护-元数据-查询列表 + * + * @param curPage + * @param rowsPerPage + * @return JSON + * @author wangshibao + */ + public String getSchemaListJson(int curPage, int rowsPerPage, String sortIndx, String sortDir) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray schemaJA = new JSONArray(); + MetaSchemaService schemaService = new MetaSchemaService(); + List schemaModels = schemaService.querySchemas(curPage, rowsPerPage, sortIndx, sortDir); + for (MetaSchemaModel schemaModel : schemaModels) { + JSONObject schemaJO = new JSONObject(); + schemaJO.put("id", schemaModel.getId()); + schemaJO.put("schemaTitle",Html.htmlEscape(schemaModel.getSchemaTitle()) ); + schemaJO.put("schemaShowtype", schemaModel.getSchemaShowtype()); + schemaJO.put("schemaDesc", schemaModel.getSchemaDesc()); + schemaJO.put("createTime", UtilDate.datetimeFormat(schemaModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + schemaJO.put("lastUpdate", schemaModel.getLastUpdate()); + schemaJO.put("createUser", schemaModel.getCreateUser()); + schemaJO.put("createUsername", UserCache.getModel(schemaModel.getCreateUser()) == null ? schemaModel.getCreateUser() : UserCache.getModel(schemaModel.getCreateUser()).getUserName()); + schemaJO.put("isNullable", schemaModel.getIsNullable()); + schemaJO.put("isSearch", schemaModel.getIsSearch()); + + schemaJA.add(schemaJO); + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", schemaJA); + dataJson.put("totalRecords", schemaService.totalRecordsSchema); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 知识维护-有效期-查询列表 + * + * @param curPage + * @param rowsPerPage + * @return JSON + * @author wangshibao + */ + public String getValidDateCardListJson(int curPage, int rowsPerPage, String dimensionIdArr, String validDateStr, String sortIndx, String sortDir) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray cardJA = new JSONArray(); + CardService cardService = new CardService(); + JSONObject validDateJO = JSONObject.parseObject(validDateStr); + String startValidDateStr = ""; + String endValidDateStr = ""; + if (validDateJO != null) { + startValidDateStr = validDateJO.getString("startValidDate"); + endValidDateStr = validDateJO.getString("endValidDate"); + } + List cardModels = cardService.queryValidDateCards(getContext(), curPage, rowsPerPage, JSONArray.parseArray(dimensionIdArr), UtilDate.parse(startValidDateStr), UtilDate.parse(endValidDateStr), sortIndx, sortDir); + for (CardModel cardModel : cardModels) { + JSONObject cardJO = new JSONObject(); + cardJO.put("id", cardModel.getId()); + cardJO.put("cardName", cardModel.getCardName()); + cardJO.put("cardType", cardModel.getCardType()); + cardJO.put("createUser", cardModel.getCreateUser()); + cardJO.put("createTime", UtilDate.datetimeFormat(cardModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("createUsername", UserCache.getModel(cardModel.getCreateUser()) == null ? cardModel.getCreateUser() : UserCache.getModel(cardModel.getCreateUser()).getUserName()); + cardJO.put("readCount", cardModel.getReadCount()); + cardJO.put("validDate", UtilDate.dateFormat(cardModel.getValidDate())); + cardJO.put("isPublished", cardModel.getIsPublished()); + + cardJA.add(cardJO); + } + JSONObject dataJson = new JSONObject(); + dataJson.put("data", cardJA); + dataJson.put("totalRecords", cardService.totalRecords); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + return responseObject.toString(); + } + + /** + * 获取元数据-属性列表 + * + * @param schemaId + * @return JSON + * @author wangshibao + */ + public String getMetaAttrListJson(String schemaId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + JSONArray metaAttrJA = new JSONArray(); + MetaAttrService metaAttrService = new MetaAttrService(); + List metaAttrModels = metaAttrService.queryMetaAttrs(schemaId); + for (MetaAttrModel metaAttrModel : metaAttrModels) { + JSONObject metaAttrJO = new JSONObject(); + metaAttrJO.put("id", metaAttrModel.getId()); + metaAttrJO.put("attrTitle",Html.htmlEscape(metaAttrModel.getAttrTitle()) ); + metaAttrJO.put("createUsername", UserCache.getModel(metaAttrModel.getCreateUser()) == null ? metaAttrModel.getCreateUser() : UserCache.getModel(metaAttrModel.getCreateUser()).getUserName()); + metaAttrJO.put("createTime", UtilDate.datetimeFormat(metaAttrModel.getCreateTime(), "yyyy-MM-dd HH:mm")); + metaAttrJA.add(metaAttrJO); + } + responseObject.setData(metaAttrJA); + return responseObject.toString(); + } + + /** + * 新建元数据(包括属性) + * + * @param schemaTitle + * @param schemaShowtype + * @param isNullable + * @param isSearch + * @param metaAttr + * @return JSON + * @author wangshibao + */ + public String addMetaSchema(String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + ResponseObject responseObject = ResponseObject.newOkResponse("新建成功"); + MetaSchemaService schemaService = new MetaSchemaService(); + + schemaService.insertSchema(super.getContext(), schemaTitle, schemaShowtype, isNullable, isSearch, schemaDesc, metaAttr); + return responseObject.toString(); + } + + /** + * 修改元数据 + * + * @param schemaId 元数据ID + * @param schemaTitle 元数据名称 + * @param schemaShowtype 元数据展示类型 + * @param isNullable 是否可以为空 + * @param isSearch 是否参与检索 + * @param schemaDesc 描述 + * @param metaAttr 元数据属性的JSON字符串(加密) + * @return + */ + public String updateMetaSchema(String schemaId, String schemaTitle, int schemaShowtype, boolean isNullable, boolean isSearch, String schemaDesc, String metaAttr) { + ResponseObject responseObject = ResponseObject.newOkResponse("修改成功"); + MetaSchemaService schemaService = new MetaSchemaService(); + + schemaService.updateSchema(super.getContext(), schemaId, schemaTitle, schemaShowtype, isNullable, isSearch, schemaDesc, metaAttr); + return responseObject.toString(); + } + + /** + * 删除元数据 + * + * @param schemaIds 元数据ID字符串(英文半角逗号分隔) + * @return + */ + public String deleteSchema(String schemaIds) { + if (UtilString.isEmpty(schemaIds)) { + throw new AWSException("元数据ID不能为空"); + } + ResponseObject responseObject = ResponseObject.newOkResponse("删除成功"); + MetaSchemaService schemaService = new MetaSchemaService(); + + schemaService.deleteSchema(schemaIds.split(",")); + return responseObject.toString(); + } + + /** + * 移动维度 + * + * @param sourceDimensionId 源维度ID + * @param targetDimensionId 目标维度ID + * @param sort 排序方法 above-上 below-下 append-追加到父节点最后 + * @return + * @author wangshibao + */ + public String moveDimension(String sourceDimensionId, String targetDimensionId, String sort) { + try { + DimensionService dimensionService = new DimensionService(); + dimensionService.moveDimension(sourceDimensionId, targetDimensionId, sort); + return ResponseObject.newOkResponse().toString(); + } catch (AWSException e) { + e.printStackTrace(); + return ResponseObject.newErrResponse().msg(e.getMessage()).toString(); + } catch (Exception e) { + e.printStackTrace(); + return ResponseObject.newErrResponse().msg("内部错误").toString(); + } + } + + /** + * 延期日期 + * + * @param cardIdArr 维度JSON数组 + * @param validDate 延期日期 + * @return + * @author wangshibao + */ + public String delayValiddate(String cardIdArr, String validDate) { + try { + CardService cardService = new CardService(); + cardService.delayValiddate(JSONArray.parseArray(cardIdArr), validDate); + } catch (Exception e) { + e.printStackTrace(); + return ResponseObject.newErrResponse(e.getMessage()).toString(); + } + return ResponseObject.newOkResponse().toString(); + } + + /** + * 元数据排序 + * + * @param sourceId + * @param targetId + * @return + * @author wangshibao + */ + public String saveMetaSchemaOrderIndex(String sourceId, String targetId) { + new MetaSchemaService().saveMetaSchemaOrderIndex(sourceId, targetId); + return ResponseObject.newOkResponse().toString(); + } + + /** + * 有效期-取消发布知识(全部维度)前的检查(返回已经发布在的维度名称让用户确认使用) + * + * @param cardId + * @return + * @author wangshibao + */ + public String cancelPublishesCardCheck(String cardId) { + CardModel cardModel = CardCache.getCache().get(cardId); + if (cardModel == null) { + throw new AWSException("知识不存在"); + } + PublishService publishService = new PublishService(); + List publishModels = publishService.queryPublishByCardId(cardId); + JSONArray publishJA = new JSONArray(); + for (PublishModel publishModel : publishModels) { + try { + JSONObject publishJO = new JSONObject(); + publishJO.put("dimensionName", DimensionCache.getCache().get(publishModel.getDimensionId()).getDimensionName()); + publishJA.add(publishJO); + } catch (Exception e) { + + } + } + ResponseObject ro = ResponseObject.newOkResponse(); + ro.put("publishModels", publishJA); + return ro.toString(); + } + + /** + * 有效期-取消发布知识(全部维度) + * + * @param cardId + * @return + * @author wangshibao + */ + public String cancelPublishesCard(String cardId) { + ResponseObject ro = ResponseObject.newOkResponse(); + try { + PublishService publishService = new PublishService(); + CardService cardService = new CardService(); + LocalTxManager.getInstance().begin(); + List publishModels = publishService.queryPublishByCardId(cardId); + for (PublishModel publishModel : publishModels) { + boolean deleteResult = publishService.delete(publishModel.getId()); + if (deleteResult) { + // 判断并修改知识的发布状态 + cardService.updateCardIsPublishedStatus(publishModel.getCardId()); + // 判断并删除全文检索 + publishService.deleteFullSearch(publishModel.getCardId()); + } + } + + LocalTxManager.getInstance().commit(); + } catch (Exception e) { + if (LocalTxManager.getInstance().inTransaction()) { + LocalTxManager.getInstance().rollback(); + } + e.printStackTrace(); + throw e; + } + return ro.toString(); + } + + /** + * 获取审批时的管理员名称 + * + * @param dimensionId + * @return + * @author wangshibao + */ + public String getExamineUser(String dimensionId) { + String dimensionAdmin = new DimensionService().getDimensionAdmin(dimensionId); + String examineUsers = SDK.getORGAPI().getUserNames(dimensionAdmin); + return ResponseObject.newOkResponse().put("examineUsers", examineUsers).toString(); + } + + /** + * 为usertask属性页设计的页面 + * + * @param formToKMSOptionDimensionIdJA usertask已经配置的维度ID的JSON数组 + * @return + * @author wangshibao + */ + public String getKMSUsertaskHTML(String formToKMSOptionDimensionIdJA) { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("formToKMSOptionDimensionIdJA", formToKMSOptionDimensionIdJA); + macroLibraries.put("usertaskDimensionTreeJson", getUsertaskDimensionTreeJson("", KMSUtil.isKnwlManager(getContext().getUID()))); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.usertask.htm", macroLibraries); + } + + /** + * usertask-获取维度树json数据 + * + * @param parentId 父维度id + * @return JSON + * @author wangshibao + */ + public String getUsertaskDimensionTreeJson(String parentId, boolean isKnwlManager) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + fillUsertaskDimensionTreeJson(parentId, dimensionService, dimensionJA, isKnwlManager); + return dimensionJA.toString(); + } + + private void fillUsertaskDimensionTreeJson(String parentId, DimensionService dimensionService, JSONArray dimensionJA, boolean isKnwlManager) { + try { + List dimensionModels = dimensionService.queryTreeUsertaskDimensionsByParentId(parentId, getContext().getUID(), isKnwlManager); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForQueryTreeUsertaskDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlManager)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + dimensionJO.put("nocheck", true); + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("nocheck", true); + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + dimensionJO.put("nocheck", true); + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } + dimensionJA.add(dimensionJO); + } + fillUsertaskDimensionTreeJson(dimensionModel.getId(), dimensionService, dimensionJA, isKnwlManager); + } + } catch (Exception e) { + throw new AWSException(e); + } + } + + /** + * 维度策略报告 + * + * @param dimensionId + * @return + */ + public String getDimensionReport(String dimensionId) { + //校验权限 + if (UtilString.isEmpty(dimensionId)) { + //是否是管理员或知识管理员 + // if (!KMSUtil.isKnwlManager(getContext().getUID())) { + // throw new AWSForbiddenException("无权访问"); + // } + } else { + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + throw new AWSObjectNotFindException("维度不存在"); + } + // 知识管理员 + if (!KMSUtil.isKnwlManager(getContext().getUID()) && !KMSUtil.isDimensionManager(dimensionId, getContext().getUID()) && !dimensionModel.getCreateUser().equals(getContext().getUID())) { // 过滤权限 + throw new AWSForbiddenException("无权访问"); + } + } + + StringBuilder reportHTML = new StringBuilder(); + if (!UtilString.isEmpty(dimensionId)) { + getDimensionReport(reportHTML, 1, DimensionCache.getCache().get(dimensionId)); + recDimensionReportList(dimensionId, reportHTML, new ParamModel(2)); + } else { + recDimensionReportList(dimensionId, reportHTML, new ParamModel(1)); + } + + Map macroLibraries = new HashMap(); + macroLibraries.put("reportHTML", reportHTML.toString()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_dimension_report.htm", macroLibraries); + } + + /** + * 参数class + */ + class ParamModel { + int order; + + public ParamModel(int order) { + this.order = order; + } + } + + /** + * 递归查询所有子维度 + * + * @param dimensionId + */ + private void recDimensionReportList(String dimensionId, StringBuilder reportHTML, ParamModel paramModel) { + + List dimensionModelsTmp = new DimensionService().queryListMgrDimensionsByParentId(dimensionId); + for (int i = 0; i < dimensionModelsTmp.size(); i++) { + DimensionModel dimensionModel = dimensionModelsTmp.get(i); + if (KMSUtil.isKnwlManager(getContext().getUID()) || KMSUtil.isDimensionManager(dimensionModel.getId(), getContext().getUID()) || dimensionModel.getCreateUser().equals(getContext().getUID())) { + getDimensionReport(reportHTML, paramModel.order, dimensionModel); + paramModel.order++; + } + recDimensionReportList(dimensionModel.getId(), reportHTML, paramModel); + } + + } + + /** + * 获取单条维度报告 + * + * @param reportHTML + * @param order + * @param dimensionModel + */ + private void getDimensionReport(StringBuilder reportHTML, int order, DimensionModel dimensionModel) { + StringBuilder html = new StringBuilder(); + html.append("

"); + // trHTML.append("
" + order + ". " + dimensionModel.getDimensionName() + "
");//维度名称 + html.append("
" + order + ". " + new DimensionService().getDimensionPath(dimensionModel.getId(), " > ") + "
");//维度路径 + html.append("
创建人:" + (UserCache.getCache().get(dimensionModel.getCreateUser()) == null ? dimensionModel.getCreateUser() : UserCache.getCache().get(dimensionModel.getCreateUser()).getUserName()));//创建人 + html.append("    状态:" + (dimensionModel.getIsEnabled() == 1 ? "启用" : "不启用"));//是否启用 + + String publishInfo = ""; + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + publishInfo += "允许发布"; + } else { + publishInfo += "不允许发布"; + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.getIsExamine() == 1) { + publishInfo += ",需要审批"; + } else { + publishInfo += ",无需审批"; + } + } + html.append("," + publishInfo + "
"); + html.append(""); + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION && dimensionModel.getIsExamine() == 1) { + html.append("");//审批人 + } + html.append("");//管理员 + + String accessHTML = getDimensionACHTML(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionModel.getId(), DimensionMgrACCM.ACCESS.getType()); + if (UtilString.isEmpty(accessHTML)) { + accessHTML = "全体人员均可访问"; + } + html.append("");//访问范围 + + String borrowHTML = getDimensionACHTML(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionModel.getId(), DimensionMgrACCM.BORROW.getType()); + if (UtilString.isEmpty(borrowHTML)) { + borrowHTML = "全体人员均无需借阅"; + } + html.append("");//借阅范围 + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + html.append("
" + new PublishService().getCountByDimensionId(dimensionModel.getId()) + "个知识
");//知识数量 + } + html.append("
审批人:" + (dimensionModel.getIsExamine() == 1 ? SDK.getORGAPI().getUserNames(new DimensionService().getDimensionAdmin(dimensionModel.getId())) : "") + "
管理员:" + SDK.getORGAPI().getUserNames(new DimensionService().getDimensionAdmin1(dimensionModel.getId())) + "
访问权限:" + accessHTML + "
借阅权限:" + borrowHTML + "
"); + reportHTML.append(html); + } + + /** + * 获取ac权限的html片段 + * + * @param resourceType + * @param resourceId + * @param accessMode + * @return + */ + private String getDimensionACHTML(String resourceType, String resourceId, int accessMode) { + // 已经授权的列表 + StringBuilder securityView = new StringBuilder(); + // 已授予的单位 + Iterator acList = AccessControlCache.getACList(resourceType, resourceId, accessMode); + while (acList.hasNext()) { + AccessControlModel tmpModel = acList.next(); + if (tmpModel._assignmentType.equals("company")) { + CompanyModel objModel = (CompanyModel) CompanyCache.getModel(tmpModel._assignmentId); + if (objModel != null) { + securityView.append("[单位]  " + objModel.getName() + "
"); + } + } + } + + // 已授予的部门 + acList = AccessControlCache.getACList(resourceType, resourceId, accessMode); + while (acList.hasNext()) { + AccessControlModel tmpModel = acList.next(); + if (tmpModel._assignmentType.equals("department")) { + DepartmentModel objModel = (DepartmentModel) DepartmentCache.getModel(tmpModel._assignmentId); + if (objModel != null) { + CompanyModel unitModel = CompanyCache.getModel(objModel.getCompanyId()); + if (unitModel != null) { + securityView.append("[部门]  " + unitModel.getName() + "//" + objModel.getPathNameOfCache() + "
"); + } + } + } + } + + // 已授予的角色 + acList = AccessControlCache.getACList(resourceType, resourceId, accessMode); + while (acList.hasNext()) { + AccessControlModel tmpModel = acList.next(); + if (tmpModel._assignmentType.equals("role")) { + RoleModel objModel = (RoleModel) RoleCache.getModel(tmpModel._assignmentId); + if (objModel != null) { + securityView.append("[角色]  " + Html.escape(objModel.getCategoryName() + "<" + objModel.getName()) + ">" + "
"); + } + } + } + + // 已授予的组 + acList = AccessControlCache.getACList(resourceType, resourceId, accessMode); + while (acList.hasNext()) { + AccessControlModel tmpModel = acList.next(); + if (tmpModel._assignmentType.equals("team")) { + TeamModel objModel = (TeamModel) TeamCache.getModel(tmpModel._assignmentId); + if (objModel != null) { + securityView.append("[团队]  " + objModel.getName() + "
"); + } + } + } + + // 已授予的人 + acList = AccessControlCache.getACList(resourceType, resourceId, accessMode); + while (acList.hasNext()) { + AccessControlModel tmpModel = acList.next(); + if (tmpModel._assignmentType.equals("user")) { + UserModel objModel = UserCache.getModel(tmpModel._assignmentId); + if (objModel != null) { + securityView.append("[人员]  " + objModel.getUserName() + "<" + objModel.getUID() + ">" + "
"); + } + } + } + String securityViewStr = securityView.toString(); + if (securityViewStr.endsWith("
")) { + securityViewStr = securityViewStr.substring(0, securityViewStr.length() - "
".length()); + } + return securityViewStr; + } + + /** + * 应用当前维度的ac权限到后代 + * + * @param dimensionId + * @param style 方式(append:追加,override覆盖) + * @return + */ + public String dimensionACToDes(String dimensionId, String style) { + try { + if (!"append".equals(style) && !"override".equals(style)) { + throw new AWSException("方式不合法"); + } + if (UtilString.isEmpty(dimensionId)) { + throw new AWSException("维度ID不能为空"); + } + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + if (dimensionModel == null) { + throw new AWSException("维度不存在"); + } + List accessControlModelList = SDK.getPermAPI().getACListByResource(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, dimensionId); + if ("append".equals(style) && (accessControlModelList == null || accessControlModelList.size() == 0)) { + throw new AWSException("当前维度没有已授权的权限"); + } + + DimensionService dimensionService = new DimensionService(); + List desDimensionModels = new ArrayList(); + dimensionService.getDesDimensionModels(dimensionId, desDimensionModels); + if (desDimensionModels.size() == 0) { + throw new AWSException("没有后代维度"); + } + for (DimensionModel desDimensionModel : desDimensionModels) { + DimensionPermCache.getCache().remove(desDimensionModel.getId()); + DimensionTreeCache.getCache().destroy(true); + if ("override".equals(style)) { + SDK.getPermAPI().removeAC(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR, desDimensionModel.getId()); + } + for (AccessControlModel accessControlModel : accessControlModelList) { + SDK.getPermAPI().appendACResource(desDimensionModel.getId(), accessControlModel._resourceType, accessControlModel._accessModel, accessControlModel._assignmentId, accessControlModel._assignmentType); + } + } + + ResponseObject ro = ResponseObject.newOkResponse(); + return ro.toString(); + } catch (Exception e) { + e.printStackTrace(); + return ResponseObject.newErrResponse(e.getMessage()).toString(); + } + } + + public String copyDimension(UserContext uc, String newDimensionName, String currDimensionId) { + DimensionService ds = new DimensionService(); + ds.copyDimension(newDimensionName, currDimensionId, uc.getUID()); + ResponseObject ro = ResponseObject.newOkResponse(); + return ro.toString(); + } + + public String changeDimensionUser(String dimensionIds, String handoverCardUser) { + JSONArray dimensionJA = JSONArray.parseArray(dimensionIds); + new DimensionService().changeDimensionUser(Arrays.asList(dimensionJA.toArray(new String[0])), handoverCardUser); + return ResponseObject.newOkResponse("移交成功").toString(); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMobileWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMobileWeb.java new file mode 100644 index 00000000..ad12c8e7 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlMobileWeb.java @@ -0,0 +1,178 @@ +package com.actionsoft.apps.kms.web; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.MetaAttrModel; +import com.actionsoft.apps.kms.service.MetaSchemaService; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public class KnwlMobileWeb extends ActionWeb { + public KnwlMobileWeb(UserContext me) { + super(me); + } + + public String getMobileHome() { + Map macroLibraries = new HashMap(); + JSONObject params = new JSONObject(); + params.put("sessionId", this.getContext().getSessionId()); + params.put("appId", "com.actionsoft.apps.kms"); + macroLibraries.put("settingParam", params); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.home.htm", macroLibraries); + } + + public String toMobilePortalPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.portal.htm", macroLibraries); + } + public String toMobileDirectPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.direct.htm", macroLibraries); + } + public String toMobileMyKnwlPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.myknwl.htm", macroLibraries); + } + public String getMobileFileDetails(String fileId) { + Map macroLibraries = new HashMap(); + macroLibraries.put("fileId",fileId); + + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.file.details.htm", macroLibraries); + } + + public String getMobileTopPublisFiles() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + + return responseObject.toString(); + } + + public String toCreateKnwlPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.create.htm", macroLibraries); + } + + public String toMobileMetaDataPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.meta.htm", macroLibraries); + } + + public String toMobileDimensionPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.dimension.htm", macroLibraries); + } + + public String toMobileSearchPage() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid",this.getContext().getSessionId()); + + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.mobile.search.htm", macroLibraries); + } + + public String mobileListsData(UserContext uc, String sortIndx, String sortDir, String searchDimensionIds, String schemaMetaData, String cardName, String publishTime, String publishUser, String tags, String lastPublishId, String searchType,String departId) { + KnwlSearchWeb knwlSearchWeb = new KnwlSearchWeb(uc); + return knwlSearchWeb.attrMobileSearchCard(1, 23, sortIndx, sortDir, searchDimensionIds, schemaMetaData, cardName, publishTime, publishUser, tags, lastPublishId, searchType,departId); + + } + + public String getDimensionTreeJson(UserContext uc, String parentId, boolean isDimensionKnwlPage) { + ResponseObject rs = ResponseObject.newOkResponse(); + KnwlCenterWeb web = new KnwlCenterWeb(uc); + JSONArray dimensionJA = JSONArray.parseArray(web.getDimensionTreeJson(parentId, isDimensionKnwlPage)); + DimensionModel dimensionModel = DimensionCache.getCache().get(parentId); + if (dimensionModel != null) { + rs.put("parentLabel", dimensionModel.getDimensionName()); + } + rs.put("dimensionJA", dimensionJA); + rs.put("parentId", parentId); + return rs.toString(); + } + + public String getSchemaMobile() { + ResponseObject rs = ResponseObject.newOkResponse(); + MetaSchemaService schemaService = new MetaSchemaService(); + Map> schemaAttrMap = schemaService.querySchemaAttrPublished(getContext().getUID()); + + JSONArray schemaAttrJO = new JSONArray(); + for (String schemaId : schemaAttrMap.keySet()) { + Map schemaMap = schemaAttrMap.get(schemaId); + JSONObject schemaJO = new JSONObject(); + schemaJO.put("schemaTitle", schemaMap.get("schemaTitle")); + schemaJO.put("showType", schemaMap.get("showType")); + schemaJO.put("isNullable", schemaMap.get("isNullable")); + schemaJO.put("schemaJO", schemaMap.get("schemaJO")); + schemaJO.put("id", schemaId); + + List attrModels = (List) schemaMap.get("attrList"); + JSONArray attrJA = new JSONArray(); + for (MetaAttrModel metaAttrModel : attrModels) { + JSONObject attrJO = new JSONObject(); + attrJO.put("schemaId", metaAttrModel.getSchemaId()); + attrJO.put("attrTitle", metaAttrModel.getAttrTitle()); + attrJO.put("id", metaAttrModel.getId()); + attrJO.put("active", false); + attrJA.add(attrJO); + } + + schemaJO.put("attrList", attrJA); + schemaAttrJO.add(schemaJO); + } + rs.put("data", schemaAttrJO); + return rs.toString(); + } + + public String getDimensionSearchByName(UserContext uc, String key) { + ResponseObject rs = ResponseObject.newOkResponse(); + KnwlCenterWeb web = new KnwlCenterWeb(uc); + JSONArray dimensionJA = JSONArray.parseArray(web.getDimensionByName(key)); + rs.put("dimensionJA", dimensionJA); + return rs.toString(); + } + + public String checkFullsearchAppActive(UserContext uc) { + ResponseObject rs = ResponseObject.newOkResponse(); + JSONObject setting = new JSONObject(); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + setting.put("isOnlinedocAppActive", true); + } else { + setting.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + setting.put("isNetworkAppActive", true); + } else { + setting.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + setting.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + setting.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + setting.put("browserPreview", systemParamJO.getString("browserPreview")); + setting.put("maxFileSize", systemParamJO.getInteger("maxFileSize")); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext(KMSConstant.APP_FULLSEARCH))) { + rs.put("isFullsearchAppActive", true); + } else { + rs.put("isFullsearchAppActive", false); + } + rs.put("setting", setting); + return rs.toString(); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlSearchWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlSearchWeb.java new file mode 100644 index 00000000..21c4a813 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/KnwlSearchWeb.java @@ -0,0 +1,1236 @@ +package com.actionsoft.apps.kms.web; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.sql.Date; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.ac.XpageMgrACCM; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.CardPermCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.cache.DimensionPermCache; +import com.actionsoft.apps.kms.cache.DimensionTreeCache; +import com.actionsoft.apps.kms.cache.PublishCache; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.FileModel; +import com.actionsoft.apps.kms.model.PublishModel; +import com.actionsoft.apps.kms.service.CardService; +import com.actionsoft.apps.kms.service.DimensionService; +import com.actionsoft.apps.kms.service.FileService; +import com.actionsoft.apps.kms.service.MetaSchemaService; +import com.actionsoft.apps.kms.service.OptService; +import com.actionsoft.apps.kms.service.PublishService; +import com.actionsoft.apps.kms.service.SearchService; +import com.actionsoft.bpms.commons.database.RowMap; +import com.actionsoft.bpms.commons.htmlframework.AlertWindow; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.security.ac.cache.AccessControlCache; +import com.actionsoft.bpms.commons.security.ac.model.AccessControlModel; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.DBSql; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilSerialize; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.awspaas.user.apps.yili.reportform.util.RepositoryAttribute; + +/** + * 检索(全文检索、属性检索) + * + * @author wangshibao + */ +public class KnwlSearchWeb extends ActionWeb { + public KnwlSearchWeb(UserContext me) { + super(me); + } + + /** + * 知识检索home页 + * + * @return html + * @author wangshibao + */ + public String getKnwlSearchHome(String searchType, String sortIndx) { + // 判断菜单权限 + boolean hasNavPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_KNWL_SEARCH); + if (!hasNavPerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + + Map macroLibraries = new HashMap(); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext(KMSConstant.APP_FULLSEARCH))) { + macroLibraries.put("isFullsearchAppActive", true); + } else { + macroLibraries.put("isFullsearchAppActive", false); + } + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("appId", this.getAppId()); + String extendsLinks = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "extendsLinks"); + if (UtilString.isEmpty(extendsLinks)) { + extendsLinks = "[]"; + } + String knwlsearchpage = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, "knwlsearchpage"); + if ("moreTop".equals(searchType)) { + macroLibraries.put("returnTop", "inline-block"); + macroLibraries.put("sortIndx", sortIndx); + macroLibraries.put("searchType", searchType); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_search.htm", macroLibraries); + } else if ("2".equals(knwlsearchpage)) { + macroLibraries.put("extendsLinks", extendsLinks); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_search_tophome.htm", macroLibraries); + } else { + macroLibraries.put("returnTop", "none"); + macroLibraries.put("sortIndx", "publishTime"); + macroLibraries.put("searchType", ""); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_search.htm", macroLibraries); + } + } + + /** + * 属性检索使用的维度模型树 + * + * @param parentId + * @return JSON + */ + public String getAttrSearchDimensionTreeJson(String parentId, boolean isKnwlMgr) { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + try { + List dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(parentId, getContext().getUID(), isKnwlMgr); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + if (!dimensionModel.isHasPerm()) { + dimensionJO.put("nocheck", true); + } + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForQueryTreeAccessDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } + dimensionJA.add(dimensionJO); + } + } + } catch (Exception e) { + throw new AWSException(e); + } + return dimensionJA.toString(); + } + + /** + * 属性检索使用的维度模型树 + * + * 限于树的功能不完整,此处采用全部加载数据,用来达到选中父节点级联查出所有后代节点的效果 + * + * @return + * @author wangshibao + */ + public String getAttrSearchDimensionTreeAllJson() { + DimensionService dimensionService = new DimensionService(); + JSONArray dimensionJA = new JSONArray(); + if (DimensionTreeCache.getCache().get(getContext().getUID()) != null) { + dimensionJA = DimensionTreeCache.getCache().get(getContext().getUID()); + } else { + String parentId = ""; + try { + Iterator dimensionACIterator = AccessControlCache.getACList(KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR); + List dimensionACList = new ArrayList(); + for (Iterator it = dimensionACIterator; it.hasNext(); ) { + AccessControlModel ac = (AccessControlModel) it.next(); + dimensionACList.add(ac); + } + fillAttrSearchDimensionTreeJson(dimensionService, dimensionJA, parentId, KMSUtil.isKnwlManager(getContext().getUID()), dimensionACList); + DimensionTreeCache.getCache().put(getContext().getUID(), dimensionJA); + } catch (Exception e) { + throw new AWSException(e); + } + } + return dimensionJA.toString(); + } + + /** + * 递归查询所有维度-属性检索 + * + * @param dimensionService + * @param dimensionJA + * @param parentId + * @author wangshibao + */ + private void fillAttrSearchDimensionTreeJson(DimensionService dimensionService, JSONArray dimensionJA, String parentId, boolean isKnwlMgr, List dimensionACList) { + List dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(parentId, getContext().getUID(), isKnwlMgr, dimensionACList); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + if (!hasRepeatDimension(dimensionJA, dimensionModel)) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("name", dimensionModel.getDimensionName()); + if (!dimensionModel.isHasPerm()) { + dimensionJO.put("nocheck", true); + } + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + + if (dimensionService.isExistChildForQueryTreeAccessDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr)) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + dimensionJO.put("open", false); + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + } + } + dimensionJA.add(dimensionJO); + } + fillAttrSearchDimensionTreeJson(dimensionService, dimensionJA, dimensionModel.getId(), isKnwlMgr, dimensionACList); + } + } + + public boolean hasRepeatDimension(JSONArray dimensions, DimensionModel dimensionModel) { + for (int i = 0; i < dimensions.size(); i++) { + JSONObject dimensionJO = dimensions.getJSONObject(i); + if (dimensionModel.getId().equals(dimensionJO.getString("id"))) { + return true; + } + } + return false; + } + /** + * 查询元数据以及对应的属性(检索) + * + * @return Map> + * @author wangshibao + */ + public String getSchemaAttr() { + MetaSchemaService schemaService = new MetaSchemaService(); + Map> schemaAttrMap = schemaService.querySchemaAttrSearched(getContext().getUID()); + ResponseObject responseObject = ResponseObject.newOkResponse(); + + JSONObject schemaAttrJO = new JSONObject(true); + KnwlCenterWeb.putSchemaAttrJO(schemaAttrMap, schemaAttrJO); + responseObject.setData(schemaAttrJO); + return responseObject.toString(); + } + + /** + * 属性检索-根据条件检索知识 + * + * @param searchDimensionIds 维度id数组 + * @param schemaMetaData 元数据对象 + * @param tags 标签数组 + * @param cardName 名称或者描述 + * @return JSON + * @author wangshibao + */ + public String attrSearchCard(int curPage, int rowsPerPage, String sortIndx, String sortDir, String searchDimensionIds, String schemaMetaData, String cardName, String publishTime, String publishUser, String tags, String lastPublishId, String searchType,String departId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(this.getContext().getUID()); + try { + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + List dimensionList = JSONArray.parseArray(searchDimensionIds, String.class); + JSONObject schemaMetaDataJO = JSONObject.parseObject(URLDecoder.decode(schemaMetaData, StandardCharsets.UTF_8.name())); + List tagList = JSONArray.parseArray(URLDecoder.decode(tags, StandardCharsets.UTF_8.name()), String.class); + cardName = URLDecoder.decode(cardName, StandardCharsets.UTF_8.name()); + List publishUsers = UtilString.isEmpty(publishUser) ? new ArrayList() : Arrays.asList(publishUser.split(",")); + JSONObject publishTimeJO = JSONObject.parseObject(publishTime); + String publishStartTimeStr = ""; + String publishEndTimeStr = ""; + if (publishTimeJO != null) { + publishStartTimeStr = publishTimeJO.getString("startPublishTime"); + publishEndTimeStr = publishTimeJO.getString("endPublishTime"); + } + + DimensionService dimensionService = new DimensionService(); + SearchService searchService = new SearchService(); + List publishModels = searchService.attrSearchCard(curPage, rowsPerPage, sortIndx, sortDir, getContext().getUID(), dimensionList, schemaMetaDataJO, cardName, UtilDate.parseTsFromDate(publishStartTimeStr), UtilDate.parseTsFromDate(publishEndTimeStr), publishUsers, tagList, lastPublishId, searchType,departId); + JSONArray cardJA = new JSONArray(); + JSONArray mobileCardJA = new JSONArray(); + JSONObject dataJson = new JSONObject(); + dataJson.put("lastPublishId", ""); + if (publishModels.size() < rowsPerPage + 1) { + dataJson.put("totalRecords", (curPage - 1) * rowsPerPage + publishModels.size()); + dataJson.put("hasNextPage", false); + } else { + dataJson.put("totalRecords", searchService.totalRecords); + publishModels.remove(publishModels.size() - 1);//移除最后一条 + dataJson.put("hasNextPage", true); + } + int userSecret=getContext().getUserModel().getSecurityLevel(); + + for (int i = 0; i < publishModels.size(); i++) { + PublishModel publishModel = publishModels.get(i); + int securityLevel = publishModel.getCardModel().getSecurityLevel(); + if(userSecret>>>>>>>>>>>>"+id); + Map queryRepositoryAttributeById = new RepositoryAttribute().queryRepositoryAttributeById(id); + if (null != queryRepositoryAttributeById && !queryRepositoryAttributeById.isEmpty()) { + // 发布部门 + JSONObject Issuing_department = queryRepositoryAttributeById.get("Issuing_department"); + if (null != Issuing_department && !Issuing_department.equals("")) { + JSONArray PUBDEPTJA = Issuing_department.getJSONArray("value"); + if (null != PUBDEPTJA && !PUBDEPTJA.isEmpty()) { + for (Object PUBDEPTO : PUBDEPTJA) { + JSONObject PUBDEPTJO = JSONObject.parseObject(String.valueOf(PUBDEPTO)); + String dempId = PUBDEPTJO.getString("id"); + System.out.println("发布部门中的部门id是什么>>>>>"+dempId); + DepartmentModel departmentById = SDK.getORGAPI().getDepartmentById(dempId); + departName+=departmentById.getName()+","; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("部门名称>>>>>>>>"+departName); + if (UtilString.isNotEmpty(departName)){ + departName = departName.substring(0,departName.length()-1); + } + cardJO.put("publishdepartName", departName); + cardJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("dimensionId", publishModel.getDimensionId()); + cardJO.put("dimensionPath", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + cardJO.put("rdoSL", publishModel.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModel.getCardModel().getSecurityLevel()) : ""); + cardJA.add(cardJO); + if (i == publishModels.size() - 1) { + dataJson.put("lastPublishId", publishModel.getId()); + } + } else { + PublishService publishService = new PublishService(); + boolean hasPerm = false; + List publishModelsCardId = publishService.queryPublishByCardId(publishModel.getCardModel().getId()); + PublishModel publishModelTarget = publishModel; + for (PublishModel publishModel1 : publishModelsCardId) { + if (KMSUtil.checkCardAC(publishModel1.getCardModel().getId(), this.getContext().getUID()) && KMSUtil.canAccessDimension(publishModel1.getDimensionId(), this.getContext().getUID()) && !KMSUtil.isNeedBorrow(publishModel1.getDimensionId(), this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + if (publishModel1.getCardModel().getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + } + JSONObject cardJO = new JSONObject(); + cardJO.put("cardId", publishModelTarget.getCardModel().getId()); + cardJO.put("hasPerm", hasPerm); + cardJO.put("id", publishModelTarget.getCardModel().getId()); + cardJO.put("cardName", publishModelTarget.getCardModel().getCardName()); + cardJO.put("description", publishModelTarget.getCardModel().getCardName()); + cardJO.put("cardType", publishModelTarget.getCardModel().getCardType()); + cardJO.put("onlineLevel", publishModelTarget.getCardModel().getOnlineLevel()); + cardJO.put("securityLevel", publishModelTarget.getCardModel().getSecurityLevel()); + cardJO.put("lastUpdate", publishModelTarget.getCardModel().getLastUpdate()); + cardJO.put("readCount", publishModelTarget.getCardModel().getReadCount()); + cardJO.put("commentCount", publishModelTarget.getCardModel().getCommentCount()); + cardJO.put("isPublished", publishModelTarget.getCardModel().getIsPublished()); + cardJO.put("validDate", UtilDate.dateFormat(publishModelTarget.getCardModel().getValidDate())); + UserModel publishUserModel = UserCache.getModel(publishModelTarget.getPublishUser()); + cardJO.put("publishUsername", publishUserModel == null ? publishModelTarget.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("publishTime", UtilDate.datetimeFormat(publishModelTarget.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("dimensionId", publishModelTarget.getDimensionId()); + cardJO.put("dimensionPath", dimensionService.getDimensionPath(publishModelTarget.getDimensionId(), " > ")); + cardJO.put("rdoSL", publishModel.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModel.getCardModel().getSecurityLevel()) : ""); + cardJA.add(cardJO); + + if (i == publishModels.size() - 1) { + dataJson.put("lastPublishId", publishModel.getId()); + } + } + } + + dataJson.put("data", cardJA); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + + return responseObject.toString(); + } + + /** + * 属性检索-根据条件检索知识 + * + * @param searchDimensionIds 维度id数组 + * @param schemaMetaData 元数据对象 + * @param tags 标签数组 + * @param cardName 名称或者描述 + * @return JSON + * @author wangshibao + */ + public String attrMobileSearchCard(int curPage, int rowsPerPage, String sortIndx, String sortDir, String searchDimensionIds, String schemaMetaData, String cardName, String publishTime, String publishUser, String tags, String lastPublishId, String searchType,String departId) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(this.getContext().getUID()); + try { + List dimensionList = JSONArray.parseArray(searchDimensionIds, String.class); + JSONObject schemaMetaDataJO = JSONObject.parseObject(URLDecoder.decode(schemaMetaData, StandardCharsets.UTF_8.name())); + List tagList = JSONArray.parseArray(URLDecoder.decode(tags, StandardCharsets.UTF_8.name()), String.class); + cardName = URLDecoder.decode(cardName, StandardCharsets.UTF_8.name()); + List publishUsers = UtilString.isEmpty(publishUser) ? new ArrayList() : Arrays.asList(publishUser.split(",")); + JSONObject publishTimeJO = JSONObject.parseObject(publishTime); + String publishStartTimeStr = ""; + String publishEndTimeStr = ""; + if (publishTimeJO != null) { + publishStartTimeStr = publishTimeJO.getString("startPublishTime"); + publishEndTimeStr = publishTimeJO.getString("endPublishTime"); + } + + DimensionService dimensionService = new DimensionService(); + SearchService searchService = new SearchService(); + List publishModels = searchService.attrSearchCard(curPage, rowsPerPage, sortIndx, sortDir, getContext().getUID(), dimensionList, schemaMetaDataJO, cardName, UtilDate.parseTsFromDate(publishStartTimeStr), UtilDate.parseTsFromDate(publishEndTimeStr), publishUsers, tagList, lastPublishId, searchType,departId); + JSONArray cardJA = new JSONArray(); + JSONObject dataJson = new JSONObject(); + dataJson.put("lastPublishId", ""); + if (publishModels.size() < rowsPerPage + 1) { + dataJson.put("totalRecords", (curPage - 1) * rowsPerPage + publishModels.size()); + dataJson.put("hasNextPage", false); + } else { + dataJson.put("totalRecords", searchService.totalRecords); + publishModels.remove(publishModels.size() - 1);//移除最后一条 + dataJson.put("hasNextPage", true); + } + for (int i = 0; i < publishModels.size(); i++) { + PublishModel publishModel = publishModels.get(i); + if (PublishModel.PUBLISHTIME.equals(sortIndx) || isKnwlMgr) { + boolean hasPerm = false; + if (isKnwlMgr || (KMSUtil.checkCardAC(publishModel.getCardModel().getId(), this.getContext().getUID()) && KMSUtil.canAccessDimension(publishModel.getDimensionId(), this.getContext().getUID()) && !KMSUtil.isNeedBorrow(publishModel.getDimensionId(), this.getContext().getUID()))) { + hasPerm = true; + } + if (!hasPerm) { + if (publishModel.getCardModel().getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + } + } + JSONObject cardJO = new JSONObject(); + cardJO.put("showFunction", false); + cardJO.put("id", publishModel.getCardModel().getId()); + cardJO.put("file", publishModel.getCardModel().getCardName()); + cardJO.put("lastUpdate", publishModel.getCardModel().getLastUpdate()); + cardJO.put("reda_num", publishModel.getCardModel().getReadCount()); + cardJO.put("discuss_num", publishModel.getCardModel().getCommentCount()); + cardJO.put("status", publishModel.getCardModel().getIsPublished()); + UserModel publishUserModel = UserCache.getModel(publishModel.getPublishUser()); + cardJO.put("name", publishUserModel == null ? publishModel.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("date", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("dimensionId", publishModel.getDimensionId()); + cardJO.put("steps", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + cardJO.put("cardContext", publishModel.getCardModel().getCardContext()); + cardJA.add(cardJO); + if (i == publishModels.size() - 1) { + dataJson.put("lastPublishId", publishModel.getId()); + } + } else { + PublishService publishService = new PublishService(); + boolean hasPerm = false; + List publishModelsCardId = publishService.queryPublishByCardId(publishModel.getCardModel().getId()); + PublishModel publishModelTarget = publishModel; + for (PublishModel publishModel1 : publishModelsCardId) { + if (KMSUtil.checkCardAC(publishModel1.getCardModel().getId(), this.getContext().getUID()) && KMSUtil.canAccessDimension(publishModel1.getDimensionId(), this.getContext().getUID()) && !KMSUtil.isNeedBorrow(publishModel1.getDimensionId(), this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + if (publishModel1.getCardModel().getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + } + JSONObject cardJO = new JSONObject(); + cardJO.put("showFunction", false);//控制显示操作面板 + cardJO.put("id", publishModelTarget.getCardModel().getId()); + cardJO.put("file", publishModelTarget.getCardModel().getCardName()); + cardJO.put("cardContext", publishModelTarget.getCardModel().getCardContext()); + cardJO.put("cardType", publishModelTarget.getCardModel().getCardType()); + cardJO.put("reda_num", publishModelTarget.getCardModel().getReadCount()); + cardJO.put("discuss_num", publishModelTarget.getCardModel().getCommentCount()); + cardJO.put("status", publishModelTarget.getCardModel().getIsPublished()); + UserModel publishUserModel = UserCache.getModel(publishModelTarget.getPublishUser()); + cardJO.put("name", publishUserModel == null ? publishModelTarget.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("date", UtilDate.datetimeFormat(publishModelTarget.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("steps", dimensionService.getDimensionPath(publishModelTarget.getDimensionId(), " > ")); + cardJA.add(cardJO); + if (i == publishModels.size() - 1) { + dataJson.put("lastPublishId", publishModel.getId()); + } + } + } + + dataJson.put("data", cardJA); + dataJson.put("curPage", curPage); + responseObject.setData(dataJson); + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException(e); + } + + return responseObject.toString(); + } + + /** + * 全文检索 + * + * @param curPage 当前页 + * @param rowsPerPage 每页的行数 + * @param searchText 检索关键字 + * @return JSON + * @author wangshibao + */ + public String fullSearch(int curPage, int rowsPerPage, String searchText, String docTypes, String searchType) { + try { + if (rowsPerPage == 0) { + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + rowsPerPage = systemParamJO.getInteger("gridRowPP"); + } + searchText = URLDecoder.decode(searchText, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + SearchService searchService = new SearchService(); + List docTypeList = JSONArray.parseArray(docTypes, String.class); + String result = searchService.fullSearchWrap(getContext(), curPage, rowsPerPage, searchText, docTypeList, searchType); + responseObject.setData(result); + return responseObject.toString(); + } + + /** + * 返回aws平台的所有人员列表 + * + * @param key + * @return + */ + public String getUserList(String key) { + JSONArray userJsonArray = new JSONArray(); + List users = UserCache.getActiveList(); + for (int i = 0; i < users.size(); i++) { + UserModel userModel = users.get(i); + if (userModel.getUID().toLowerCase().indexOf(key.toLowerCase()) > -1 || userModel.getUserName().toLowerCase().indexOf(key.toLowerCase()) > -1) { + JSONObject json = new JSONObject(); + json.put("id", userModel.getUID()); + json.put("label", userModel.getUserName()); + json.put("value", userModel.getUID()); + userJsonArray.add(json); + } + } + return userJsonArray.toString(); + } + + public String openEsSearchPage(String q) { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", super.getContext().getSessionId()); + macroLibraries.put("searchWords", q); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType == null ? "" : canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("gridRowPP", systemParamJO.getInteger("gridRowPP")); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.es.search.html", macroLibraries); + } + + public String kmsXPages(String showIndex, String showStyle) { + String publishTimeFormat = SDK.getAppAPI().getProperty("com.actionsoft.apps.addons.xpages", "datePattern"); + Map macroLibraries = new HashMap(); + int readNum=10; + int curPage=1; + int rowsPerPage=30; + JSONArray array=new JSONArray(); + array=getTopKnwl(readNum, curPage, rowsPerPage); + macroLibraries.put("sid", super.getContext().getSessionId()); + for (int i = 0; i < array.size(); i++) { + String publishTime = array.getJSONObject(i).getString("publishTime"); + String publishTimeN = publishTime; + if ("2".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 16); + } else if ("3".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 10); + } else if ("4".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 7); + } else if ("5".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 4); + } else if ("6".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(5, 10); + } else if ("7".equals(publishTimeFormat)) { + publishTimeN = KMSUtil.getAliasDate(Timestamp.valueOf(publishTime + ":00")); + } + array.getJSONObject(i).put("publishTime", publishTimeN); + } + macroLibraries.put("kmsDataList", array); + String mePhoto = SDK.getPortalAPI().getUserPhoto(getContext(), super.getContext().getUID()); + macroLibraries.put("mePhoto", mePhoto); + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.favorite"))) { + macroLibraries.put("isFavoriteAppActive", true); + } else { + macroLibraries.put("isFavoriteAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.addons.wpsonline"))) { + macroLibraries.put("isOnlinedocAppActive", true); + } else { + macroLibraries.put("isOnlinedocAppActive", false); + } + if (SDK.getAppAPI().isActive(SDK.getAppAPI().getAppContext("com.actionsoft.apps.network"))) { + macroLibraries.put("isNetworkAppActive", true); + } else { + macroLibraries.put("isNetworkAppActive", false); + } + String canPreviewType = KMSUtil.getCanPreviewType(getContext().getSessionId()); + macroLibraries.put("canPreviewType", canPreviewType); + JSONObject systemParamJO = JSONObject.parseObject(SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY)); + macroLibraries.put("browserPreview", systemParamJO.getString("browserPreview")); + macroLibraries.put("today", UtilDate.dateFormat(new Date(System.currentTimeMillis()))); + macroLibraries.put("showIndex", showIndex); + macroLibraries.put("showStyle", showStyle); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.xpages.html", macroLibraries); + } + + public JSONArray getTopKnwl(int readNum,int curPage,int rowsPerPage){ + JSONArray array=new JSONArray(); + for (int i = 0; i < Integer.MAX_VALUE; i++) { + String lastPublishId=""; + JSONObject obj1 = (JSONObject) JSONObject.parse(attrSearchCard(curPage, rowsPerPage, "publishTime", "down", "[]", "{\"01\":[],\"2\":[]}", "", "", "", "[]", lastPublishId, "","")); + JSONObject dataobj1=(JSONObject)obj1.get("data"); + JSONArray results=(JSONArray)dataobj1.get("data"); + array.addAll(results); + if ("false".equals(dataobj1.getString("hasNextPage"))) { + break; + } + if(array.size()>=readNum) { + break; + } + if(results.size()>0) { + JSONObject last=(JSONObject)results.get(results.size()-1); + lastPublishId=last.get("id").toString(); + } + curPage++; + } + return array; + } + + public String modifyPerm(String resourceId, String resourceType) { + if (KMSConstant.AC_RESOURCE_TYPE_CARD.equals(resourceType)) { + CardPermCache.getCache().remove(resourceId); + } else if (KMSConstant.AC_RESOURCE_TYPE_DIMENSION_MGR.equals(resourceType)) { + DimensionPermCache.getCache().remove(resourceId); + } + return ResponseObject.newOkResponse().toString(); + } + + public String queryCardTopList(String sortIndx) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(this.getContext().getUID()); + SearchService searchService = new SearchService(); + DimensionService dimensionService = new DimensionService(); + JSONArray cardJA = new JSONArray(); + Iterator publishIterator = PublishCache.getCache().iterator(); + List publishModelList = new ArrayList<>(); + while (publishIterator.hasNext()) { + PublishModel next = publishIterator.next(); + CardModel cardModel = CardCache.getCache().get(next.getCardId()); + if (cardModel == null) { + continue; + } + next.setCardModel(cardModel); + publishModelList.add(next); + } + boolean isCommentCountSort = false; + if (!UtilString.isEmpty(sortIndx)) { + if (sortIndx.equalsIgnoreCase("commentCount")) {//如果是以评论数排序,先计算出评论数 + isCommentCountSort = true; + // 计算出每个知识的评论数 + OptService optService = new OptService(); + for (PublishModel publishModel : publishModelList) { + publishModel.getCardModel().setCommentCount(optService.getCommentCount(publishModel.getCardId())); + } + } else if (sortIndx.equalsIgnoreCase("rateScore")) { + // 计算出每个知识的评分 + OptService optService = new OptService(); + for (PublishModel publishModel : publishModelList) { + JSONObject rates = optService.getRates(publishModel.getCardId()); + double totalScore = rates.getIntValue("1") * 1 + rates.getIntValue("2") * 2 + rates.getIntValue("3") * 3 + rates.getIntValue("4") * 4 + rates.getIntValue("5") * 5; + int rateNum = rates.getIntValue("1") + rates.getIntValue("2") + rates.getIntValue("3") + rates.getIntValue("4") + rates.getIntValue("5"); + double avgScore = 0; + if (rateNum > 0) { + avgScore = totalScore / rateNum; + } + publishModel.getCardModel().setRateScore(avgScore); + } + } + } + // 排序 + searchService.sortPublishModels(sortIndx, "down", publishModelList); + List returnPublishModels = new ArrayList<>(); + int countRow = 0; + for (PublishModel publishModel : publishModelList) { + try { + DimensionModel dimensionModel = DimensionCache.getCache().get(publishModel.getDimensionId()); + if (dimensionModel != null) { + // 维度未启用 + if (dimensionModel.getIsEnabled() != 1) { + continue; + } + } + // 如果不是此维度管理员 + CardModel cardModel = CardCache.getCache().get(publishModel.getCardId()); + // 过滤有效期 + if (cardModel.getValidDate() != null && (cardModel.getValidDate().getTime() + 24 * 60 * 60 * 1000) - System.currentTimeMillis() < 0) {// 已过期 + continue; + } + // 过滤发布状态:申请中、审批中、不同意 + if (!UtilString.isEmpty(publishModel.getExamineInfo())) { + if (!publishModel.getExamineInfo().contains("\"同意\"")) { + continue; + } + } + boolean hasRepeat = false; + for (PublishModel returnPublishModel : returnPublishModels) {//过滤包含重复知识 + if (returnPublishModel.getCardId().equals(publishModel.getCardId())) { + hasRepeat = true; + break; + } + } + if (hasRepeat) { + continue; + } + publishModel.setCardModel(CardCache.getCache().get(publishModel.getCardId())); + countRow++; + if (countRow <= 5) {//多查一条,如果达不到rowsPerPage+1条,说明已经查询完毕 + returnPublishModels.add(publishModel); + } else { + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + for (int i = 0; i < 5 && i < returnPublishModels.size(); i++) { + PublishModel publishModel = returnPublishModels.get(i); + if (PublishModel.PUBLISHTIME.equals(sortIndx) || isKnwlMgr) { + boolean hasPerm = false; + if (isKnwlMgr || (KMSUtil.checkCardAC(publishModel.getCardModel().getId(), this.getContext().getUID()) && KMSUtil.canAccessDimension(publishModel.getDimensionId(), this.getContext().getUID()) && !KMSUtil.isNeedBorrow(publishModel.getDimensionId(), this.getContext().getUID()))) { + hasPerm = true; + } + if (!hasPerm) { + if (publishModel.getCardModel().getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + } + } + JSONObject cardJO = new JSONObject(); + cardJO.put("cardId", publishModel.getCardModel().getId()); + cardJO.put("hasPerm", hasPerm); + cardJO.put("id", publishModel.getCardModel().getId()); + cardJO.put("cardName", publishModel.getCardModel().getCardName()); + cardJO.put("cardType", publishModel.getCardModel().getCardType()); + cardJO.put("onlineLevel", publishModel.getCardModel().getOnlineLevel()); + cardJO.put("securityLevel", publishModel.getCardModel().getSecurityLevel()); + cardJO.put("lastUpdate", publishModel.getCardModel().getLastUpdate()); + cardJO.put("readCount", publishModel.getCardModel().getReadCount()); + cardJO.put("commentCount", publishModel.getCardModel().getCommentCount()); + cardJO.put("isPublished", publishModel.getCardModel().getIsPublished()); + cardJO.put("validDate", UtilDate.dateFormat(publishModel.getCardModel().getValidDate())); + UserModel publishUserModel = UserCache.getModel(publishModel.getPublishUser()); + cardJO.put("publishUsername", publishUserModel == null ? publishModel.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("publishTime", UtilDate.datetimeFormat(publishModel.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("dimensionId", publishModel.getDimensionId()); + cardJO.put("dimensionPath", dimensionService.getDimensionPath(publishModel.getDimensionId(), " > ")); + cardJO.put("rdoSL", publishModel.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModel.getCardModel().getSecurityLevel()) : ""); + cardJA.add(cardJO); + } else {//查看是否有这个知识的权限 + PublishService publishService = new PublishService(); + boolean hasPerm = false; + List publishModels = publishService.queryPublishByCardId(publishModel.getCardModel().getId()); + PublishModel publishModelTarget = publishModel; + for (PublishModel publishModel1 : publishModels) { + if (KMSUtil.checkCardAC(publishModel1.getCardModel().getId(), this.getContext().getUID()) && KMSUtil.canAccessDimension(publishModel1.getDimensionId(), this.getContext().getUID()) && !KMSUtil.isNeedBorrow(publishModel1.getDimensionId(), this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + if (publishModel1.getCardModel().getCreateUser().equals(this.getContext().getUID())) { + hasPerm = true; + publishModelTarget = publishModel1; + break; + } + } + JSONObject cardJO = new JSONObject(); + cardJO.put("cardId", publishModelTarget.getCardModel().getId()); + cardJO.put("hasPerm", hasPerm); + cardJO.put("id", publishModelTarget.getCardModel().getId()); + cardJO.put("cardName", publishModelTarget.getCardModel().getCardName()); + cardJO.put("cardType", publishModelTarget.getCardModel().getCardType()); + cardJO.put("onlineLevel", publishModelTarget.getCardModel().getOnlineLevel()); + cardJO.put("securityLevel", publishModelTarget.getCardModel().getSecurityLevel()); + cardJO.put("lastUpdate", publishModelTarget.getCardModel().getLastUpdate()); + cardJO.put("readCount", publishModelTarget.getCardModel().getReadCount()); + cardJO.put("commentCount", publishModelTarget.getCardModel().getCommentCount()); + cardJO.put("isPublished", publishModelTarget.getCardModel().getIsPublished()); + cardJO.put("validDate", UtilDate.dateFormat(publishModelTarget.getCardModel().getValidDate())); + UserModel publishUserModel = UserCache.getModel(publishModelTarget.getPublishUser()); + cardJO.put("publishUsername", publishUserModel == null ? publishModelTarget.getPublishUser() : publishUserModel.getUserName()); + cardJO.put("publishTime", UtilDate.datetimeFormat(publishModelTarget.getPublishTime(), "yyyy-MM-dd HH:mm")); + cardJO.put("dimensionId", publishModelTarget.getDimensionId()); + cardJO.put("dimensionPath", dimensionService.getDimensionPath(publishModelTarget.getDimensionId(), " > ")); + cardJO.put("rdoSL", publishModelTarget.getCardModel() != null ? KMSUtil.getSecurityLevelLabel(publishModelTarget.getCardModel().getSecurityLevel()) : ""); + cardJA.add(cardJO); + } + } + responseObject.put("data", cardJA); + return responseObject.toString(); + } + + public String queryCardTopPage(String sortIndx) { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("sortIndx", sortIndx); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.knwl_search_toplist.htm", macroLibraries); + } + + public String openCardByDirctory(String rootDirectoryId, String showType, String showIndex, String ifShowDirectory, String sortIndx, String showStyle, String publishTimeFormat) { + publishTimeFormat = SDK.getAppAPI().getProperty("com.actionsoft.apps.addons.xpages", "datePattern"); + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("sortIndx", sortIndx); + macroLibraries.put("showType", showType); + macroLibraries.put("showIndex", showIndex); + macroLibraries.put("ifShowDirectory", ifShowDirectory); + macroLibraries.put("rootDirectoryId", rootDirectoryId); + macroLibraries.put("showStyle", showStyle); + String rootDirectoryName = ""; + DimensionModel dimensionModel = DimensionCache.getCache().get(rootDirectoryId); + if (dimensionModel != null) { + rootDirectoryName = dimensionModel.getDimensionName(); + } + boolean hasPerm = true; + boolean ac = KMSUtil.canAccessDimension(dimensionModel.getId(), this.getContext().getUID()); + if (!ac) { + hasPerm = false; + } + JSONArray data = new JSONArray(); + if (hasPerm) { + String result = attrSearchCard(1, 1000, sortIndx, "down", "['" + rootDirectoryId + "']", "{01:[],2:[]}", "", "", "", "[]", "", "",""); + JSONObject rs = JSONObject.parseObject(result); + data = rs.getJSONObject("data").getJSONArray("data"); + for (int i = 0; i < data.size(); i++) { + String publishTime = data.getJSONObject(i).getString("publishTime"); + String publishTimeN = publishTime; + if ("2".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 16); + } else if ("3".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 10); + } else if ("4".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 7); + } else if ("5".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 4); + } else if ("6".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(5, 10); + } else if ("7".equals(publishTimeFormat)) { + publishTimeN = KMSUtil.getAliasDate(Timestamp.valueOf(publishTime + ":00")); + } + data.getJSONObject(i).put("publishTime", publishTimeN); + FileService fileService = new FileService(); + List files = fileService.queryFiles(data.getJSONObject(i).getString("cardId")); + if (files.size() > 0) { + FileModel firstFile = files.get(0); + String fileIcon = KMSUtil.getFileSuffix(firstFile.getFileName()); + data.getJSONObject(i).put("fileIcon", fileIcon); + } else { + data.getJSONObject(i).put("fileIcon", "unknown"); + } + } + } + String directory = "[]"; + if ("true".equals(ifShowDirectory)) {//目录 + directory = getAttrSearchDimensionTreeJson(rootDirectoryId, KMSUtil.isKnwlManager(this.getContext().getUID())); + } + macroLibraries.put("data", data); + macroLibraries.put("hasPerm", hasPerm); + macroLibraries.put("directory", directory); + macroLibraries.put("rootDirectoryName", rootDirectoryName.replaceAll("[\"']", "\\\\$0")); + macroLibraries.put("publishTimeFormat", publishTimeFormat); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.directory.xpages.html", macroLibraries); + } + + public String getCardByDirctory(String directoryId, String sortIndx, String hasPerm, String publishTimeFormat) { + publishTimeFormat = SDK.getAppAPI().getProperty("com.actionsoft.apps.addons.xpages", "datePattern"); + ResponseObject ro = ResponseObject.newOkResponse(); + JSONArray data = new JSONArray(); + if ("true".equals(hasPerm)) { + String result = attrSearchCard(1, 1000, sortIndx, "down", "['" + directoryId + "']", "{01:[],2:[]}", "", "", "", "[]", "", "",""); + JSONObject rs = JSONObject.parseObject(result); + data = rs.getJSONObject("data").getJSONArray("data"); + for (int i = 0; i < data.size(); i++) { + String publishTime = data.getJSONObject(i).getString("publishTime"); + String publishTimeN = publishTime; + if ("2".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 16); + } else if ("3".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 10); + } else if ("4".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 7); + } else if ("5".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 4); + } else if ("6".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(5, 10); + } else if ("7".equals(publishTimeFormat)) { + publishTimeN = KMSUtil.getAliasDate(Timestamp.valueOf(publishTime + ":00")); + } + FileService fileService = new FileService(); + List files = fileService.queryFiles(data.getJSONObject(i).getString("cardId")); + if (files.size() > 0) { + FileModel firstFile = files.get(0); + String fileIcon = KMSUtil.getFileSuffix(firstFile.getFileName()); + data.getJSONObject(i).put("fileIcon", fileIcon); + } else { + data.getJSONObject(i).put("fileIcon", "unknown"); + } + data.getJSONObject(i).put("publishTime", publishTimeN); + } + } + String directory = "[]"; + directory = getAttrSearchDimensionTreeJson(directoryId, KMSUtil.isKnwlManager(this.getContext().getUID())); + ro.put("data", data); + ro.put("directory", directory); + return ro.toString(); + } + + public String getXpageCategory() { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONArray data = new JSONArray(); + List list = DBSql.getMaps("SELECT * FROM APP_ACT_KMS_XP_CATEGORY"); + for (RowMap rowMap : list) { + JSONObject o = new JSONObject(); + o.put("id", rowMap.getString("CATEGORYNAME")); + o.put("text", rowMap.getString("CATEGORYNAME")); + data.add(o); + } + ro.put("data", data); + return ro.toString(); + } + + public String saveXpageCategory(String categoryName) { + ResponseObject ro = ResponseObject.newOkResponse(); + Map params = new HashMap(); + params.put("CATEGORYNAME", categoryName); + int c = DBSql.getInt("SELECT COUNT(*) C FROM APP_ACT_KMS_XP_CATEGORY WHERE CATEGORYNAME = :CATEGORYNAME", "C", params); + if (c == 0) { + params.put("ID", UUIDGener.getUUID()); + DBSql.update("INSERT INTO APP_ACT_KMS_XP_CATEGORY (ID,CATEGORYNAME ) VALUES (:ID,:CATEGORYNAME) ", params); + } + return ro.toString(); + } + + public String openFastCard(String category, String showType, String showIndex, String showStyle, String publishTimeFormat) { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + macroLibraries.put("showType", showType); + macroLibraries.put("showIndex", showIndex); + JSONArray data = getFastCard(category, publishTimeFormat); + boolean isManager = SDK.getPermAPI().havingACPermission(this.getContext().getUID(), KMSConstant.AC_RESOURCE_TYPE_XPAGE_MGR, "XPAGE-KMS-%" + category + "%", XpageMgrACCM.XPAGEMGR.getType(), true); + macroLibraries.put("data", data); + macroLibraries.put("isManager", isManager); + macroLibraries.put("category", category); + macroLibraries.put("showStyle", showStyle); + macroLibraries.put("publishTimeFormat", publishTimeFormat); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.card.xpages.html", macroLibraries); + } + + public JSONArray getFastCard(String categoryName, String publishTimeFormat) { + publishTimeFormat = SDK.getAppAPI().getProperty("com.actionsoft.apps.addons.xpages", "datePattern"); + Map params = new HashMap(); + params.put("categoryName", categoryName); + JSONArray data = new JSONArray(); + List list = DBSql.getMaps("SELECT * FROM APP_ACT_KMS_XP_CATEGORY_CARDS WHERE CATEGORYNAME = :categoryName ORDER BY ORDERINDEX", params); + OptService optService = new OptService(); + PublishService publishService = new PublishService(); + for (RowMap rowMap : list) { + JSONObject o = new JSONObject(); + o.put("id", rowMap.getString("ID")); + o.put("orderIndex", rowMap.getInt("ORDERINDEX")); + o.put("categoryName", rowMap.getString("CATEGORYNAME")); + o.put("cardId", rowMap.getString("CARDID")); + if (!KMSUtil.checkCardAC(rowMap.getString("CARDID"), this.getContext().getUID())) { + continue; + } + FileService fileService = new FileService(); + List files = fileService.queryFiles(rowMap.getString("CARDID")); + if (files.size() > 0) { + FileModel firstFile = files.get(0); + String fileIcon = KMSUtil.getFileSuffix(firstFile.getFileName()); + o.put("fileIcon", fileIcon); + } else { + o.put("fileIcon", "unknown"); + } + CardModel card = CardCache.getCache().get(rowMap.getString("CARDID")); + List publishModels = publishService.queryPublishByCardId(rowMap.getString("CARDID")); + o.put("publishTime", ""); + o.put("publishUsername", ""); + boolean hasPrem = false; + for (PublishModel publishModel : publishModels) { + if (KMSUtil.canAccessDimension(publishModel.getDimensionId(), this.getContext().getUID())) { + hasPrem = true; + break; + } + } + if (!hasPrem) { + continue; + } + if (publishModels.size() > 0) { + String publishTime = UtilDate.datetimeFormat(publishModels.get(0).getPublishTime()); + String publishTimeN = publishTime; + if ("2".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 16); + } else if ("3".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 10); + } else if ("4".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 7); + } else if ("5".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(0, 4); + } else if ("6".equals(publishTimeFormat)) { + publishTimeN = publishTime.substring(5, 10); + } else if ("7".equals(publishTimeFormat)) { + publishTimeN = KMSUtil.getAliasDate(Timestamp.valueOf(publishTime + ":00")); + } + o.put("publishTime", publishTimeN); + String uid = publishModels.get(0).getPublishUser(); + UserModel user = UserCache.getModel(uid); + if (user != null) { + o.put("publishUsername", user.getUserName()); + } else { + o.put("publishUsername", uid); + } + } + if (card != null) { + o.put("cardName", card.getCardName()); + o.put("readCount", card.getReadCount()); + o.put("commentCount", optService.getCommentCount(card.getId())); + } + data.add(o); + } + return data; + } + + public String saveXpageFastCard(String categoryName, String cardIds) { + ResponseObject ro = ResponseObject.newOkResponse(); + if (UtilString.isNotEmpty(cardIds)) { + String[] cardIdArr = cardIds.split(","); + Map params = new HashMap(); + params.put("CATEGORYNAME", categoryName); + //查询最大order + int maxOrder = DBSql.getInt("SELECT MAX(ORDERINDEX) ORDERINDEX FROM APP_ACT_KMS_XP_CATEGORY_CARDS WHERE CATEGORYNAME = :CATEGORYNAME", "ORDERINDEX", params); + for (int i = 0; i < cardIdArr.length; i++) { + params.put("CARDID", cardIdArr[i]); + int c = DBSql.getInt("SELECT COUNT(*) C FROM APP_ACT_KMS_XP_CATEGORY_CARDS WHERE CATEGORYNAME = :CATEGORYNAME AND CARDID = :CARDID", "C", params); + if (c == 0) { + params.put("ORDERINDEX", maxOrder + (i + 1)); + params.put("ID", UUIDGener.getUUID()); + DBSql.update("INSERT INTO APP_ACT_KMS_XP_CATEGORY_CARDS (ID,CATEGORYNAME,CARDID,ORDERINDEX ) VALUES (:ID,:CATEGORYNAME,:CARDID,:ORDERINDEX) ", params); + } + } + } + return ro.toString(); + } + + public String deleteXpageFastCard(String id) { + ResponseObject ro = ResponseObject.newOkResponse(); + Map params = new HashMap(); + params.put("ID", id); + DBSql.update("DELETE FROM APP_ACT_KMS_XP_CATEGORY_CARDS WHERE ID = :ID ", params); + return ro.toString(); + } + + public String saveFastCardOrder(String data) { + ResponseObject ro = ResponseObject.newOkResponse(); + if (UtilString.isNotEmpty(data)) { + JSONArray dataArr = JSONArray.parseArray(data); + for (int i = 0; i < dataArr.size(); i++) { + Map params = new HashMap(); + params.put("ID", dataArr.getJSONObject(i).getString("ID")); + params.put("ORDERINDEX", dataArr.getJSONObject(i).getString("ORDERINDEX")); + int n = DBSql.update("UPDATE APP_ACT_KMS_XP_CATEGORY_CARDS SET ORDERINDEX=:ORDERINDEX WHERE ID=:ID", params); + } + } + return ro.toString(); + } + + public String getCardTree() { + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "kms.cardtree.htm", macroLibraries); + } + + public String getCardTreeData(String type, String pid, String hasPerm) { + JSONArray cardTree = new JSONArray(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + DimensionService dimensionService = new DimensionService(); + CardService cardService = new CardService(); + if ("dimension".equals(type)) { + List dimensionModels = dimensionService.queryTreeAccessDimensionsByParentId(pid, getContext().getUID(), isKnwlMgr); + dimensionModels = KMSUtil.filterDisabledDimension(dimensionModels); + for (DimensionModel dimensionModel : dimensionModels) { + JSONObject dimensionJO = new JSONObject(); + dimensionJO.put("type", "dimension"); + dimensionJO.put("id", dimensionModel.getId()); + dimensionJO.put("showType", dimensionModel.getShowType()); + if (!UtilString.isEmpty(dimensionModel.getParentId())) { + dimensionJO.put("pid", dimensionModel.getParentId()); + } + dimensionJO.put("name", dimensionModel.getDimensionName()); + dimensionJO.put("hasPerm", dimensionModel.isHasPerm()); + dimensionJO.put("open", false); + dimensionJO.put("nocheck", true); + if (!dimensionService.isExistChildForQueryTreeAccessDimensionsByParentId(dimensionModel.getId(), getContext().getUID(), isKnwlMgr) && !dimensionModel.isHasPerm()) {// 如果存在子维度则显示open符号(不自动展开),否则不显示 + continue; + } + if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_CATEGORY) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + dimensionJO.put("iconFont", UtilSerialize.parseObject("{'code':'','color':'green'}")); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + dimensionJO.put("iconFont", UtilSerialize.parseObject("{'code':'','color':'gray'}")); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_DIMENSION) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeDimension"); + dimensionJO.put("iconFont", UtilSerialize.parseObject("{'code':'','color':'green'}")); + } else { + dimensionJO.put("iconCls", "treeDimension-noPerm"); + dimensionJO.put("iconFont", UtilSerialize.parseObject("{'code':'','color':'gray'}")); + } + } else if (dimensionModel.getShowType() == KMSConstant.SHOWTYPE_HOTSPOT) { + if (dimensionModel.isHasPerm()) { + dimensionJO.put("iconCls", "treeHotspot"); + } else { + dimensionJO.put("iconCls", "treeHotspot-noPerm"); + } + } + cardTree.add(dimensionJO); + } + //知识 + if (UtilString.isNotEmpty(pid) && "true".equals(hasPerm)) { + List cardModels = cardService.queryCardsByDimensionId(pid); + for (CardModel cardModel : cardModels) { + JSONObject cardModelO = new JSONObject(); + cardModelO.put("type", "card"); + cardModelO.put("id", cardModel.getId()); + cardModelO.put("name", cardModel.getCardName()); + cardModelO.put("pid", pid); + cardModelO.put("iconFont", UtilSerialize.parseObject("{'code':'','color':'green'}")); + cardTree.add(cardModelO); + } + } + } else if ("card".equals(type)) { + + } + return cardTree.toString(); + } + + public String loadFastCard(String categoryName, String publishTimeFormat) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONArray data = getFastCard(categoryName, publishTimeFormat); + ro.put("data", data); + return ro.toString(); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/SystemMgrWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/SystemMgrWeb.java new file mode 100644 index 00000000..10936ad2 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/kms/web/SystemMgrWeb.java @@ -0,0 +1,234 @@ +package com.actionsoft.apps.kms.web; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.model.HotspotDefModel; +import com.actionsoft.apps.kms.model.VersionModel; +import com.actionsoft.apps.kms.service.HotspotDefService; +import com.actionsoft.apps.kms.service.VersionService; +import com.actionsoft.bpms.commons.htmlframework.AlertWindow; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.UserCache; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.Html; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * 系统维护 + * + * @author wangshibao + */ +public class SystemMgrWeb extends ActionWeb { + public SystemMgrWeb(UserContext me) { + super(me); + } + + /** + * 系统维护home也 + * + * @return html + * @author wangshibao + */ + public String getSystemMgrHome() { + // 判断菜单权限 + boolean hasNavPerm = SDK.getPermAPI().havingNavMenuPermission(getContext().getUID(), KMSConstant.NAV_ID_SYSTEM_MGR); + if (!hasNavPerm) { + return AlertWindow.getPage("无权限", "对不起,您无权限访问该页面", AlertWindow.ICON_ERROR); + } + Map macroLibraries = new HashMap(); + macroLibraries.put("sid", getContext().getSessionId()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.system_mgr.htm", macroLibraries); + } + + /** + * 获取版本号列表 + * + * @return JSON + */ + public String getVersionListJson() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + VersionService versionService = new VersionService(); + List models = versionService.queryVersions(); + JSONArray versionJA = new JSONArray(); + for (VersionModel model : models) { + JSONObject versionJO = new JSONObject(); + versionJO.put("id", model.getId()); + versionJO.put("versionNo", model.getVersionNo()); + versionJO.put("createTime", UtilDate.datetimeFormat(model.getCreateTime(), "yyyy-MM-dd HH:mm")); + versionJO.put("createUsername", UserCache.getModel(model.getCreateUser()) == null ? model.getCreateUser() : UserCache.getModel(model.getCreateUser()).getUserName()); + versionJO.put("memo", Html.htmlEscape(model.getMemo()) ); + + versionJA.add(versionJO); + } + responseObject.setData(versionJA); + return responseObject.toString(); + } + + /** + * 获取知识地图定义列表 + * + * @return JSON + */ + public String getHotspotDefListJson() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + HotspotDefService hotspotDefService = new HotspotDefService(); + List models = hotspotDefService.queryHotspotDefs(); + JSONArray hotspotJA = new JSONArray(); + for (HotspotDefModel model : models) { + JSONObject hotspotDefJO = new JSONObject(); + hotspotDefJO.put("id", model.getId()); + hotspotDefJO.put("hotspotName", model.getHotspotName()); + hotspotDefJO.put("createTime", UtilDate.datetimeFormat(model.getCreateTime(), "yyyy-MM-dd HH:mm")); + hotspotDefJO.put("createUsername", UserCache.getModel(model.getCreateUser()) == null ? model.getCreateUser() : UserCache.getModel(model.getCreateUser()).getUserName()); + hotspotDefJO.put("memo", Html.htmlEscape(model.getMemo())); + + hotspotJA.add(hotspotDefJO); + } + responseObject.setData(hotspotJA); + return responseObject.toString(); + } + + /** + * 保存KMS知识参数 + * + * @param maxFileSize 文件最大值(MB) + * @param blackFileList 文件黑名单(以@`@分隔) + * @param isComment 是否允许评论 + * @return JSON + * @author wangshibao + */ + public String saveSystemParam(String maxFileSize, String blackFileList, String gridRowPP, String browserPreview) { + ResponseObject responseObject = ResponseObject.newOkResponse("保存成功"); + try { + blackFileList = URLDecoder.decode(blackFileList, StandardCharsets.UTF_8.name()); + browserPreview = URLDecoder.decode(browserPreview, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("maxFileSize", maxFileSize); + jsonObject.put("blackFileList", blackFileList); + jsonObject.put("gridRowPP", gridRowPP); + jsonObject.put("browserPreview", browserPreview); + + SDK.getAppAPI().setProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY, jsonObject.toString()); + return responseObject.toString(); + } + + /** + * 获取KMS知识参数 + * + * @return JSON + * @author wangshibao + */ + public String getSystemParam() { + ResponseObject responseObject = ResponseObject.newOkResponse(); + String systemParam = SDK.getAppAPI().getProperty(KMSConstant.APP_ID, KMSConstant.SYSTEM_PARAM_KEY); + responseObject.put("systemParam", JSONObject.parseObject(systemParam)); + return responseObject.toString(); + } + + /** + * 新建版本号 + * + * @param versionNo 版本号 + * @param memo 版本描述 + * @return JSON + * @author wangshibao + */ + public String addVersion(String versionNo, String memo) { + try { + memo = URLDecoder.decode(memo, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + VersionService versionService = new VersionService(); + versionService.addVersion(versionNo, memo, getContext().getUID()); + return responseObject.toString(); + } + + /** + * 新建知识地图定义 + * + * @param hotspotName 知识地图定义名称 + * @param memo 描述 + * @return JSON + * @author wangshibao + */ + public String addHotspotDef(String hotspotName, String hotspotMetaId, String memo) { + try { + hotspotName = URLDecoder.decode(hotspotName, StandardCharsets.UTF_8.name()); + memo = URLDecoder.decode(memo, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + HotspotDefService hotspotDefService = new HotspotDefService(); + hotspotDefService.addHotspotDef(hotspotName, hotspotMetaId, memo, getContext().getUID()); + return responseObject.toString(); + } + + /** + * 删除版本号 + * + * @param versionIds 版本号ID数组字符串,英文逗号分隔 + * @return JSON + * @author wangshibao + */ + public String deleteVersions(String versionIds) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + VersionService versionService = new VersionService(); + boolean result = versionService.deleteVersion(versionIds.split(",")); + if (!result) { + responseObject = ResponseObject.newErrResponse(); + } + return responseObject.toString(); + } + + /** + * 删除知识地图定义 + * + * @param hotspotDefIds 知识地图定义ID数组字符串,英文逗号分隔 + * @return JSON + * @author wangshibao + */ + public String deleteHotspotDefs(String hotspotDefIds) { + if (hotspotDefIds.trim().equals("")) { + throw new AWSException("知识地图ID不允许为空"); + } + ResponseObject responseObject = ResponseObject.newOkResponse(); + HotspotDefService hotspotDefService = new HotspotDefService(); + hotspotDefService.deleteHotspotDef(hotspotDefIds.split(","), getContext()); + return responseObject.toString(); + } + + /** + * 删除知识地图定义前的检查(是否被维度绑定知识地图) + * + * @param hotspotDefIds 知识地图定义ID数组字符串,英文逗号分隔 + * @return JSON + * @author wangshibao + */ + public String deleteHotspotDefsCheck(String hotspotDefIds) { + ResponseObject responseObject = ResponseObject.newOkResponse(); + HotspotDefService hotspotDefService = new HotspotDefService(); + String result = hotspotDefService.deleteHotspotDefCheck(hotspotDefIds.split(",")); + if (result != null) { + responseObject.warn(result); + } + return responseObject.toString(); + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/HotspotWeb.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/HotspotWeb.java new file mode 100644 index 00000000..ec6bf6a8 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/HotspotWeb.java @@ -0,0 +1,589 @@ +package com.actionsoft.apps.processon; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.actionsoft.apps.kms.KMSConstant; +import com.actionsoft.apps.kms.KMSUtil; +import com.actionsoft.apps.kms.cache.CardCache; +import com.actionsoft.apps.kms.cache.DimensionCache; +import com.actionsoft.apps.kms.dao.HotspotDefDao; +import com.actionsoft.apps.kms.model.CardModel; +import com.actionsoft.apps.kms.model.DimensionModel; +import com.actionsoft.apps.kms.model.HotspotDefModel; +import com.actionsoft.apps.kms.model.HotspotModel; +import com.actionsoft.apps.kms.service.HotspotService; +import com.actionsoft.apps.processon.posreader.PosReader; +import com.actionsoft.apps.processon.posreader.model.Document; +import com.actionsoft.apps.processon.posreader.model.diagram.DiagramImage; +import com.actionsoft.apps.processon.posreader.model.diagram.Shape; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.conf.server.AWSServerConf; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.util.UtilFile; +import com.actionsoft.exception.AWSException; +import com.actionsoft.i18n.I18nRes; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSONObject; + +import jpack.util.BASE64Decoder; + +public class HotspotWeb extends ActionWeb { + public HotspotWeb(UserContext me) { + super(me); + } + + public HotspotWeb(UserContext me, String willBindedDimenionId) { + super(me); + } + + /** + * 打开知识地图home页 + * + * @param dimensionId 维度ID + * @return + * @author wangshibao + */ + public String getHotspot(String dimensionId) { + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + Map macroLibraries = new HashMap(); + macroLibraries.put("IMG", ""); + try { + HotspotDefModel hotspotDefModel = new HotspotDefDao().queryById(dimensionModel.getHotspotDefId()); + DCContext dcContext = new DCContext(getContext(), SDK.getDCAPI().getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_HOTSPOT), KMSConstant.APP_ID, "grouphotspot", "filehotspot", hotspotDefModel.getHotspotName()); + UtilFile posFile = new UtilFile(dcContext.getFilePath()); + if (!posFile.exists()) { + throw new AWSException(I18nRes.findValue(getContext().getLanguage(), "知识地图文件[") + hotspotDefModel.getHotspotName() + I18nRes.findValue(getContext().getLanguage(), "]不存在")); + } + + PosReader reader = new PosReader(); + Document doc = reader.read(posFile.readStr(StandardCharsets.UTF_8.name())); + macroLibraries.put("IMG", getDiv(doc, hotspotDefModel.getHotspotName())); + } catch (AWSException e) { + throw e; + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException("知识地图生成中出现错误,请确认文件格式和版本是否正确"); + } + + macroLibraries.put("sessionId", getContext().getSessionId()); + macroLibraries.put("sid", getSIDFlag()); + macroLibraries.put("uid", getContext().getUID()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.hotspot_home.htm", macroLibraries); + } + + /** + * 打开绑定知识地图的页面 + * + * @param dimensionId 需要绑定到知识地图shape上的维度ID + * @param hotDimensionId 维度类型为知识地图的维度ID + * @return + * @author wangshibao + */ + public String getBindHotspot(String dimensionId) { + + Map macroLibraries = new HashMap(); + macroLibraries.put("IMG", ""); + try { + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + + macroLibraries.put("hotspotDefId", dimensionModel.getHotspotDefId()); + HotspotDefModel hotspotDefModel = new HotspotDefDao().queryById(dimensionModel.getHotspotDefId()); + DCContext dcContext = new DCContext(getContext(), SDK.getDCAPI().getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_HOTSPOT), KMSConstant.APP_ID, "grouphotspot", "filehotspot", hotspotDefModel.getHotspotName()); + UtilFile posFile = new UtilFile(dcContext.getFilePath()); + if (!posFile.exists()) { + throw new AWSException(I18nRes.findValue(getContext().getLanguage(), "知识地图文件[") + hotspotDefModel.getHotspotName() + I18nRes.findValue(getContext().getLanguage(), "]不存在")); + } + + PosReader reader = new PosReader(); + Document doc = reader.read(posFile.readStr(StandardCharsets.UTF_8.name())); + macroLibraries.put("IMG", getBindingDiv(doc, hotspotDefModel.getHotspotName())); + } catch (AWSException e) { + throw e; + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException("知识地图生成中出现错误,请确认文件格式和版本是否正确"); + } + macroLibraries.put("sessionId", getContext().getSessionId()); + macroLibraries.put("dimensionId", dimensionId); + macroLibraries.put("dimensionName", DimensionCache.getCache().get(dimensionId).getDimensionName()); + macroLibraries.put("sid", getSIDFlag()); + return HtmlPageTemplate.merge(KMSConstant.APP_ID, "com.actionsoft.apps.kms.hotspot_binding.htm", macroLibraries); + } + + /** + * 访问-获取shape对应的div + * + * @param doc + * @param schemaFile + * @return + * @author wangshibao + */ + private String getDiv(Document doc, String schemaFile) { + DiagramImage img = doc.getDiagram().getImage(); + StringBuilder sb = new StringBuilder(); + sb.append("
"); + // 以shape的ID为键的map + Map shapes = doc.getShapes(); + // 循环获取热区 + Iterator shapeIdIterator = shapes.keySet().iterator(); + boolean isKnwlMgr = KMSUtil.isKnwlManager(getContext().getUID()); + while (shapeIdIterator.hasNext()) { + String shapeId = shapeIdIterator.next(); + Shape shape = shapes.get(shapeId); + getShapeHotspot(sb, shape, img, shapeId, isKnwlMgr); + } + sb.append("
"); + return sb.toString(); + } + + /** + * 绑定-获取shape对应的div + * + * @param doc + * @param schemaFile + * @return + * @author wangshibao + */ + private String getBindingDiv(Document doc, String schemaFile) { + DiagramImage img = doc.getDiagram().getImage(); + StringBuilder sb = new StringBuilder(); + sb.append("
"); + // 以shape的ID为键的map + Map shapes = doc.getShapes(); + // 循环获取热区 + Iterator shapeIdIterator = shapes.keySet().iterator(); + while (shapeIdIterator.hasNext()) { + String shapeId = shapeIdIterator.next(); + Shape shape = shapes.get(shapeId); + getBindingShapeHotspot(sb, shape, img, shapeId); + } + sb.append("
"); + return sb.toString(); + } + + /** + * 获取图片的URL + * + * @param schemaFile + * @param pngdata + * @return + * @author wangshibao + */ + public String getImgURL(String schemaFile, String pngdata) { + String targetDir = AWSServerConf.getProperty("dc.path") + File.separator + KMSConstant.APP_ID + File.separator + "tmp/grouppos/filepng/"; + String pngName = schemaFile.substring(0, schemaFile.lastIndexOf('.')) + ".png"; + String targetFilePath = targetDir + pngName; + try { + UtilFile targetFile = new UtilFile(targetFilePath); + if (!targetFile.getParentFile().exists()) { + targetFile.getParentFile().mkdirs(); + } + + targetFile.write(new BASE64Decoder().decodeBuffer(pngdata), false); + + DCPluginProfile dcPluginProfile = SDK.getDCAPI().getDCProfile(KMSConstant.APP_ID, "tmp"); + DCContext dcContext = new DCContext(super.getContext(), dcPluginProfile, KMSConstant.APP_ID, "grouppos", "filepng", pngName); + return dcContext.getDownloadURL(); + + } catch (Exception e) { + e.printStackTrace(); + throw new AWSException("获取知识地图失败:" + e.getMessage()); + } + } + + /** + * 获取图形中的热区 + * + * @param shape + */ + private void getShapeHotspot(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, boolean isKnwlMgr) { + try { + HotspotService hotspotService = new HotspotService(); + HotspotModel hotspotModel = hotspotService.getHotspotByShapeId(shapeId); + + String tips = ""; + if (hotspotModel == null) { + tips = "未绑定资源"; + getNoPermShapeDiv(sb, shape, img, tips); + } else { + if (hotspotModel.getBindType() == 1) {// 绑定维度 + DimensionModel dimensionModel = DimensionCache.getCache().get(hotspotModel.getDimensionId()); + if (dimensionModel == null) { + tips = "未绑定资源"; + getNoPermShapeDiv(sb, shape, img, tips); + } else { + if (dimensionModel.getIsEnabled() == 0) { + tips = "当前知识地图绑定的知识分类被禁用"; + getNoPermShapeDiv(sb, shape, img, tips); + } else { + boolean canAccessDimension = isKnwlMgr || KMSUtil.canAccessDimension(dimensionModel.getId(), getContext().getUID()); + if (canAccessDimension) { + getShapeDiv(sb, shape, img, shapeId, tips, dimensionModel); + } else { + tips = "您无权访问当前知识分类"; + getNoPermShapeDiv(sb, shape, img, tips); + } + } + } + } else if (hotspotModel.getBindType() == 0) {// 绑定链接 + getLinkDiv(sb, shape, img, shapeId, tips, hotspotModel); + } else if (hotspotModel.getBindType() == 2) {// 绑定知识 + CardModel cardModel = CardCache.getCache().get(hotspotModel.getDimensionId()); + if (cardModel == null) { + tips = "未绑定资源"; + getNoPermShapeDiv(sb, shape, img, tips); + } else { + boolean canAccessKnwl = KMSUtil.canAccessKnwl(cardModel.getId(), getContext().getUID(), isKnwlMgr); + if (canAccessKnwl) { + getCardShapeDiv(sb, shape, img, shapeId, tips, cardModel); + } else { + tips = "您无权访问当前知识"; + getNoPermShapeDiv(sb, shape, img, tips); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取单个图形的div信息 + * + * @param dimensionId + * @param shapeId + * @return + * @author wangshibao + */ + public String getAsyncBindingShapeHotspot(String dimensionId, String shapeId) { + try { + DimensionModel dimensionModel = DimensionCache.getCache().get(dimensionId); + + HotspotDefModel hotspotDefModel = new HotspotDefDao().queryById(dimensionModel.getHotspotDefId()); + DCContext dcContext = new DCContext(getContext(), SDK.getDCAPI().getDCProfile(KMSConstant.APP_ID, KMSConstant.DOC_REPOSITORY_HOTSPOT), KMSConstant.APP_ID, "grouphotspot", "filehotspot", hotspotDefModel.getHotspotName()); + UtilFile posFile = new UtilFile(dcContext.getFilePath()); + if (!posFile.exists()) { + throw new AWSException(I18nRes.findValue(getContext().getLanguage(), "知识地图文件[") + hotspotDefModel.getHotspotName() + I18nRes.findValue(getContext().getLanguage(), "]不存在")); + } + + PosReader reader = new PosReader(); + Document doc = reader.read(posFile.readStr(StandardCharsets.UTF_8.name())); + + DiagramImage img = doc.getDiagram().getImage(); + StringBuilder sb = new StringBuilder(); + // 以shape的ID为键的map + Map shapes = doc.getShapes(); + Shape shape = shapes.get(shapeId); + getBindingShapeHotspot(sb, shape, img, shapeId); + return ResponseObject.newOkResponse().msg(sb.toString()).toString(); + } catch (Exception e) { + e.printStackTrace(); + return ResponseObject.newErrResponse().msg(e.getMessage()).toString(); + } + + } + + /** + * 获取图形中的热区 + * + * @param shape + */ + private void getBindingShapeHotspot(StringBuilder sb, Shape shape, DiagramImage img, String shapeId) { + try { + HotspotService hotspotService = new HotspotService(); + HotspotModel hotspotModel = hotspotService.getHotspotByShapeId(shapeId); + + String tips = ""; + if (hotspotModel == null) { + tips = "未绑定资源"; + getBindingNoPermShapeDiv(sb, shape, img, shapeId, tips); + } else { + if (hotspotModel.getBindType() == 1) {// 绑定维度 + DimensionModel dimensionModel = DimensionCache.getCache().get(hotspotModel.getDimensionId()); + if (dimensionModel == null) { + tips = "未绑定资源"; + getBindingNoPermShapeDiv(sb, shape, img, shapeId, tips); + } else { + // if (dimensionModel.getIsEnabled() == 0) { + // tips = "当前知识地图绑定的知识分类被禁用"; + // getNoPermShapeDiv(sb, shape, img, tips); + // } else { + // boolean isDimensionMgr = KMSUtil.isDimensionManager(dimensionModel.getId(), getContext().getUID()); + // if (isDimensionMgr) { + getBindingShapeDiv(sb, shape, img, shapeId, tips, dimensionModel, hotspotModel); + // } else { + // tips = "您无权访问当前知识分类"; + // getNoPermShapeDiv(sb, shape, img, tips); + // } + // } + } + } else if (hotspotModel.getBindType() == 0) {// 绑定链接 + getBindingLinkDiv(sb, shape, img, shapeId, tips, hotspotModel); + } else if (hotspotModel.getBindType() == 2) {// 绑定知识 + CardModel cardModel = CardCache.getCache().get(hotspotModel.getDimensionId()); + if (cardModel == null) { + tips = "未绑定资源"; + getBindingNoPermShapeDiv(sb, shape, img, shapeId, tips); + } else { + // tips = getCardTips(dimensionModel.getId(), dimensionModel.getDimensionName()); + getBindingCardShapeDiv(sb, shape, img, shapeId, tips, cardModel, hotspotModel); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 无权访问shape对应的维度 + * + * @param sb + * @param shape + * @param img + * @param tips + * @author wangshibao + */ + private void getNoPermShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String tips) { + sb.append("
"); + } + + /** + * 访问shape对应的维度 + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, DimensionModel model) { + JSONObject popJO = new JSONObject(); + popJO.put("title", model.getDimensionName()); + popJO.put("content", tips); + sb.append("
"); + } + + /** + * 访问shape对应的维度 + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getCardShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, CardModel model) { + JSONObject popJO = new JSONObject(); + popJO.put("title", model.getCardName()); + popJO.put("content", tips); + sb.append("
"); + } + + /** + * 无权绑定div + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @author wangshibao + */ + private void getBindingNoPermShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips) { + sb.append("
"); + } + + /** + * 绑定知识地图-获取shape对应的div + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getBindingShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, DimensionModel model, HotspotModel hotspotModel) { + JSONObject popJO = new JSONObject(); + popJO.put("title", "维度:" + model.getDimensionName()); + popJO.put("content", tips); + sb.append("
" + "
"); + } + + /** + * 绑定知识地图-获取shape对应的div + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getBindingCardShapeDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, CardModel model, HotspotModel hotspotModel) { + JSONObject popJO = new JSONObject(); + popJO.put("title", "知识:" + model.getCardName()); + popJO.put("content", tips); + sb.append("
" + + "
"); + } + + /** + * 绑定知识地图-获取shape对应的div + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getBindingLinkDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, HotspotModel hotspotModel) { + JSONObject popJO = new JSONObject(); + popJO.put("title", hotspotModel.getLinkURL()); + popJO.put("content", tips); + String linkURL = ""; + String target = ""; + try { + linkURL = URLEncoder.encode(hotspotModel.getLinkURL(), StandardCharsets.UTF_8.name()); + target = URLEncoder.encode(hotspotModel.getTarget(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append("
" + + "
"); + } + + /** + * 绑定知识地图-获取shape对应的div + * + * @param sb + * @param shape + * @param img + * @param shapeId + * @param tips + * @param model + * @author wangshibao + */ + private void getLinkDiv(StringBuilder sb, Shape shape, DiagramImage img, String shapeId, String tips, HotspotModel hotspotModel) { + // JSONObject popJO = new JSONObject(); + // popJO.put("content", tips); + String linkURL = hotspotModel.getLinkURL(); + String target = ""; + try { + linkURL = SDK.getRuleAPI().executeAtScript(linkURL, getContext()); + // popJO.put("title", linkURL); + linkURL = URLEncoder.encode(linkURL, StandardCharsets.UTF_8.name()); + target = URLEncoder.encode(hotspotModel.getTarget(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + // popContent='" + popJO.toString() + "' + sb.append("
" + "
"); + } + + /** + * 绑定维度ID和知识地图的图形ID + * + * @param dimensionId + * @param shapeId + * @return + * @author wangshibao + */ + public String bindHotspot(String dimensionId, String shapeId, String hotspotDefId) { + ResponseObject responseObject = null; + HotspotService hotspotService = new HotspotService(); + boolean result = hotspotService.bindHotspot(dimensionId, shapeId, hotspotDefId); + if (result) { + responseObject = ResponseObject.newOkResponse().msg("绑定成功"); + } else { + responseObject = ResponseObject.newErrResponse("绑定失败,请联系管理员"); + } + return responseObject.toString(); + } + + /** + * 绑定知识ID和知识地图的图形ID + * + * @param dimensionId + * @param shapeId + * @return + * @author wangshibao + */ + public String bindHotspotCard(String cardId, String shapeId, String hotspotDefId) { + ResponseObject responseObject = null; + HotspotService hotspotService = new HotspotService(); + boolean result = hotspotService.bindHotspotCard(cardId, shapeId, hotspotDefId); + if (result) { + responseObject = ResponseObject.newOkResponse().msg("绑定成功"); + } else { + responseObject = ResponseObject.newErrResponse("绑定失败,请联系管理员"); + } + return responseObject.toString(); + } + + /** + * 绑定URL和知识地图的图形ID + * + * @param linkURL + * @param shapeId + * @return + * @author wangshibao + */ + public String bindHotspotLinkURL(String linkURL, String target, String shapeId, String hotspotDefId) { + try { + linkURL = URLDecoder.decode(linkURL, StandardCharsets.UTF_8.name()); + target = URLDecoder.decode(target, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ResponseObject responseObject = null; + HotspotService hotspotService = new HotspotService(); + boolean result = hotspotService.bindHotspotLinkURL(linkURL, target, shapeId, hotspotDefId); + if (result) { + responseObject = ResponseObject.newOkResponse().msg("绑定成功"); + } else { + responseObject = ResponseObject.newErrResponse("绑定失败,请联系管理员"); + } + return responseObject.toString(); + } + + /** + * 删除绑定 + * + * @param hotspotId + * @return + * @author wangshibao + */ + public String deleteHotspot(String hotspotId) { + HotspotService hotspotService = new HotspotService(); + boolean result = hotspotService.deleteHotspot(hotspotId); + if (result) { + return ResponseObject.newOkResponse().msg("删除绑定成功").toString(); + } else { + return ResponseObject.newErrResponse().msg("删除绑定失败").toString(); + } + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/PosReader.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/PosReader.java new file mode 100644 index 00000000..0ff25dca --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/PosReader.java @@ -0,0 +1,124 @@ +package com.actionsoft.apps.processon.posreader; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import com.actionsoft.apps.processon.posreader.exception.PosParseException; +import com.actionsoft.apps.processon.posreader.model.Document; +import com.actionsoft.apps.processon.posreader.model.diagram.Diagram; +import com.actionsoft.apps.processon.posreader.model.diagram.DiagramImage; +import com.actionsoft.apps.processon.posreader.model.diagram.Elements; +import com.actionsoft.apps.processon.posreader.model.diagram.InnerElements; +import com.actionsoft.apps.processon.posreader.model.diagram.Shape; +import com.actionsoft.apps.processon.posreader.model.diagram.ShapeProperty; +import com.actionsoft.apps.processon.posreader.model.meta.Meta; +import com.alibaba.fastjson.JSONObject; + +/** + * POS文件阅读器 + * + * @author wx + * + */ +public class PosReader { + + /** + * 读取POS文件 + * + * @return POS文件定义对象 + * @throws PosParseException + */ + public Document read(File posFile) throws PosParseException { + StringBuffer defineBuffer = new StringBuffer(); + Document doc = null; + try { + FileReader reader = new FileReader(posFile); + BufferedReader br = new BufferedReader(reader); + String line = null; + while ((line = br.readLine()) != null) { + defineBuffer.append(line); + } + doc = constructDocument(defineBuffer.toString()); + reader.close(); + br.close(); + } catch (IOException e) { + throw new PosParseException("Can't parse pos definition.", e); + } + return doc; + } + + /** + * 读取POS格式字符串 + * + * @return POS文件定义对象 + * @throws PosParseException + */ + public Document read(String posFileDefine) throws PosParseException { + Document doc = null; + try { + doc = constructDocument(posFileDefine); + } catch (Exception e) { + throw new PosParseException("Can't parse pos definition.", e); + } + return doc; + } + + /** + * 构造Document对象 + * + * @param jsonStr + * @return + */ + private Document constructDocument(String jsonStr) { + JSONObject obj = JSONObject.parseObject(jsonStr); + + Document doc = new Document(); + + String metaId = obj.getJSONObject("meta").getString("id"); + Meta meta = new Meta(); + meta.setId(metaId); + doc.setMeta(meta); + + Diagram diagram = new Diagram(); + doc.setDiagram(diagram); + + DiagramImage image = (DiagramImage) JSONObject.toJavaObject(obj.getJSONObject("diagram").getJSONObject("image"), DiagramImage.class); + diagram.setImage(image); + + Elements elements = new Elements(); + diagram.setElements(elements); + + InnerElements innerElements = new InnerElements(); + elements.setElements(innerElements); + + JSONObject elementsJO = obj.getJSONObject("diagram").getJSONObject("elements").getJSONObject("elements"); + // if (elementsJO.isNullObject()) {// processon存在单层elements的文件 bug:32715 + // elementsJO = obj.getJSONObject("diagram").getJSONObject("elements"); + // } + Map shapes = new HashMap(); + for (String key : elementsJO.keySet()) { + JSONObject element = elementsJO.getJSONObject(key); + if (element.containsKey("shapeStyle")) {// 包含着shapeStyle的为shape(区分linkner) + Shape shape = new Shape(); + shape.setTitle(element.getJSONArray("textBlock").isEmpty() ? "" : element.getJSONArray("textBlock").getJSONObject(0).getString("text")); + ShapeProperty shapeProperty = new ShapeProperty(); + JSONObject propsJO = element.getJSONObject("props"); + shapeProperty.setAngle(propsJO.getDouble("angle")); + shapeProperty.setH(propsJO.getDouble("h")); + shapeProperty.setW(propsJO.getDouble("w")); + shapeProperty.setX(propsJO.getDouble("x")); + shapeProperty.setY(propsJO.getDouble("y")); + shapeProperty.setZindex(propsJO.getIntValue("zindex")); + shape.setProps(shapeProperty); + shapes.put(element.getString("id"), shape); + } + } + innerElements.setShapes(shapes); + + return doc; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/exception/PosParseException.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/exception/PosParseException.java new file mode 100644 index 00000000..a2dcc268 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/exception/PosParseException.java @@ -0,0 +1,29 @@ +package com.actionsoft.apps.processon.posreader.exception; + +/** + * Pos文件解析异常 + * + * @author wx + * + */ +public class PosParseException extends Exception { + + private static final long serialVersionUID = 1L; + + public PosParseException() { + super(); + } + + public PosParseException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + public PosParseException(String arg0) { + super(arg0); + } + + public PosParseException(Throwable arg0) { + super(arg0); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/Document.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/Document.java new file mode 100644 index 00000000..60bc36b3 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/Document.java @@ -0,0 +1,45 @@ +package com.actionsoft.apps.processon.posreader.model; + +import java.util.Map; + +import com.actionsoft.apps.processon.posreader.model.diagram.Diagram; +import com.actionsoft.apps.processon.posreader.model.diagram.Shape; +import com.actionsoft.apps.processon.posreader.model.meta.Meta; + +/** + * POS文件定义对象 + * + * @author wangshibao + * + */ +public class Document { + + private Diagram diagram;// POS图形结构定义对象 + private Meta meta; + + public Diagram getDiagram() { + return diagram; + } + + public void setDiagram(Diagram diagram) { + this.diagram = diagram; + } + + public Meta getMeta() { + return meta; + } + + public void setMeta(Meta meta) { + this.meta = meta; + } + + /** + * 获取图形Map + * + * @return Map + */ + public Map getShapes() { + return diagram.getElements().getElements().getShapes(); + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Diagram.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Diagram.java new file mode 100644 index 00000000..fd4eb0dd --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Diagram.java @@ -0,0 +1,23 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +public class Diagram { + + private DiagramImage image; + private Elements elements; + + public DiagramImage getImage() { + return image; + } + + public void setImage(DiagramImage image) { + this.image = image; + } + + public Elements getElements() { + return elements; + } + + public void setElements(Elements elements) { + this.elements = elements; + } +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/DiagramImage.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/DiagramImage.java new file mode 100644 index 00000000..35c8cc38 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/DiagramImage.java @@ -0,0 +1,51 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +public class DiagramImage { + + private double x; + private double y; + private double width; + private double height; + private String pngdata; + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getWidth() { + return width; + } + + public void setWidth(double width) { + this.width = width; + } + + public double getHeight() { + return height; + } + + public void setHeight(double height) { + this.height = height; + } + + public String getPngdata() { + return pngdata; + } + + public void setPngdata(String pngdata) { + this.pngdata = pngdata; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Elements.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Elements.java new file mode 100644 index 00000000..c186ad08 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Elements.java @@ -0,0 +1,15 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +public class Elements { + + private InnerElements elements; + + public InnerElements getElements() { + return elements; + } + + public void setElements(InnerElements elements) { + this.elements = elements; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/InnerElements.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/InnerElements.java new file mode 100644 index 00000000..2f13e6bc --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/InnerElements.java @@ -0,0 +1,17 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +import java.util.Map; + +public class InnerElements { + + private Map shapes; + + public Map getShapes() { + return shapes; + } + + public void setShapes(Map shapes) { + this.shapes = shapes; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Shape.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Shape.java new file mode 100644 index 00000000..2a2de856 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/Shape.java @@ -0,0 +1,71 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +import java.util.List; + +public class Shape { + + private String title; + private String name; + private String link; + private List inLinkers; + private List outLinkers; + private ShapeProperty props; + private String group; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getInLinkers() { + return inLinkers; + } + + public void setInLinkers(List inLinkers) { + this.inLinkers = inLinkers; + } + + public List getOutLinkers() { + return outLinkers; + } + + public void setOutLinkers(List outLinkers) { + this.outLinkers = outLinkers; + } + + public ShapeProperty getProps() { + return props; + } + + public void setProps(ShapeProperty props) { + this.props = props; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/ShapeProperty.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/ShapeProperty.java new file mode 100644 index 00000000..4c9a7f8d --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/diagram/ShapeProperty.java @@ -0,0 +1,60 @@ +package com.actionsoft.apps.processon.posreader.model.diagram; + +public class ShapeProperty { + + private double x; + private double y; + private double w; + private double h; + private int zindex; + private double angle; + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getW() { + return w; + } + + public void setW(double w) { + this.w = w; + } + + public double getH() { + return h; + } + + public void setH(double h) { + this.h = h; + } + + public int getZindex() { + return zindex; + } + + public void setZindex(int zindex) { + this.zindex = zindex; + } + + public double getAngle() { + return angle; + } + + public void setAngle(double angle) { + this.angle = angle; + } + +} diff --git a/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/meta/Meta.java b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/meta/Meta.java new file mode 100644 index 00000000..9fe8abc5 --- /dev/null +++ b/com.actionsoft.apps.kms/src/com/actionsoft/apps/processon/posreader/model/meta/Meta.java @@ -0,0 +1,14 @@ +package com.actionsoft.apps.processon.posreader.model.meta; + +public class Meta { + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +}